• 软件工程课后作业一之30道随机四则运算程序2


    一、设计30道随机四则运算程序要求:
    1、题目避免重复;
    2、可定制(数量/打印方式);
    3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;

    二、设计思路:
    1.题目避免重复
    我用3个数组将第一个数,第二个数和运算符(已用数字0-3表示加减乘除)存起来,之后用for循环将新产生的数组单元与以前产生的数组单元一一比较,有重复则将当前参数自减一重新产生新数组单元如此反复循环即可;
    2.可定制(数量/打印方式)
    我用for循环结构可定制数量,在输出算式时用 来显示打印方式;
    3.可以控制以下参数:
    a.是否有乘除法:用一个参数控制,当其为1时表示有乘除,0则表示没有
    b.数值范围:借用函数rand()%rage即可,rage为最大数范围
    c.加减有无负数:与是否有乘除法一样用一个参数控制,当其为1时表示结果有负数,0则表示没有
    d.除法有无余数:与是否有乘除法一样用一个参数控制,当其为1时表示结果有余数,0则表示没有
    三、缺陷及遇到的问题总结:
    在控制参数方面没有做到题目要求的全部控制实现,比如有无括号,是否支持小数分数及打印中每行的间隔可调整,还有就是当有余数时打印格式不能整齐美观,可看截图显示

    #include<iostream.h>
    #include<stdlib.h>
    #include<time.h>
    void display(int number,int column,int mul,int rage,int neg,int remainder)//先自定义输出函数
    {
    	int first[1000],second[1000],opt[1000];//分别代表第一个数、第二数和运算符
    	for(int i=0;i<number;i++)//随机两个生成运算操作数
    	{  
    	    int m=1;//避免题目重复并初始化
    		first[i]=rand()%rage;//随机产生第一个数
    		second[i]=rand()%rage;//随机产生第二个数
    		if(mul==0)//没有乘除法
    		{	
    			opt[i]=rand()%2;//随机生成0~1的数字,分别表示加减
    		}
    		if(mul==1)
    		{
    			opt[i]=rand()%4;//随机生成0~3的数字,分别表示加减乘除
    		}
    		for(int j=0;j<i;j++)
    		{
    			if(first[j]==first[i]&&second[j]==second[i]&&opt[j]==opt[i])//比较新产生的算式与原来的是否重复
    			{
    				i=i-1;
    				m=0;
    			}
    		}
    		while(m)//若算式都不重复则输出
    		{
    			switch(opt[i])
    			{
    			case 0:
    				cout<<first[i]<<"+"<<second[i]<<"=";break;
    			case 1:
    				if(neg==0)//0表示减法结果不允许出现负数,1表示允许出现负数
    				{
    					int temp;//中间变量
    					if(first[i]<second[i])
    					{
    						temp=first[i];
    						first[i]=second[i];
    						second[i]=temp;
    					}
    					cout<<first[i]<<"-"<<second[i]<<"=";break;
    				}
    				else
    				{
    					cout<<first[i]<<"-"<<second[i]<<"=";break;
    				}
    			case 2:
    				cout<<first[i]<<"*"<<second[i]<<"=";break;
    			case 3:
    				if(second[i]==0)//避免分母为零的处理
    				{   
    					i=i-1;break;
    				}
    				else
    				{
    					if(remainder==0)//0表示除法不允许余数
    				{
    					if(first[i]%second[i]==0)
    					{
    						cout<<first[i]<<"/"<<second[i]<<"=";break;
    					}
    					else
    					{
    						i=i-1;break;
    					}
    				}
    				else if(remainder==1)//1表示除法允许有余数
    				{
    					if(first[i]%second[i]!=0)
    					{
    						cout<<first[i]<<"/"<<second[i]<<"=";break;
    					}
    					else
    					{
    						i=i-1;break;
    					}
    				}
    				}
    			}
    			if((i+1)%column==0)
    			{
    				cout<<endl;
    			}
    			else
    			{
    				cout<<"	";
    			}
    			break;//跳出循环
    		}
    	}
    }
    void main()
    {
    	srand((unsigned) time(NULL));//初始化随机数发生器,使得每次运行生成的随机数不同
    	int number;//定制题目数量
    	int column;//控制输出的列数
    	int mul;//是否需要乘除法
    	int rage;//控制数值范围
    	int neg;//控制减法结果是否允许有负数
    	int remainder;//控制除法是否允许有余数
    	cout<<"请输入要打印的题目数量:";
    	cin>>number;
    	cout<<endl;
    	cout<<"请输入要输出的列数(1-10):";
    	cin>>column;
    	cout<<endl;
        cout<<"请输入正整数的数值范围(即最大数):";
    	cin>>rage;
    	cout<<endl;
    	cout<<"是否有乘除法(0表示没有;1表示有):";
    	cin>>mul;
    	cout<<endl;
    	if(mul==1)//有乘除法时继续选择是否除法有无余数,否则没必要选择除法有无余数
    	{
    		cout<<"除法有无余数(0表示没有;1表示有):";
    	    cin>>remainder;
    	}
    	else
    	{
    		remainder=1;
    	}
    	cout<<endl;
    	cout<<"减法有无负数(0表示没有;1表示有):";
    	cin>>neg;
    	cout<<endl;
    	display(number,column,mul,rage,neg,remainder);//调用函数
    }
    

      四、各种情况相应截图如下:

     五、日志表
  • 相关阅读:
    ##MySql数据库表的操作与应用
    ##如何根据一个端口号,建立BS架构,在网页中打开我们要想的网站
    ##MySql数据库的增删改查方法
    ##MySql数据库的环境配置
    ##安装MySql数据库并解决如果安装出错卸载的注意事项
    ##什么是MySql数据库?它的基本用法
    ##网络编程的优化:如何利用线程优化服务端和客户端
    #XML
    ##如何在IDea中创建一个mxl文件模板
    Java多层嵌套异常处理的基本流程
  • 原文地址:https://www.cnblogs.com/2015tan/p/4337877.html
Copyright © 2020-2023  润新知