一、题目及题目要求
编程随机生成四则运算,算数包括整数和真分数
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 |
| |||||
减法条件判断少了,造成有时输出题目数量不对 |