一、题目及题目要求
编程随机生成四则运算,算数包括整数和真分数
1.题目避免重复
2.可定制(数量/打印方式)
3.可以控制下列参数:
是否有乘除法;
是否有括号(最多可以支持十个数参与运算);
数值范围;
加减有无负数;
除法有无余数。
二、设计思路
在上次程序的基础上进行修改,
1.题目避免重复:为避免随机数每次相同用了srand函数。
2.可定制出题数量:通过键盘输入数字,在for循环中控制循环次数。
3. 是否有乘除法:把算符分为两大类,利用case语句选择前四种加和减,后四种乘除。
4. 数值范围:在产生随机数时通过输入控制rand函数的参数,从而使运算数不超过此范围。
5. 加减有无负号:结果无负数,判断两操作数,第一操作数若比第二操作数小,则第二个减第一个。
6.除法有无余数:除法无余数,判断第一操作数模第二操作数的结果,若为0即可输出,否则再循环一次。
三、代码
1 /*2016.3.12.WeiLiHua四则运算*/ 2 #include<iostream> 3 #include<ctime> 4 using namespace std; 5 void main() 6 { 7 int sj1,sj2,sf=1,sj3,sj4,r;//定义随机数及算符 8 int Num;//题的数量 9 char sfchose;//算符选择 10 char yschose;//余数选择 11 char jf;//减法结果选择 12 int qznum;//取值范围 13 srand((unsigned)time(NULL)); //srand函数是以现在系统时间作为时间种子产生随机数 14 cout<<"*****欢迎使用自动出题系统*****"<<endl; 15 cout<<"请对以下内容进行初始化设置:"<<endl; 16 cout<<"请输入打印题数:"<<endl; 17 cin>>Num; 18 cout<<"请选择是否有乘除法?(y/n)"<<endl; 19 cin>>sfchose; 20 cout<<"请输入一个值确定算式中数值取值范围:"<<endl; 21 cin>>qznum; 22 cout<<"减法结果中出现负数吗?(y/n)"; 23 cin>>jf; 24 25 if(sfchose=='y') 26 { 27 cout<<"请选择除法有无余数?(y/n)"<<endl; 28 cin>>yschose; 29 } 30 cout<<"********************************"<<endl; 31 32 for(int i=0;i<Num;i++) 33 { 34 sj1=rand()%qznum; 35 sj2=rand()%qznum; 36 sj3=rand()%qznum; 37 sj4=rand()%qznum; 38 if(sfchose=='n')//无乘除法 39 { 40 sf=rand()%4; 41 } 42 if(sfchose=='y')//有乘除法 43 { 44 sf=rand()%8; 45 } 46 switch(sf) 47 { 48 case 0: 49 cout<<sj1<<"+"<<sj2<<"= "<<endl; 50 break; 51 case 1: 52 if(jf=='n')//无负数 53 { 54 if(sj1<sj2) 55 { 56 cout<<sj2<<"-"<<sj1<<"= "<<endl; 57 58 } 59 else 60 { 61 cout<<sj1<<"-"<<sj2<<"= "<<endl; 62 } 63 } 64 else 65 { 66 cout<<sj1<<"-"<<sj2<<"= "<<endl; 67 68 } 69 break; 70 case 2: 71 if(sj1>sj3) 72 { 73 r=sj1; 74 sj1=sj3; 75 sj3=r; 76 } 77 if(sj2>sj4) 78 { 79 r=sj2; 80 sj2=sj4; 81 sj4=r; 82 } 83 cout<<"("<<sj1<<"/"<<sj3<<")"<<"+"<<"("<<sj2<<"/"<<sj4<<")= "<<endl; 84 break; 85 case 3: 86 if(sj1>sj3) 87 { 88 r=sj1; 89 sj1=sj3; 90 sj3=r; 91 } 92 if(sj2>sj4) 93 { 94 r=sj2; 95 sj2=sj4; 96 sj4=r; 97 } 98 if(jf=='n')//减法结果无负数 99 { 100 if((sj1/sj3)<(sj2/sj4)) 101 { 102 cout<<"("<<sj2<<"/"<<sj4<<")"<<"-"<<"("<<sj1<<"/"<<sj3<<")= "<<endl; 103 } 104 else 105 { 106 cout<<"("<<sj1<<"/"<<sj3<<")"<<"-"<<"("<<sj2<<"/"<<sj4<<")= "<<endl; 107 } 108 } 109 else 110 { 111 cout<<"("<<sj1<<"/"<<sj3<<")"<<"-"<<"("<<sj2<<"/"<<sj4<<")= "<<endl; 112 } 113 break; 114 case 4: 115 cout<<sj1<<"*"<<sj2<<"="<<endl; 116 break; 117 case 5: 118 if(sj2==0)//分母为零则不计入总数 119 { 120 i=i-1; 121 122 } 123 else if(yschose=='n')//除法没有余数 124 { 125 if(sj1%sj2==0) 126 { 127 cout<<sj1<<"/"<<sj2<<"="<<endl; 128 129 } 130 else 131 { 132 i=i-1; 133 134 } 135 } 136 else if(yschose=='y')//除法有余数 137 { 138 if(sj1%sj2!=0) 139 { 140 cout<<sj1<<"/"<<sj2<<"="<<endl; 141 142 } 143 else 144 { 145 i=i-1; 146 147 } 148 149 } 150 break; 151 case 6: 152 if(sj1>sj3) 153 { 154 r=sj1; 155 sj1=sj3; 156 sj3=r; 157 } 158 if(sj2>sj4) 159 { 160 r=sj2; 161 sj2=sj4; 162 sj4=r; 163 } 164 cout<<"("<<sj1<<"/"<<sj3<<")"<<"*"<<"("<<sj2<<"/"<<sj4<<")= "<<endl; 165 break; 166 case 7: 167 if(sj1>sj3) 168 { 169 r=sj1; 170 sj1=sj3; 171 sj3=r; 172 } 173 if(sj2>sj4) 174 { 175 r=sj2; 176 sj2=sj4; 177 sj4=r; 178 } 179 cout<<"("<<sj1<<"/"<<sj3<<")"<<"/"<<"("<<sj2<<"/"<<sj4<<")= "<<endl; 180 break; 181 default: 182 break; 183 } 184 } 185 }
四、运行截图
五、项目计划日志
周活动总结表
姓名:魏** 日期2016.3.12
日期 任务 | 听课 | 编写程序 | 阅读课本 | 准备考试 | 日总计 | ||
周一 |
100 | 30 | 30 | 160 | |||
周二 |
30 | 30 | |||||
周三 |
60 | 30 | 90 | ||||
周四 |
100 | 30 | 130 | ||||
周五 |
30 | 30 | |||||
周六 |
120 | 120 | |||||
周总结 |
200 | 300 | 60 | 560 |
阶段时间和效率 周数(上一次周活动表的周数+1):
不包括上一周在内的累计时间
总计 |
200 |
300 |
60 |
|
|
|
560 |
平均 |
200 |
300 |
60 |
|
|
|
560 |
最大 |
200 |
300 |
60 |
|
|
|
560 |
最小 |
200 |
300 |
60 |
|
|
|
560 |
以前各周的累计时间
总计 |
200 |
300 |
60 |
|
|
|
560 |
平均 |
200 |
300 |
60 |
|
|
|
560 |
最大 |
200 |
300 |
60 |
|
|
|
560 |
最小 |
200 |
300 |
60 |
|
|
|
560 |
六、时间记录表:
学生 魏** 日期 2016年3月12日
教师 王** 课程 软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3.7 |
16:30 |
17:00 |
无 |
30 |
编写程序 |
作业 |
3.8 |
22:00 |
22:30 |
无 |
30 |
编写程序 |
作业 |
3.9 |
16:30 |
17:00 |
无 |
60 |
编写程序 |
作业 |
3.10 |
21:15 |
21:45 |
无 |
30 |
编写程序 |
作业 |
3.11 |
22:10 |
22:40 |
无 |
30 |
编写程序 |
作业 |
3.12 |
8:00 |
10:00 |
无 |
120 |
编写程序 |
作业 |
七、缺陷记录日志:
学生 魏**
日期 2016年3月12日
教员 王**
程序号
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
|||||
3.8 |
1 |
A |
编译 |
编译 |
10min |
|
|||||
转换到 COFF 期间失败: 文件无效或损坏 |
|||||||||||
3.9 |
2 |
A |
编译 |
编译 |
3min |
|
|||||
sfchose=='n',忘记单引号 |
|||||||||||
3.10 |
3 |
B |
运行 |
运行后 |
1min |
|
|||||
忘记cin>> yschose; |
|||||||||||
3.11 |
4 |
A |
编译 |
编译 |
5min |
|
|||||
条件·不成立时, 忘记了i=i-1,让其再循环一次 |
|||||||||||
3.12 |
5 |
B |
运行 |
运行后 |
10min |
|
|||||
减法条件判断少了,造成有时输出题目数量不对 |