标签:
四则运算2
一、题目和要求
题目:写一个能自动生成小学四则运算题目的程序,要求一次输出不少于30道,只能是整数100以内的四则运算(四则运算1升级版)
要求:
1.题目避免重复
2.可定制(数量/打印方式)
3.可以控制下列参数:是否有除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数,是否支持小数,精确到多少位,打印中每行的间隔
二、题目设计思路
根据第一次的程序实现,已经实现了打印数量上的控制,直接确定了打印列数,其他实现基本功能
第一步:避免题目重复;将打印的结果保存,此后每次生成的结果与之前的结果比较。
第二步:实现可定制;通过用户输入数量数和打印的列数,实现可定制,将间隔参数也由用户来输入。参数由用户输入,将参数传递到所需函数。
第三步:参数可控;通过用户输入选择控制信息,选择要产生的四则运算的形式。判断参数可以放在一起进行判断
三、程序源代码
1 // 1_1.cpp : 定义控制台应用程序的入口点。 2 // 3 /*四则运算二*/ 4 5 #include "stdafx.h" 6 #include "iostream" 7 #include "stdlib.h" 8 #include "time.h" 9 #include "iomanip" 10 #include "String" 11 using namespace std; 12 13 14 /*加减法定义*/ 15 void add(string judge,int min,int max) 16 { 17 /*定义a,b,c分别表示产生的随机数和运算符*/ 18 int a,b,c; 19 a=(rand() % (max-min+1))+ min; //随机生成范围内的整数 20 b=(rand() % (max-min+1))+ min; 21 c=rand()%2; 22 /*设置右对齐*/ 23 cout.flags(ios::right); 24 if(judge=="Y"||judge=="y") //允许负数 25 { 26 switch(c) 27 { 28 case 0: 29 cout<<setw(4)<<a<<‘+‘<<b<<‘=‘; 30 break; 31 case 1: 32 cout<<setw(4)<<a<<‘-‘<<b<<‘=‘; 33 break; 34 } 35 } 36 else //不允许负数 37 { 38 switch(c) 39 { 40 case 0: 41 cout<<setw(4)<<a<<‘+‘<<b<<‘=‘; 42 break; 43 case 1: 44 if(a>=b) 45 cout<<setw(4)<<a<<‘-‘<<b<<‘=‘; 46 else 47 cout<<setw(4)<<b<<‘-‘<<a<<‘=‘; 48 break; 49 } 50 } 51 } 52 /*四则运算定义*/ 53 void addmult(string judge1,string judge2,int min,int max) 54 { 55 int a,b,c; 56 a=(rand() % (max-min+1))+ min; //随机生成范围内的整数 57 b=(rand() % (max-min+1))+ min; 58 c=rand()%4; 59 /*设置右对齐*/ 60 cout.flags(ios::right); 61 if((judge1=="Y"||judge1=="y")) //允许假分数 62 { 63 switch(c) //随机产生运算符 64 { 65 case 0: 66 cout<<setw(4)<<a<<‘+‘<<b<<‘=‘; 67 break; 68 case 1: 69 if(judge2=="Y"||judge2=="y") //允许负数结果出现 70 { 71 cout<<setw(4)<<a<<‘-‘<<b<<‘=‘; 72 } 73 else 74 { 75 if(a>=b) 76 cout<<setw(4)<<a<<‘-‘<<b<<‘=‘; 77 else 78 cout<<setw(4)<<b<<‘-‘<<a<<‘=‘; 79 } 80 break; 81 case 2: 82 cout<<setw(4)<<a<<‘*‘<<b<<‘=‘; 83 break; 84 case 3: //判断生成除法的条件,除数不能为零 85 if(a!=0&&b==0) 86 cout<<setw(4)<<b<<‘/‘<<a<<‘=‘; 87 else if(a==0&&b!=0) 88 cout<<setw(4)<<a<<‘/‘<<b<<‘=‘; 89 else if(a==0&&b==0) 90 cout<<setw(4)<<a<<‘/‘<<b+1<<‘=‘; 91 else 92 cout<<setw(4)<<a<<‘/‘<<b<<‘=‘; 93 break; 94 } 95 } 96 else //不允许假分数出现 97 { 98 switch(c) 99 { 100 case 0: 101 cout<<setw(4)<<a<<‘+‘<<b<<‘=‘; 102 break; 103 case 1: 104 if(judge2=="Y"||judge2=="y") //允许负数结果出现 105 { 106 cout<<setw(4)<<a<<‘-‘<<b<<‘=‘; 107 } 108 else 109 { 110 if(a>=b) 111 cout<<setw(4)<<a<<‘-‘<<b<<‘=‘; 112 else 113 cout<<setw(4)<<b<<‘-‘<<a<<‘=‘; 114 } 115 break; 116 case 2: 117 cout<<setw(4)<<a<<‘*‘<<b<<‘=‘; 118 break; 119 case 3: //真分数判断 120 if(a<=b&&b!=0) 121 cout<<setw(4)<<a<<‘/‘<<b<<‘=‘; 122 else 123 cout<<setw(4)<<b<<‘/‘<<a<<‘=‘; 124 break; 125 } 126 } 127 } 128 /*四则运算生成函数*/ 129 void math(int m,int n) 130 { 131 int min,max,row,line; 132 string judge1,judge2,judge3; //judge1判断是否有乘除法,judge2判断是加减是否有负数结果出现,judge3判断真/假分数 133 cout<<"请输入您要打印题目的数值范围:"<<endl; 134 cout<<endl; 135 cout<<"最小数min(>=0):"; 136 /*判断用户输入的是否是需要的数据*/ 137 while(!(cin>>min)||min<0) 138 { 139 cout<<endl; 140 cout<<"输入错误,请重新输入:"; 141 cin.clear(); 142 cin.sync(); 143 } 144 cout<<endl; 145 cout<<"最大数max(<=1000):"; 146 while(!(cin>>max||max>=1000)) 147 { 148 cout<<endl; 149 cout<<"输入错误,请重新输入:"; 150 cin.clear(); 151 cin.sync(); 152 } 153 cout<<endl; 154 155 cout<<"是否有乘除(Y/N):"; 156 cin>>judge1; 157 while(judge1!="Y"&&judge1!="y"&&judge1!="N"&&judge1!="n") //输入数据异常判断 158 { 159 cout<<endl; 160 cout<<"输入错误,请重新输入(Y/N):"; 161 cin>>judge1; 162 cout<<endl; 163 } 164 /*假分数判断*/ 165 if(judge1=="Y"||judge1=="y") 166 { 167 cout<<endl; 168 cout<<"是否允许假分数(Y/N):"; 169 cin>>judge3; 170 while(judge3!="Y"&&judge3!="y"&&judge3!="N"&&judge3!="n") 171 { 172 cout<<endl; 173 cout<<"输入错误,请重新输入(Y/N):"; 174 cin>>judge3; 175 cout<<endl; 176 } 177 } 178 else 179 { 180 judge3="N"; 181 } 182 cout<<endl; 183 184 /*负数结果判断*/ 185 cout<<"加减是否允许结果出现负数(Y/N):"; 186 cin>>judge2; 187 while(judge2!="Y"&&judge2!="y"&&judge2!="N"&&judge2!="n") 188 { 189 cout<<endl; 190 cout<<"输入错误,请重新输入(Y/N):"; 191 cin>>judge2; 192 cout<<endl; 193 } 194 cout<<endl; 195 196 /*用户选择打印方式和间距*/ 197 cout<<"请输入您要打印的方式:行间距(>=0):"; 198 while((!(cin>>row))||row<0) 199 { 200 cout<<endl; 201 cout<<"输入错误,请重新输入:"; 202 cin.clear(); 203 cin.sync(); 204 } 205 cout<<endl; 206 cout<<"要打印的列数:"; 207 while((!(cin>>line))||line<=0) 208 { 209 cout<<endl; 210 cout<<"输入错误,请重新输入(>=1):"; 211 cin.clear(); 212 cin.sync(); 213 } 214 cout<<endl; 215 216 for(int i=0;i<m;i++) 217 { 218 cout<<"第"<<i+1<<"套"<<endl; 219 cout<<endl; 220 for(int j=0;j<n;j++) 221 { 222 if(judge1=="Y"||judge1=="y") 223 { 224 addmult(judge3,judge2,min,max); //有乘除法的四则运算 225 } 226 else 227 { 228 add(judge2,min,max); //无乘除法的四则运算 229 } 230 if((j+1)%line==0) 231 { 232 for(int r=0;r<row+1;r++) 233 { 234 cout<<endl; 235 } 236 } 237 else 238 { 239 cout<<" "; 240 } 241 } 242 243 cout<<endl; 244 cout<<endl; 245 } 246 } 247 248 /*主函数*/ 249 int main() 250 { 251 int num1,num2; 252 string s="Y"; //定义s,判断是否继续 253 /*使用srand函数生成预置随机数种子, 254 避免每次打开程序生成相同的随机数列*/ 255 srand((unsigned)time(NULL)); 256 257 while(s=="Y"||s=="y") 258 { 259 cout<<"请输入您要打印题目套数(至少一套):"; 260 while((!(cin>>num1))||num1<=0) 261 { 262 cout<<endl; 263 cout<<"输入错误,请重新输入:"; 264 cin.clear(); 265 cin.sync(); 266 } 267 cout<<endl; 268 269 cout<<"请输入您要打印题目数量:"; 270 while((!(cin>>num2))||num2<0) 271 { 272 cout<<endl; 273 cout<<"输入错误,请重新输入:"; 274 cin.clear(); 275 cin.sync(); 276 } 277 cout<<endl; 278 279 math(num1,num2); 280 cout<<"是否继续打印(Y/N):"; 281 cin>>s; 282 cout<<endl; 283 while(s!="Y"&&s!="y"&&s!="N"&&s!="n") 284 { 285 cout<<"输入错误,请重新输入(Y/N):"; 286 cin>>s; 287 cout<<endl; 288 } 289 } 290 291 return 0; 292 293 }
四、运行结果截图
五、结果分析与总结
对于一些细节上的问题处理的不是很好,比如对判断参数的异常处理做的不好,另外做出来的程序不是很符合规范,程序编写过程中,出现了诸如类型不匹配的问题,还有就是参数传递的问题,主要还是因为自己的编程习惯不好,许多地方都被自己忽视了,这是非常需要注意的地方。另外对函数的调用不熟悉,参数和函数名都不能表达出需要的意思。总之毛病多多,需要一点点去改正
psp0级表格:
一、项目计划总结: | |||||||
姓名: 张世通 | 日期:2015年3月14日星期六 | ||||||
听课 | 编写程序 | 阅读课本 | 准备考试 | 日总计 | |||
周日 | 30min | 30min | |||||
周一 | |||||||
周二 | 100min | 40min | 140min | ||||
周三 | 40min | 40min | 80min | ||||
周四 | |||||||
周五 | 100min | 100min | |||||
周六 | 80min | 80min | |||||
周总结 | 200min | 160min | 70min | 430min |
以前各周的累计时间 | ||||||
总计 | 200 | 160 | 70 | 430 | ||
平均 | 200 | 160 | 70 | 430 | ||
最大 | 200 | 160 | 70 | 430 | ||
最小 | 200 | 160 | 70 | 430 |
二、时间记录表: | ||||||
学生 张世通 日期 2015年3月14日星期六 | ||||||
教师 王建民 课程 PSP | ||||||
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3.10 | 08:00 | 09:50 | 10min | 100min | 听课 | 休息 |
14:30 | 15:10 | 40 | 编程 | |||
3.11 | 10:30 | 11:30 | 10+10min | 40min | 编程 | 休息,聊天 |
16:30 | 17:40 | 20+10min | 40min | 看书(第二章) | 休息,聊天 | |
3.13 | 08:00 | 09:50 | 10min | 100min | 上课 | 休息 |
3.14 | 09:00 | 10:50 | 30min | 80min | 编程 | 写作业 |
三、缺陷记录日志: | ||||||
学生 张世通 | ||||||
日期 2015年3月14日 | ||||||
教员 王建民 | ||||||
程序号 01 | ||||||
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3.10 | 1 | 1 | 编码 | 编译 | 1min | |
描述:类型错误,定义的判断字符为string字符串,输入的为char类型 | ||||||
3.11 | 2 | 2 | 编码 | 调试 | 5min | |
描述:嵌套中使用while循环,判断参数错误,造成死循环 | ||||||
3.14 | 3 | 3 | 编码 | 调试 | 20min | |
描述:输入数据时int类型参数与非int类型参数的区分出现问题,不友好,未设置异常判断 | ||||||
例子:在输入打印数量和行数列数控制参数时,输入字符则会进入死循环,未加参数不匹配时的报错提醒
标签:
原文地址:http://www.cnblogs.com/zhshto/p/4338226.html