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

    ---恢复内容开始---

    本文要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166

    小学四则运算的程序需求为:

    能自动生成小学四则运算题目,任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。

     

     一开始,我先对这个项目做一个工程时间量的估计计划,如下表所示:

    接下来是对这个程序的需求分析过程:

    要用命令行的形式显示,输入所需的题目数显示题目。而且显示的运算式子要至少为两个运算符,并且参与运算的数字为100以内的正整数,并且答案不能是负数的。任何语言编写都可以。

    本程序计划使用Java语言来实现。并且对用户输入的答案与正确答案作比较,并且实现可以打分的功能。扩展要求是可以实现真分数参与运算,并且也能对用户输入的分数进行换算,比对正确答案。

    讲讲代码规范部分:

    命名规范:对于变量及函数的命名,尽量采用匈牙利命名法,变量名或函数名中使用大写字符来区分各个部分,以便于记忆和阅读;

    程序风格:严格采用阶梯层次组织程序代码,每层次缩进为4格,括号位于下一行;

    注释规范:函数头的注释(“功能”,“参数”,“返回值”),变量的注释(紧跟在变量的后面说明变量的作用),其他注释(在各功能模块的每一主要部分之前添加块注释)。

    对于程序的具体设计,时间用的稍微多一些,尽量能够设计好整个程序,以方便后面的编程,具体如下:

    1、用一个整型变量存放用户输入的数字(记录题数),判断输入的数字是否合法(正整数之外的数都排除掉),不合法则提醒用户重新输入。

    2、题目的生成

    • 用一个字符串来存放最终生成的式子
    • 用一个自变量来存放已打印输出的题数
    • 用三个以上的随机数来随机生成式子中运算的数字(100以内的数字)
    • 将“+”、“-”、“*”、“/”四个运算符放进数组里,通过随机数控制生成的运算符
    • 根据生成的数字跟运算符计算式子的答案,若为负数则舍弃
    • 若结果不为负数将运算的数字跟运算符间隔的放进字符串中
    • 将生成的字符串打印输出,题数自变量加一
    • 判断题数自变量与用户输入的整型数字是否一致

    3、分数统计

    • 设置一个变量来存放用户输入的答案
    • 将用户的答案跟标准答案做比较,判断对错
    • 根据用户输入的题数计算每一题的分数
    • 根据用户的答题情况计算最终分数并作出显示

    具体编码环节是比较耗时间的,但是如果前期工作做得好的话,编程其实不是很大的问题。在编程过程中,要将前面做的代码规范与具体设计的内容融进编码中,按照一个标准来做,养成良好的编程习惯。

    在编码的过程中,我遇到了一些问题,列举部分如下:

     1、运算符优先级问题

    一开始没考虑运算符的优先级问题,都是按照顺序计算结果的,最终发现计算结果有偏差。于是重新审视了一下这个问题,发现两个运算符及以上的算式是要按照运算符的优先级来进行先后顺序的计算,所以把加减乘除做了优先级“0”“1”表示,越高越先计算。最终解决了问题,把一部分代码搬出来如下:

    //如果前运算符的优先级低于后运算符
    if(pri[0]<pri[1]){
    int temp=stringNum[numCount-1];//存最后一个数字
    for(int i=numCount-2;i>=0;i--){
    if(op[i]==0){
    temp=stringNum[i]+temp;
    }
    if(op[i]==1){
    temp=stringNum[i]-temp;
    }
    if(op[i]==2){
    temp=stringNum[i]*temp;
    }
    if(op[i]==3){
    temp=stringNum[i]/temp;
    }

    }
    result=temp;
    }
    //如果前运算符的优先级高于或等于后运算符
    else{
    result+=stringNum[0];//把第一个数字放进去
    for (int i=1,j=0;i<numCount && j<numCount-1;i++,j++){
    if(op[j]==0){
    result+=stringNum[i];
    }
    if(op[j]==1){
    result-=stringNum[i];
    }
    if(op[j]==2){
    result*=stringNum[i];
    }
    if(op[j]==3){
    result/=stringNum[i];
    }
    }
    }

     2、没能修改运算式子中运算数的个数

    要修改式子中运算数的个数,要进行个数变量的修改,但是在当式子的运算顺序不是从前往后时,运算个数的增多使现在的算法不太可行,目前只适用于两个运算符。我的基本算法如下(省去一部分代码):

    int[] pri=new int[numCount-1];
    if(pri[0]<pri[1]){
    ......
    }else{
      ......
    }

     3、没有随机出真分数的式子

    想不出怎么去随机生成一个真分数式子的算法,好像有些复杂,思路不怎么清晰。

    
    

    代码复审其实是比较重要的,主要是编写完程序以后对此进行一些评价与总结。发现自己编程中的优缺点,并且在这个过程中就可以发现不足,学习改正并吸收经验。所以我对我的代码进行了一遍审查:

    优点:

    1、有按照代码规范编码,注释也比较多,整体比较易读且清晰;

    2、整体编码风格较好

    缺点:

    1、算法不够优化;

    2、在具体设计部分比较不精细,导致编码过程中有点复杂;

    3、模块化不是很分明。

    测试部分主要是功能的测试,对一些输入与输出的测试,如下:

    •  输入题目数为非正整数

               

    最终,完成了程序以后,再次填写一开始的PSP工程时间量计算的表格,发现计划时间与实际时间是有点差异的,如下:

     

    附上本程序的命令行运行截图:

     

    我的Github地址是:https://github.com/sanshuishu/SiZeYunsuan.git

    ---恢复内容结束---

  • 相关阅读:
    mysql
    jvm--动态对象年龄判定
    JVM中的STW和CMS
    jvm中的垃圾收集器serial、parNew、parallel Scavenge;serial old、parallel old、CMS、G1
    concurrenthashmap在1.8和1.7里面有什么区别
    java中的深浅拷贝
    JDK动态代理和CGLIB代理的区别
    java 锁的底层原理
    死锁
    jvm新生代和老年代分别使用什么垃圾回收算法
  • 原文地址:https://www.cnblogs.com/sanshuishu/p/9758827.html
Copyright © 2011-2022 走看看