组员:周娟、郑倩
题目:
请编写一个能自动生成小学四则运算题目的 “软件”。让程序能接受用户输入答案,并判断对错,最后统计错题数及正确的题数。
需求分析:
●基本功能
●实现-100到100以内的加法
●实现-100到100以内的减法
●实现-100到100以内的乘法
●实现100以内的除法
●扩展功能
●显示答卷
●错题正解
●系统评估
●错题重做
●退出系统
●新增功能
●在之前的四则运算基础上,新增了负数(负整数最小不小于-100)参与加、减、乘的计算,并且有负数出现时,将其加括号显示。
●设计:
●程序由主函数和七个子函数构成
●主函数功能:首先调用calculate子函数,让运用者进入系统做题,题目随机产生(具体实现由相应子函数完成),共10道题。其次对已完成的试卷进行菜单处理(1表示显示答卷,2表示错题正解,3表示系统评估,4表示错题重做,0表示退出系统)
●子函数包括void division(int *s1,int *s2,int *s3);void calculate();char menu();void evaluate();void answer();void Ranswer();void reform();分别用于计算除法、随机产生数学题给用户计算、制作菜单、系统作出评价、显示答卷、错题正解、错题重做。
代码实现:
1.cc.cpp文件
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <ctype.h> 5 6 int sy[10],sr[10],jd[10],jg[10]; 7 int fs=0; 8 char fh[10]; 9 10 void division(int *s1,int *s2,int *s3); 11 void calculate(); 12 char menu(); 13 void evaluate(); 14 void answer(); 15 void Ranswer(); 16 void reform(); 17 18 void main() 19 { 20 int key=1; 21 calculate(); 22 while(key) 23 { 24 switch(menu()) 25 { 26 case '1': 27 { 28 printf(" "); 29 answer(); 30 } 31 break; 32 case '2': 33 { 34 printf(" "); 35 Ranswer(); 36 } 37 break; 38 case '3': 39 { 40 printf(" "); 41 evaluate(); 42 } 43 break; 44 case '4': 45 { 46 printf(" "); 47 reform(); 48 } 49 break; 50 case '0': 51 { 52 printf(" 您已退出四则运算系统,谢谢支持! "); 53 key=0; 54 } 55 } 56 } 57 } 58 59 60 void division(int *s1,int *s2,int *s3) 61 { 62 int i,b=1,c,jg; 63 int cs[20]={0},sy,sr; 64 srand( (unsigned)time( NULL ) ); 65 fa: sy=rand()%100; 66 if(sy==0) 67 { 68 goto fa; 69 } 70 for(i=1;i<=sy;i++) 71 { 72 if(sy%i==0) 73 { 74 cs[b]=i; b++; 75 } 76 else continue; 77 } 78 c=rand()%b; 79 if(c==0) 80 { 81 c=c+1; 82 } 83 sr=cs[c]; 84 jg=sy/sr; 85 *s1=sy; 86 *s2=sr; 87 *s3=jg; 88 } 89 90 91 void calculate() 92 { 93 int p; 94 int i,gh; 95 printf("欢迎来到四则运算测试系统! 您将进行四则运算!Are you ready?Go! "); 96 srand( (unsigned)time( NULL ) ); 97 98 99 for(i=0;i<10;i++) 100 { 101 sy[i]=rand()%201-100; 102 sr[i]=rand()%201-100; 103 p=rand()%4; 104 105 if(p==0) 106 { 107 fh[i]='+'; 108 if(sy[i]<0&&sr[i]>0) 109 { 110 jg[i]=(sy[i])+sr[i]; 111 } 112 else if(sy[i]>0&&sr[i]<0) 113 { 114 jg[i]=sy[i]+(sr[i]); 115 } 116 else if(sy[i]<0&&sr[i]<0) 117 { 118 jg[i]=(sy[i])+(sr[i]); 119 } 120 else 121 { 122 jg[i]=sy[i]+sr[i]; 123 } 124 } 125 else if(p==1) 126 { 127 fh[i]='-'; 128 if(sy[i]<0&&sr[i]>0) 129 { 130 jg[i]=(sy[i])-sr[i]; 131 } 132 else if(sy[i]>0&&sr[i]<0) 133 { 134 jg[i]=sy[i]-(sr[i]); 135 } 136 else if(sy[i]<0&&sr[i]<0) 137 { 138 jg[i]=(sy[i])-(sr[i]); 139 } 140 else 141 { 142 jg[i]=sy[i]-sr[i]; 143 } 144 } 145 else if(p==2) 146 { fh[i]='*'; 147 if(sy[i]<0&&sr[i]>0) 148 { 149 jg[i]=(sy[i])*sr[i]; 150 } 151 else if(sy[i]>0&&sr[i]<0) 152 { 153 jg[i]=sy[i]*(sr[i]); 154 } 155 else if(sy[i]<0&&sr[i]<0) 156 { 157 jg[i]=(sy[i])*(sr[i]); 158 } 159 else 160 { 161 jg[i]=sy[i]*sr[i]; 162 } 163 } 164 else if(p==3) 165 { 166 fh[i]='/'; 167 division(&sy[i],&sr[i],&jg[i]); 168 } 169 if(sy[i]<0&&sr[i]<0) 170 { 171 printf("第%2d题:(%2d) %c (%2d) = ",i+1,sy[i],fh[i],sr[i]); 172 } 173 if(sy[i]<0&&sr[i]>0) 174 { 175 printf("第%2d题:(%2d) %c %2d = ",i+1,sy[i],fh[i],sr[i]); 176 } 177 if(sy[i]>0&&sr[i]<0) 178 { 179 printf("第%2d题:%2d %c (%2d) = ",i+1,sy[i],fh[i],sr[i]); 180 } 181 if(sy[i]>0&&sr[i]>0) 182 { 183 printf("第%2d题:%2d %c %2d = ",i+1,sy[i],fh[i],sr[i]); 184 } 185 scanf("%d",&jd[i]); 186 if(jd[i]==jg[i]) 187 { 188 fs+=10; 189 } 190 } 191 printf(" 测试结束! "); 192 } 193 194 195 char menu() 196 { 197 char c='0'; 198 printf(" ************ 四则运算测试系统 ************** "); 199 printf(" 1.显示答卷 2.错题正解 "); 200 printf(" 3.系统评估 4.错题重做 "); 201 printf(" 0.退出系统 "); 202 printf(" ********************************************"); 203 printf(" 请输入选项(0-4):"); 204 do 205 { scanf("%c",&c); } 206 while(!(c>='0'&&c<='4')); 207 return c; 208 } 209 210 211 void evaluate() 212 { 213 printf("您的成绩是%d分. ",fs); 214 switch(fs) 215 { case 100: printf("Very good!不要骄傲哦! "); break; 216 case 90: printf("优秀!恭喜您取得了好成绩! "); break; 217 case 80: 218 case 70: printf("良好!请继续努力,下次取得更好的成绩! "); break; 219 case 60: printf("及格!成绩不太理想哟!再接再励吧! "); break; 220 case 50: 221 case 40: 222 case 30: 223 case 20: 224 case 10: printf("多花点功夫吧,不然你会后悔的!! "); break; 225 case 0: printf("太差劲了!再不努力的话,会后悔的哦!再做一次吧!!!! "); break; 226 } 227 printf(" "); 228 } 229 230 231 void answer() 232 { 233 int j; 234 printf("您的答卷为: "); 235 for(j=0;j<10;j++) 236 { 237 if(sy[j]<0&&sr[j]<0&&jd[j]<0) 238 { 239 printf("(%2d) %c (%2d) = (%2d) ",sy[j],fh[j],sr[j],jd[j]); 240 } 241 if(sy[j]<0&&sr[j]<0&&jd[j]>0) 242 { 243 printf("(%2d) %c (%2d) = %2d ",sy[j],fh[j],sr[j],jd[j]); 244 } 245 if(sy[j]<0&&sr[j]>0&&jd[j]<0) 246 { 247 printf("(%2d) %c %2d = (%2d) ",sy[j],fh[j],sr[j],jd[j]); 248 } 249 if(sy[j]>0&&sr[j]<0&&jd[j]<0) 250 { 251 printf("%2d %c (%2d) = (%2d) ",sy[j],fh[j],sr[j],jd[j]); 252 } 253 if(sy[j]>0&&sr[j]>0&&jd[j]<0) 254 { 255 printf("%2d %c %2d = (%2d) ",sy[j],fh[j],sr[j],jd[j]); 256 } 257 if(sy[j]>0&&sr[j]<0&&jd[j]>0) 258 { 259 printf("%2d %c (%2d) = %2d ",sy[j],fh[j],sr[j],jd[j]); 260 } 261 if(sy[j]<0&&sr[j]>0&&jd[j]>0) 262 { 263 printf("(%2d) %c %2d = %2d ",sy[j],fh[j],sr[j],jd[j]); 264 } 265 if(sy[j]>0&&sr[j]>0&&jd[j]>0) 266 { 267 printf("%2d %c %2d = %2d ",sy[j],fh[j],sr[j],jd[j]); 268 } 269 } 270 printf(" "); 271 } 272 273 274 void Ranswer() 275 { 276 int k; 277 printf("您答错的题的正确答案为: "); 278 for(k=0;k<10;k++) 279 { 280 if(jd[k]==jg[k]) 281 { 282 continue; 283 } 284 else 285 { 286 if(sy[k]<0&&sr[k]<0&&jg[k]<0) 287 { 288 printf("(%2d) %c (%2d) = (%2d) ",sy[k],fh[k],sr[k],jg[k]); 289 } 290 if(sy[k]<0&&sr[k]<0&&jg[k]>0) 291 { 292 printf("(%2d) %c (%2d) = %2d ",sy[k],fh[k],sr[k],jg[k]); 293 } 294 if(sy[k]<0&&sr[k]>0&&jg[k]<0) 295 { 296 printf("(%2d) %c %2d = (%2d) ",sy[k],fh[k],sr[k],jg[k]); 297 } 298 if(sy[k]>0&&sr[k]<0&&jg[k]<0) 299 { 300 printf("%2d %c (%2d) = (%2d) ",sy[k],fh[k],sr[k],jg[k]); 301 } 302 if(sy[k]>0&&sr[k]>0&&jg[k]<0) 303 { 304 printf("%2d %c %2d = (%2d) ",sy[k],fh[k],sr[k],jg[k]); 305 } 306 if(sy[k]>0&&sr[k]<0&&jg[k]>0) 307 { 308 printf("%2d %c (%2d) = %2d ",sy[k],fh[k],sr[k],jg[k]); 309 } 310 if(sy[k]<0&&sr[k]>0&&jg[k]>0) 311 { 312 printf("(%2d) %c %2d = %2d ",sy[k],fh[k],sr[k],jg[k]); 313 } 314 if(sy[k]>0&&sr[k]>0&&jg[k]>0) 315 { 316 printf("%2d %c %2d = %2d ",sy[k],fh[k],sr[k],jg[k]); 317 } 318 319 } 320 } 321 printf(" "); 322 } 323 324 325 void reform() 326 { 327 int m,n; 328 printf("以下是您做错的题,请重做: "); 329 for(m=0;m<10;m++) 330 if(jd[m]==jg[m]) 331 { 332 continue; 333 } 334 else 335 { 336 if(sy[m]<0&&sr[m]<0) 337 { 338 printf("(%2d) %c (%2d) = ",sy[m],fh[m],sr[m]); 339 } 340 if(sy[m]<0&&sr[m]>0) 341 { 342 printf("(%2d) %c %2d = ",sy[m],fh[m],sr[m]); 343 } 344 if(sy[m]>0&&sr[m]<0) 345 { 346 printf("%2d %c (%2d) = ",sy[m],fh[m],sr[m]); 347 } 348 if(sy[m]>0&&sr[m]>0) 349 { 350 printf("%2d %c %2d = ",sy[m],fh[m],sr[m]); 351 } 352 scanf("%d",&jd[m]); 353 if(jd[m]==jg[m]) 354 { 355 printf("恭喜!您做对了! "); 356 } 357 else 358 { 359 for(n=0;n<3;n++) 360 { printf("仍未做对!您只有%d次机会了哦: ",2-n); 361 if(sy[m]<0&&sr[m]<0) 362 { 363 printf("(%2d) %c (%2d) = ",sy[m],fh[m],sr[m]); 364 } 365 if(sy[m]<0&&sr[m]>0) 366 { 367 printf("(%2d) %c %2d = ",sy[m],fh[m],sr[m]); 368 } 369 if(sy[m]>0&&sr[m]<0) 370 { 371 printf("%2d %c (%2d) = ",sy[m],fh[m],sr[m]); 372 } 373 if(sy[m]>0&&sr[m]>0) 374 { 375 printf("%2d %c %2d = ",sy[m],fh[m],sr[m]); 376 } 377 378 scanf("%d",&jd[m]); 379 if(jd[m]==jg[m]) 380 { 381 printf("恭喜!您做对了! "); break; 382 } 383 } 384 385 } 386 } 387 printf(" "); 388 }
2.cc.h文件
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <ctype.h> 5 6 int sy[10],sr[10],jd[10],jg[10]; 7 int fs=0; 8 char fh[10]; 9 10 void division(int *s1,int *s2,int *s3); 11 void calculate(); 12 char menu(); 13 void evaluate(); 14 void answer(); 15 void Ranswer(); 16 void reform();
程序截图:
分析与总结:
●PSP耗时与总结
PSP | Personal Software Process Stage | Time(h) | Time(%) |
●Design | ●具体设计 | 5 | 9.7 |
●Coding | ●具体编码 | 26 | 50.5 |
●Code Review | ●代码复审 | 5 | 9.7 |
●Test | ●测试(自测,修改代码) | 12 | 23.3 |
●Postmortem & Process Improvement Plan |
●事后总结,并提出过程改进计划 | 3.5 | 6.8 |
●分析
●针对四则运算的计算,采用随机数产生参与运算的数和运算符(见代码101-102行),每一次自动生成10道数学题目,运算完成后进入菜单选项,对答卷做相应的操作。
●对于加法、减法和乘法新增的负数参与计算。
●总结
●在原代码的基础上新增负数功能的时候,小组二人认真讨论,精诚合作,在一个小时左右将代码完善,调整缩进,使其符合代码规范。但是,对于单元测试我们还是不懂,看书也不明白该怎么做。