软件工程实践——个人项目-小学四则运算 “软件”之初版
这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186。
我的github远程仓库的地址为:https://github.com/zyd123d/zyd1。
一、题目要求
像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11。
二、扩展要求
- 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。
- 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。
- 初步拟定要实现的功能后,估计一下自己需要花多长时间。编程过程中记录自己实际用了多长时间。
三、详细设计
- 使用的编译开发工具:CodeBlocks
- 使用的编程语言:C语言
- 功能设计
- 让用户输入所需联系题目的个数,并在屏幕上显示相应的题目数量。
- 随机产生四则运算式子,四则运算式子的要求为运算数字是100以内的随机正整数,两个以上的随机运算符。
- 运算结果不能为负数,若运算结果为负数则屏幕提示不符合题目要求。
- 对用户输入的结果进行正确和错误的判断,在用户答完题以后在屏幕上输出用户答题的正确个数与正确率。
- 主要的函数实现代码
- 获取随机运算符函数(getrandomSignal())
1 char getrandomSignal()//获取随机运算符 2 { 3 char signal[4]={'+','-','*','/'}; 4 return signal[rand()%4]; 5 }
- 获取随机数函数(getrandomSignal())
1 int randomnum(double start, double end) 2 { 3 return (int)(start+(end-start)*rand()/(RAND_MAX+ 1.0));//获取随机数 4 }
- 生成四则运算题目函数(produceTest())
1 int produceTest()//题目生成 2 { 3 int get; 4 int num1,num2,num3,a; 5 char signal,signal2; 6 7 srand((unsigned)time(NULL)); 8 signal=getrandomSignal(); 9 signal2=getrandomSignal(); 10 num1=randomnum(1,100); 11 num2=randomnum(1,100); 12 num3=randomnum(1,100); 13 if(signal=='-') 14 { 15 if(num1<num2 ) 16 { 17 int temp; 18 temp=num1; 19 num1=num2; 20 num2=temp; 21 }else if(num1<num3) 22 { 23 int temp2; 24 temp2=num1; 25 num1=num3; 26 num3=temp2; 27 } 28 } 29 30 31 printf("%d%c%d%c%d=",num1,signal,num2,signal2,num3); 32 scanf("%d",&get); 33 fflush(stdin); //清空输入缓冲区 34 if(getResult(num1,num2,num3,signal,signal2)<0){//判断结果是否为负数 35 printf("输出结果为负数,不符合题目要求\n"); 36 37 }else{ 38 if(getResult(num1,num2,num3,signal,signal2)==get)//判断结果是否正确 39 { 40 printf("你的答案正确!\n"); 41 a=1; 42 } 43 else 44 { 45 printf("答案错误!\n"); 46 printf("正确的答案是: %d\n",getResult(num1,num2,num3,signal,signal2)); 47 a=0; 48 } 49 } 50 return a; 51 }
四、程序运行结果演示
五、遇到的问题及解决方法
遇见的问题:
- 一开始接触到这个程序的要求时,对于我而言最大的问题就是随机数的产生,虽然之前有过类似的实验中有实现过随机数,但是由于太长时间没接触c语言,导致生疏。
- 题目要求的真分数处理,要求出具与真分数相关的习题。
- 结果不能产生负数。
- 除数为0的不合法情况。
解决方法:
- 通过查询资料以及询问同学,了解到了随机数产生的原理,在本次实验中使用到的是randomnum()函数来获取运算所需要的随机数,这个函数中返回指定范围内的随机数(不大于end,不小于start),RAND_MAX是在stdlib.h中定义的一个常量,它表示rand()可以返回的最大值。所以,rand()/(RAND_MAX+1)就得到一个0~1之间的数,这个数乘(end-start)的结果就是一个不大于(end-start)的数,最后加上start之后就得到了一个不小于start并且不大于end的数。到这里,随机数的问题被解决了。
- 由于个人的水平有限,此项问题并未找到解决的方法,在网络上查询到的资料思路与我的整体思路感觉不能融合在一起,所以不知道如何解决。
- 在解决这个问题的时候,我首先想到的是减法中减数被被减数大的情况下,程序有可能产生负数,所以用了变量temp来把随机数的值进行互换,使得被减数大于减数,减少程序输出结果为负数的情况,然后对后面的乘除法比前面的随机数大产生负数的情况,我则是用用if先对结果进行判断是否小于0,如果小于就在屏幕上输出“结果为负数,不满足题目的要求”,如果结果符合要求,则正常执行,虽然这种解决方式有些掩耳盗铃,但是我目前能想到的最简单的解决方法。
- 本来的思路是用if对随机数据进行判断,但是由于题目的另一个要求是要求随机数为100以内的正整数,所以我就直接设置随机数据的范围为1~100暂时解决了此类问题。
六、总结
在本次实验过程中,由于使用的是C语言,虽说能够理解大致的逻辑,但由于对题目的需求布没有充分了解便开始了编写代码,导致花费在后续完善题目要求的过程用了很多的时间,体会到了需求分析的重要性,明白了磨刀不误砍柴工的道理,还有便是发现自己在之前学习过的课程C语言已经变得生疏,有许多的细节问题都已忘记,就比如在编写c语言过程中最基本的整数与浮点数之间的转换模式,也花费了我非常多的时间,相信在之后的学习中会更加注意此类细节问题。
七、个人软件过程耗时估计与统计表
PSP2.1 | Personal Software Process Stages | Time Senior Student(h) | Time(h) |
Planning | 计划 | 2 | 1 |
· Estimate | 估计这个任务需要多少时间 | 10 | 12 |
Development | 开发 | 8 | 10 |
· Analysis | 需求分析 (包括学习新技术) | 2 | 1 |
· Design Spec | 生成设计文档 | 2 | 1 |
· Design Review | 设计复审 | 1 | 0.5 |
· Coding Standard | 代码规范 | 0.5 | 1 |
· Design | 具体设计 | 3 | 4 |
· Coding | 具体编码 | 10 | 12 |
· Code Review | 代码复审 | 1 | 2 |
· Test | 测试(自我测试,修改代码,提交修改) | 1 | 2 |
Reporting | 报告 | 1 | 3 |
· | 测试报告 | 0 | 0 |
· | 计算工作量 | 0.5 | 0.2 |
· | 并提出过程改进计划 | 0 | 0 |