作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186
远程仓库地址:https://github.com/sheep5250/zy
一、题目要求:
像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:
23 - 3 * 4 = 11
扩展要求:
1) 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。
2) 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。
初步拟定要实现的功能后,估计一下自己需要花多长时间。编程过程中记录自己实际用了多长时间。
然后和同学们比较一下各自程序的功能、实现方法的异同等等。
写博客纪录自己实现的过程和思路。
二、个人软件过程耗时估计与统计表
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
Planning | 计划 | 30(minute) | 60(minute) |
· Estimate | 估计这个任务需要多少时间 | 120(minute) | 150(minute) |
Development | 开发 | 30(minute) | 45(minute) |
· Analysis | 需求分析 (包括学习新技术) | 30(minute) | 20(minute) |
· Design Spec | 生成设计文档 | 10(minute) | 10(minute) |
· Design Review | 设计复审 | 4(minute) | 6(minute) |
· Coding Standard | 代码规范 | 3(minute) | 5(minute) |
· Design | 具体设计 | 10(minute) | 12(minute) |
· Coding | 具体编码 | 60(minute) | 60(minute) |
· Code Review | 代码复审 | 10(minute) | 10(minute) |
· Test | 测试(自我测试,修改代码,提交修改) | 30(minute) | 30(minute) |
Reporting | 报告 | 5(minute) | 8(minute) |
· | 测试报告 | 15(minute) | 15(minute) |
· | 计算工作量 | 2(minute) | 1(minute) |
· | 并提出过程改进计划 | 3(minute) | 3(minute) |
三、部分主要代码:
float calculate(char z,float x,float y){ float Rresult2=0.00; switch(z){ case '+': Rresult2=(float)x+(float)y;break; case '-': Rresult2=(float)x-(float)y;break; case '*': Rresult2=(float)x*(float)y;break; case '/': Rresult2=(float)x/(float)y;break; } return Rresult2; } void title(int n){ int num1,num2,num3,a,b; int i; char op1,op2,sign; float result,Rresult,Rresult1,h,h1; float z=0.0; int rnum=0; for(i=0;i<n;i++){ srand(time(NULL)); num1=rand()%20+1; num2=rand()%20+1; num3=rand()%20+1; a=rand()%4+1; b=rand()%4+1; switch(a){ case 1: op1='+'; break; case 2: op1='-'; break; case 3: op1='*'; break; case 4: op1='/'; break; } switch(b){ case 1: op2='+'; break; case 2: op2='-'; break; case 3: op2='*'; break; case 4: op2='/'; break; } if(a==1||a==2){ if(b==1||b==2){ Rresult1=calculate(op1,num1,num2); //printf("%f ",Rresult1); h1=(float)num3; // printf("%f ",h1); // printf("%f ",Rresult1); Rresult=calculate(op2,Rresult1,h1); } else { Rresult1=calculate(op2,num2,num3); // printf("%f ",Rresult1); h1=(float)num1; // printf("%.2f ",h1); // printf("%f ",Rresult1); Rresult=calculate(op1,h1,Rresult1); } } else{ Rresult1=calculate(op1,num1,num2); // printf("%f ",Rresult1); h1=(float)num3; // printf("%.2f ",h1); //printf("%f ",Rresult1); Rresult=calculate(op2,Rresult1,h1); } if(Rresult<0){ i--; continue; } else{ printf("%d%c%d%c%d=",num1,op1,num2,op2,num3); //printf("%.2f",Rresult); scanf("%f",&result); if((int)(100*Rresult+0.5)/100==(int)(100*result+0.5)/100){ printf("回答正确 "); rnum++; } else{ printf("回答错误,正确答案是:%.2f ",((100*Rresult+0.5)/100)); } //return Rresult; } } //printf("%d",rnum); z=(float)rnum/(float)n*100; printf("本次答题数目为%d,准确率为%.2f%! ",n,z); } void main(){ int n; printf("请输入题目数量:"); scanf("%d",&n); while(n<1||n>20){ printf("你的输入有误,请重新输入:"); scanf("%d",&n); } title(n); }
四、运行结果
五、设计过程分析
答:由于该实验只为初级版,所以我没有用数据结构的栈来判断运算符的优先级,只用简单的判断语句就可得出。