软件工程实践——个人项目-小学四则运算 “软件”之初版

这个作业的要求来自于: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.  并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。
  3. 初步拟定要实现的功能后,估计一下自己需要花多长时间。编程过程中记录自己实际用了多长时间。

三、详细设计

  • 使用的编译开发工具:CodeBlocks
  • 使用的编程语言:C语言
  • 功能设计
  1. 让用户输入所需联系题目的个数,并在屏幕上显示相应的题目数量。
  2. 随机产生四则运算式子,四则运算式子的要求为运算数字是100以内的随机正整数,两个以上的随机运算符。
  3. 运算结果不能为负数,若运算结果为负数则屏幕提示不符合题目要求。
  4. 对用户输入的结果进行正确和错误的判断,在用户答完题以后在屏幕上输出用户答题的正确个数与正确率。
  • 主要的函数实现代码
  1. 获取随机运算符函数(getrandomSignal())
    1 char getrandomSignal()//获取随机运算符
    2 {
    3     char signal[4]={'+','-','*','/'};
    4     return signal[rand()%4];
    5 }
  2. 获取随机数函数(getrandomSignal())
    1 int randomnum(double start, double end)
    2 {
    3     return (int)(start+(end-start)*rand()/(RAND_MAX+ 1.0));//获取随机数
    4 }
  3. 生成四则运算题目函数(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 }

 


四、程序运行结果演示

 

 

 

 

 


五、遇到的问题及解决方法

遇见的问题:

  1.  一开始接触到这个程序的要求时,对于我而言最大的问题就是随机数的产生,虽然之前有过类似的实验中有实现过随机数,但是由于太长时间没接触c语言,导致生疏。
  2. 题目要求的真分数处理,要求出具与真分数相关的习题。
  3. 结果不能产生负数。
  4. 除数为0的不合法情况。

解决方法:

  1. 通过查询资料以及询问同学,了解到了随机数产生的原理,在本次实验中使用到的是randomnum()函数来获取运算所需要的随机数,这个函数中返回指定范围内的随机数(不大于end,不小于start),RAND_MAX是在stdlib.h中定义的一个常量,它表示rand()可以返回的最大值。所以,rand()/(RAND_MAX+1)就得到一个0~1之间的数,这个数乘(end-start)的结果就是一个不大于(end-start)的数,最后加上start之后就得到了一个不小于start并且不大于end的数。到这里,随机数的问题被解决了。
  2.  由于个人的水平有限,此项问题并未找到解决的方法,在网络上查询到的资料思路与我的整体思路感觉不能融合在一起,所以不知道如何解决。
  3. 在解决这个问题的时候,我首先想到的是减法中减数被被减数大的情况下,程序有可能产生负数,所以用了变量temp来把随机数的值进行互换,使得被减数大于减数,减少程序输出结果为负数的情况,然后对后面的乘除法比前面的随机数大产生负数的情况,我则是用用if先对结果进行判断是否小于0,如果小于就在屏幕上输出“结果为负数,不满足题目的要求”,如果结果符合要求,则正常执行,虽然这种解决方式有些掩耳盗铃,但是我目前能想到的最简单的解决方法。
  4. 本来的思路是用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
posted @ 2018-10-14 22:23  zyda  阅读(303)  评论(2编辑  收藏  举报