zoukankan      html  css  js  c++  java
  • 软件工程实践——个人项目-小学四则运算 “软件”之初版

    这个作业的要求来自于: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("输出结果为负数,不符合题目要求
      ");
      36 
      37     }else{
      38     if(getResult(num1,num2,num3,signal,signal2)==get)//判断结果是否正确
      39         {
      40         printf("你的答案正确!
      ");
      41         a=1;
      42         }
      43     else
      44     {
      45         printf("答案错误!
      ");
      46         printf("正确的答案是: %d
      ",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
  • 相关阅读:
    基于微信的域名交易系统(进度汇报之后台)
    基于微信的域名交易系统(数据库表-修订版)
    基于微信的域名交易系统(需求文档)
    基于微信的域名交易系统(功能细节敲定)
    基于微信的域名交易系统(数据库结构设计)
    文档
    你离毕业有多远 原型设计pro
    Current Position of GradPaul 毕业宝四月中旬进度
    Architecture of GradPaul 毕业宝架构设计
    翘课老黄历——设计文档
  • 原文地址:https://www.cnblogs.com/zyd1234/p/9788420.html
Copyright © 2011-2022 走看看