这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186

我的github远程仓库的地址:https://github.com/Wzh1997/Software-Engineering

 

一:要求

 

像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。

 

具体要求

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

扩展要求

1) 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。

2) 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等

 

二:设计

1.模块:主类中包含四个方法,出题,计算,判断对错,判断字符串是否都为数字。

2.数据结构:采用了数组将操作数,操作符分别存放;

3.计算方式:将存题目的字符串数组按顺序遍历,将数字存入操作数数组,将“+”,“-”符号存出操作符数组,当便利到“*”,“/”号 时,则将“*”,“/”符号两边的数取出运算,将的数存入操作数数组。当题目遍历完后则进行计算,因为在前面我们已经对*,/进行运算,所以操作符数组中只有加减号。然后每次将操作数数组中的前两位i取出,将一位符号取出,进行运算,得数存入第二数的数组位置,以此类推。

    例:操作数数组:2,3,6,4,9

      操作符数组:+,-,+,+

      2+3=5    操作数数组:空,5,6,4,9      5+6=11    操作数数组:空,空,11,4,9

             操作符数组:空,-,+,+               操作符数组:空,空,+,+

 

之所以采用这种计算方式,是因为便于日后对计算方式的拓展,如增加操作数的数量,带括号的题目等;

 

 

三:主要代码

 

public static float jisuan(String[] timu){

        float[] shu=new float[10];//用于存操作数的数组
        String[] fu=new String[10];//用于存操作符的数组
        int shu_top=-1;//操作数数组尾部标记
        int fu_top=-1;//操作符数组尾部标记




        for (int i=0;i<5;i++){
            if(isNumer(timu[i])){//判断timu[i]是否为数字
                shu_top++;
                //将timu[i]转为整型,存入数组中
                shu[shu_top]=Integer.valueOf(timu[i]).intValue();
            }
            else if (timu[i]=="*"){//如果是*号,将操作数数组尾部的一个数取出,与*号后的数字相乘,的数再放入操作数数组

                float a=shu[shu_top];
                shu_top--;

                float b=Integer.valueOf(timu[i+1]).intValue();

                shu_top++;
                shu[shu_top]=a*b;

                i++;


            }
            else if (timu[i]=="/"){//如果是/号,将操作数数组尾部的一个数取出,与*号后的数字相除,的数再放入操作数数组
                float a=shu[shu_top];
                shu_top--;

                float b=Integer.valueOf(timu[i+1]).intValue();

                shu_top++;
                shu[shu_top]=a/b;

                i++;
            }
            else {//将操作符放入数组
                fu_top++;
                fu[fu_top]=timu[i];
            }
        }


        //不断将操作数数组中的前两个数取出,将一个操作符取出,进行计算
        //得数放到第二个数的位置,操作符数组为空,则操作数中的数为答案
        int i=0;
        int j=0;
        while (i!=shu_top){
            float a=shu[i];
            float b=shu[i+1];

            String fuhao=fu[j];
            if (fuhao=="+"){
                shu[i+1]=a+b;
            }else {
                shu[i+1]=a-b;
            }

            i=i+1;
            j=j+1;
        }


        return shu[shu_top];
    }

 

 

四:结果展示

 

 

五:时间表

PSP2.1 Personal Software Process Stages Time Senior Student Time
Planning 计划 8 6
· Estimate 估计这个任务需要多少时间 12 10
Development 开发 60 120
· Analysis 需求分析 (包括学习新技术) 8 10
· Design Spec 生成设计文档 0 0
· Design Review 设计复审 3 5
· Coding Standard 代码规范 4 3
· Design 具体设计 10 13
· Coding 具体编码 35 30
· Code Review 代码复审 10 9
· Test 测试(自我测试,修改代码,提交修改) 15 30
Reporting 报告 9 6
· 测试报告 0 0
· 计算工作量 5 2
· 并提出过程改进计划 0 0

 

六:心得

  在这次编写程序中,发现自己在编码过程中不够细心,常漏写,写错等等,以及对一些逻辑判断得不够准确。总体的设计在程序编写中也是很重要的,觉得自己的总体的设计,一些类的划分方面做得不够好,代码逻辑不够清晰。自己应该加强对面向对象的理解,加强对程序总体规划的技能。

 

 


posted on 2018-10-14 21:39  王子豪  阅读(145)  评论(1编辑  收藏  举报