四则运算2
一、要求:
1、题目避免重复;
2、可定制(数量、打印方式);
3、可以控制下列参数:
(1)是否有乘除法;
(2)是否有括号(最多可以支持十个数参与计算);
(3)数值范围;
(4)加减有无负数;
(5)除法有无余
二、设计思路
1、为了避免题目重复,定义了三个数组用来分别存放第一,二个数和符号,用if条件语句判断是否重复
2、定义变量number,在for循环中设定循环次数
3、(1)switch语句来实现是否有乘除法。“+”“-”“*”“/”,分别用0,1,2,3来代替,if语句来判断进入“+”“-”和“+”“-”“*”“/”
(2)带有多组括号的功能没有实现,
(3)数值范围根据随机数求余数,实现它的数值范围t=rand()%range
(4)加减法中有无结果有无负数,通过if语句中两个数比较大小,执行是否有负数生成
(5)首先避免分母为0,再用if结构来判断进入有无余数环节
三、实验代码
1 //四则运算2 2 #include<iostream> 3 using namespace std; 4 #include<stdlib.h> 5 #include<time.h> 6 void display(int number,int column,int mul,int range,int neg,int remainder)//先自定义输出函数 7 { 8 int first[1000],second[1000],opt[1000];//分别代表第一个数、第二数和运算符 9 for(int i=0;i<number;i++)//随机两个生成运算操作数 10 { 11 int m=1;//避免题目重复并初始化 12 first[i]=rand()%range;//随机产生第一个数 13 second[i]=rand()%range;//随机产生第二个数 14 if(mul==0)//没有乘除法 15 { 16 opt[i]=rand()%2;//随机生成0~1的数字,分别表示加减 17 } 18 if(mul==1) 19 { 20 opt[i]=rand()%4;//随机生成0~3的数字,分别表示加减乘除 21 } 22 for(int j=0;j<i;j++) 23 { 24 if(first[j]==first[i]&&second[j]==second[i]&&opt[j]==opt[i])//比较新产生的算式与原来的是否重复 25 { 26 i=i-1; 27 m=0; 28 } 29 } 30 while(m)//若算式都不重复则输出 31 { 32 switch(opt[i]) 33 { 34 case 0: 35 cout<<first[i]<<"+"<<second[i]<<"=";break; 36 case 1: 37 if(neg==0)//0表示减法结果不允许出现负数,1表示允许出现负数 38 { 39 int temp;//中间变量 40 if(first[i]<second[i]) 41 { 42 temp=first[i]; 43 first[i]=second[i]; 44 second[i]=temp; 45 } 46 cout<<first[i]<<"-"<<second[i]<<"=";break; 47 } 48 else 49 { 50 cout<<first[i]<<"-"<<second[i]<<"=";break; 51 } 52 case 2: 53 cout<<first[i]<<"*"<<second[i]<<"=";break; 54 case 3: 55 if(second[i]==0)//避免分母为零的处理 56 { 57 i=i-1;break; 58 } 59 else 60 { 61 if(remainder==0)//0表示除法不允许余数 62 { 63 if(first[i]%second[i]==0) 64 { 65 cout<<first[i]<<"/"<<second[i]<<"=";break; 66 } 67 else 68 { 69 i=i-1;break; 70 } 71 } 72 else if(remainder==1)//1表示除法允许有余数 73 { 74 if(first[i]%second[i]!=0) 75 { 76 cout<<first[i]<<"/"<<second[i]<<"=";break; 77 } 78 else 79 { 80 i=i-1;break; 81 } 82 } 83 } 84 } 85 if((i+1)%column==0) 86 { 87 cout<<endl; 88 } 89 else 90 { 91 cout<<"\t"; 92 } 93 break;//跳出循环 94 } 95 } 96 } 97 void main() 98 { 99 srand((unsigned) time(NULL));//初始化随机数发生器,使得每次运行生成的随机数不同 100 int number;//定制题目数量 101 int column;//控制输出的列数 102 int mul;//是否需要乘除法 103 int range;//控制数值范围 104 int neg;//控制减法结果是否允许有负数 105 int remainder;//控制除法是否允许有余数 106 cout<<"请输入要打印的题目数量:"; 107 cin>>number; 108 cout<<endl; 109 cout<<"请输入要输出的列数(1-10):"; 110 cin>>column; 111 cout<<endl; 112 cout<<"请输入正整数的数值范围(即最大数):"; 113 cin>>range; 114 cout<<endl; 115 cout<<"是否有乘除法(0表示没有;1表示有):"; 116 cin>>mul; 117 cout<<endl; 118 if(mul==1)//有乘除法时继续选择是否除法有无余数,否则没必要选择除法有无余数 119 { 120 cout<<"除法有无余数(0表示没有;1表示有):"; 121 cin>>remainder; 122 } 123 else 124 { 125 remainder=1; 126 } 127 cout<<endl; 128 cout<<"加减有无负数(0表示没有;1表示有):"; 129 cin>>neg; 130 cout<<endl; 131 display(number,column,mul,range,neg,remainder);//调用函数 132 }
四、测试结果
五、项目计划日志
周活动总结表
日期/任务 | 听课 | 编写程序 | 阅读课本 | 准备考试 | 日总计 |
周一 | 100 | 30 | 30 | 160 | |
周二 | 60 | 60 | |||
周三 | 30 | 60 | 90 | ||
周四 | 100 | 30 | 130 | ||
周五 | 30 | 30 | |||
周六 | 300 | 100 | 400 | ||
周天 | |||||
总结 | 200 | 450 | 220 | 870 |
六、时间记录表:
学生 景* 日期 2016年3月12日
教师 王** 课程 软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3.7 |
16:30 |
17:00 |
无 |
30 |
看书 |
构建之法 |
3.8 |
20:00 |
21:00 |
无 |
60 |
编写程序 |
复习C++ |
3.9 |
19:30 |
21:00 |
无 |
120 |
复习,程序 |
作业 |
3.10 |
21:15 |
21:45 |
无 |
30 |
看书 |
代码之殇 |
3.11 |
22:10 |
22:40 |
无 |
30 |
编写程序 |
作业 |
3.12 |
9:00 |
17:00 |
120 |
360 |
编程 |
作业 |
陷记录日志
日期 | 编号 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3.8 | 1 | 编码 | 编译 | 10 | 随机循环,除法有无余数,适应的输出 |
3.11 | 2 | 编码 | 编译 | 20 | 打印方式,不能从文件打出,设定列数,有时会错位 |
3.12 | 3 | 编码 | 编译 | 60 | 括号功能未实现 |
七、实验总结
这次编程,实在是难受。以前的程序想着简单些,编写困难,这次的程序想着都难,几乎无从下手,平时不编程,现在知道困难了。想起一句话:出来混迟早是要还的。真的,自己实在是差劲,很多情况下对for循环的三层嵌套都弄不清楚,今天用到的最多的就是if语句,很受挫败。即使如此,还有很多功能没有实现,比如括号的功能,负数的功能,还有这只是两个数字的,还未实现多个数字的四则运算。革命尚未成功还需继续努力。