第四次作业:小学四则运算初级系统
这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186。
我的github远程仓库的地址:https://github.com/linyiman5508。
第一部分:需求分析
任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是30,那就输出30道题目和答案。运算式子必须至少有两个运算符,运算数字是在100之内的正整数,答案不能是负数。如:23 - 3 * 4 = 11。
第二部分:概要设计
(1)程序总流程图:
(2)模块算法设计说明:
float Calculate(int i,float num1,float num2)
计算四则运算式,并返回给函数Judge()系统标准计算结果。
char Operator(int i)
根据系统随机产生的“1,2,3,4”四个数字确定参与四则运算的运算符,返回给函数Judge()运算符号。
int Judge()
随机生成一条四则运算式,并判断参与四则运算的运算符的运算次序,且运算结果必须大于0,否则循环重新产生一条四则运算式。屏幕显示四则运算式,用户输入自己的运算结果,至少精确2位小数。与系统标准结果进行比较,若相同则输出正确的提示信息,并使正确的运算结果条数+1,正确率+1;若不相同,则输出错误的提示信息,屏幕输出标准答案。
int main()
主函数,具有安全防护功能,用户交互界面以及各个函数、各个功能模块的调用过程。可以在主函数中选择是否不断地进行四则运算,用一个do while来循环整个程序。
(3)方法之间的调用关系:
第三部分:详细设计
(1)
char Operator(int i) //根据系统随机产生的数字确定四则运算式运算符,返回给函数Judge()运算符号 { char sign; switch(i) { case 1: sign='+'; break; case 2: sign='-'; break; case 3: sign='*'; break; case 4: sign='/'; break; default: return 0; } return sign; }
根据系统随机产生的四个数字确定参与四则运算的运算符,产生数字“1”则进行加法运算,产生数字“2”则进行减法运算,产生数字“3”则进行乘法运算,产生数字“4”则进行除法运算,并返回给函数Judge()运算符号。
(2)
if(m>2)//首先判断第一个运算符是否乘或除,若是计算第一个数值与第二个数值的运算结果 { a=(float)num1; b=(float)num2; cor=Calculate(m,a,b); a=cor; b=(float)num3; cor=Calculate(n,a,b); } else { if(n>2)//其次再判断第二个运算符是否乘或除,若是计算第二个数值与第三个数值的运算结果 { a=(float)num2; b=(float)num3; cor=Calculate(n,a,b); a=(float)num1; b=cor; cor=Calculate(m,a,b); } else //否则从第一个数值开始顺序执行四则运算式子 { a=(float)num1; b=(float)num2; cor=Calculate(m,a,b); a=cor; b=(float)num3; cor=Calculate(n,a,b); } } }while(cor<0);//系统随机生成的四则运算式运算结果必须大于0,否则循环重新产生一条四则运算式
判断参与四则运算的运算符的运算次序,首先判断第一个运算符是否乘或除,若是则先计算第一个数值与第二个数值的运算结果;否则判断第二个运算符是否乘或除,若是则先计算第二个数值与第三个数值的运算结果;若不是则从第一个数值开始顺序执行四则运算式子。
(3)
for(counter=0;counter<n;counter++) //对计算条数不断+1 { j=Judge(); if(j==1) yes++; //统计用户总共答对的运算结果条数 } //不断循环随机产生n条四则运算式 por=(float)yes/(float)n*100; printf("\t\t你总共答对了%d题!\t\t你答题的准确率为:%.2f%!\n\n",yes,por);//处理用户的输入,并判断对错,打分统计 do { printf("请问需要继续进行四则运算吗?<y/n>: "); getchar(); scanf("%c",&ch); printf("\n"); if(ch=='y' || ch=='Y') goto lab1; //若是则继续让用户输入四则运算题目数 else if(ch=='n' || ch=='N') return 0; //若不是则退出程序,程序运行结束 else printf("【您的输入有误!请重新输入!】\n"); }while(ch!='y' || ch!='Y' || ch!='n' || ch!='N'); //若字符输入错误则重新输入,直到输入正确
for循环不断产生n条四则运算题目数,通过函数Judge()判断用户运算结果是否正确,若正确则对yes进行+1操作,最后屏幕输出用户答题准确率。do while循环语句循环整个程序,当用户输入‘y’或‘Y’时,则继续让用户输入四则运算题目数,程序重新产生n条四则运算式;当用户输入‘n’或‘N’时,则退出程序,程序运行结束。
第四部分:调试报告
(1)问题:
本程序从源码开始经过多次调试,若产生的四则运算式的运算结果为整数,在对用户输入结果和系统标准结果进行比较时,则不会有问题。但是若产生的四则运算式的运算结果有小数位时,在对用户输入结果和系统标准结果进行比较时,即使两个结果相等,程序依然提示错误信息。于是为了统一小数位,我改用这条判断语句if(((int)(100.0*res+0.5)/100.0)==((int)(100.0*cor+0.5)/100.0)) ,使系统运算结果至少精确到小数点后2位,此问题解决。
接着是屏幕输出用户答题准确率时产生问题----总是出现一堆错误数字,经过我的逻辑推理,发现是因为我没有对用户正确答题数进行累加,才会导致这种错误。于是我在Judge()函数中定义了一个整型变量“j”用来判断用户输入的运算值是否正确,若正确,则向主函数返回数字1,错误则返回0。在主函数定义了一个整型变量“yes”对用户正确答题数进行累加,最终问题得以解决。
最后是主函数通过do while语句循环重新运行程序时,前一次输出的答题准确率计算结果总是对后面的答题准确率计算结果产生影响,经过不断调试我发现是因为我没有对变量“yes”值重新赋初值,于是通过调整代码顺序解决这个问题。
(2)程序调试结果:
显示用户界面,用户输入错误密码,系统提示信息:
用户输入正确密码,进入系统,输入四则运算题目条数:
按下“y”或“Y”,用户重新输入题目数:
按下其它字符,提示信息“重新输入”:
按下“n”或“N”,退出程序:
第五部分:统计表
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
30 |
· Estimate |
估计这个任务需要多少时间 |
135 |
120 |
Development |
开发 |
120 |
80 |
· Analysis |
需求分析 (包括学习新技术) |
20 |
10 |
· Design Spec |
生成设计文档 |
0 |
0 |
· Design Review |
设计复审 |
20 |
40 |
· Coding Standard |
代码规范 |
20 |
35 |
· Design |
具体设计 |
30 |
35 |
· Coding |
具体编码 |
120 |
80 |
· Code Review |
代码复审 |
40 |
60 |
· Test |
测试(自我测试,修改代码,提交修改) |
40 |
70 |
Reporting |
报告 |
30 |
35 |
Test Report |
测试报告 |
0 |
0 |
·workload |
计算工作量 |
180 |
130 |
·correction |
并提出过程改进计划 |
0 |
0 |
个人项目设计总结:
在这次个人项目设计中,我遇到了不少困难,但是在我的坚持和虚心请教中都得到顺利解决。本次项目设计中,我发现理论必须和实践相结合,才能真正学会软件设计,才能完成一个课题。在这次设计中我参考了一些书籍,譬如《数据结构》《C语言程序设计》,也参考了其他学生的相关博客,总结了自己与他们的经验,快速掌握了本次个人项目设计的整体思路,对此我感到很兴奋。原来不断地学习,不断地探索是苦中带着甜,虽然经历了不少弯路,经历了不少挫折,但当程序调试成功后,当运行结果能达到要求后,我感到十分有成就感。面对课题,要展现自信,这是成功的一半,在这个设计过程中,不懂的可以虚心向老师请教,与同学交流经验,态度是成功的基石!
在完成这个项目的过程中,加深了我对C语言知识的充分运用以及理解,使自己的编程水平得到了一定的提高。我觉得自己在处理问题方面的能力也提高了,比如在编程中有时会忘记一些小步骤,比如do while循环忘记在while语句后面加分号,未给变量赋初值就直接使用,导致程序无法运行。这时我会认真思考问题,调试代码,查找错误,理顺这其中的逻辑关系,然后再对程序进行修改,从而克服困难。
本来我是打算运用《数据结构》中栈“后进先出”的特点进行运算符(包括括号)的优先级判断,结果在设计了数据存储结构后发现题目要求是“系统随机产生四则运算”,如果运用数据结构中栈的特点的话会使工作变得困难,效率会降低,于是我放弃了这个最先想到的方法。这个程序还存在诸多不足之处----在现实中许多功能现在还没有实现,还有不少需要进一步完善的操作等等,可能是因为经验不足,对问题预期不够等一些不可预见的原因所致,这些都是我在接下来的学习和实践中要汲取的教训。
这次个人项目设计还提高了我综合运用以前所学知识的能力,并促使我对VC有了更深层的了解。《软件工程》是一门实践性很强的课程,进行课程项目设计是对我们学生综合素质进行训练的一种基本方式,是与课堂听讲,自学和练习相辅相成,必不可少的一个环节。个人项目设计训练了我设计软件的综合能力,包括需求分析、问题分析、总体结构设计、详细设计的基本技能技巧。
只有个人掌握一定的专业知识水平,具备一定的软件开发经验,才能在今后的结对编程,团体项目中更好地与队员分工合作,发挥自己的优势和潜力,扬长避短,设计出满足客户需求的功能丰富的软件。