2016012021小学四则运算练习软件项目报告

源代码直接克隆的仓库地址:https://git.coding.net/youziyoumi/sizeyunsuan0.0.git

一、需求分析:

使用Java语言完成一个四则运算练习的命令行软件开发

(1)程序可接受一个输入参数n,随机产生n道加减乘除练习题,每个数字在0100之间,运算符在35个之间。

(2)每道练习题至少包含2种运算符。同时,练习题在运算过程中不得出现负数与非整数。

(3)练习题生成好之后,可将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,文件目录与程序目录一致。

二、功能设计:(1)可以产生35个运算符,且运算符至少有两种。

                         (2)可从控制台随机输入一个11000的正整数n,从而产生n个运算算式。

                         (3)支持括号运算的整数四则运算。

                         (4)可保证每一步运算结果都非负。  

三、设计实现:类:Main类:主类,接收命令行参数并启动程序。

                  Lib类:存放计算函数calculate

              函数:calculate:产生符合要求的算式并计算出结果。

四、算法详解:

调度场算法:处理优先级操作时使用,将产生的算式由中缀表达式转化为后缀表达式。

  1. 如果遇到数字,直接将数字送入结果列,如果是运算符号,进入新建栈。
  2. 进栈之前,比较将入栈符号与栈顶的已入栈符号的优先级。

         3.if将进栈运算符号优先级>栈顶的已入栈运算符号优先级,则将进栈符号入栈。

         4.if将进栈运算符号优先级<=栈顶的已入栈运算符号优先级,栈顶的已进栈运算符出栈。

        我是临时变更的算法。一开始的时候,我用的是调度场算法,但是在具体实现的时候,两个方法(中缀表达式转后缀表达式与通过栈计算结果)时,出现了偏差。在此,不举例说明具体问题,但是想分享一下通过栈计算结果的一个算法:将后缀表达式传入方法后,数字入栈,符号入栈计算结果压栈,继续符号入栈,数字入栈,计算结果后压栈,最后弹出top,就是运算结果。

        来说说现在的算法,我是问同学栈问题的时候,他告诉我的。如下:首先先随机产生 数a s b 的一个结构,再把它看做一个整体也就是 数 符 数 结构的第一个数,如此循环。当然后来产生的运算符对前运算符有影响。比如2+3*5,但这无疑会对运算产生影响,所以,不防使用括号,即(2+3)*5,产生算式的同时,还可以方便计算结果。也就是说,当后面的优先级大于前一个符号的优先级的时候要加括号。也就是对于当后一个运算符s1*/时,进行讨论。

五、测试运行

              

六、满意代码:构建数 符 数结构。在除了第一个数 符 数结构之后,循环运算,注意括号的生成原因。具体注意事项已在注释中标明。

for(int i=1;i<th;i++){//循环产生运算符,因为已经产生了一个运算符,所以<th,不是<=
                int s1=random.nextInt(4);
                int b1=random.nextInt(100);
                a=sum;//把sum看成是新的a
                if(operate[s1]==' '){
                    s1++;
                }
                if (operate[s1]=='+')
                    arr=arr+operate[s1]+b1;
                    sum=a+b1;
                if (operate[s1]=='*')//如果下一个运算符为乘号,判断上一个运算符的优先级是否低于这个运算符
                                     //涉及加括号
                    if(operate[s]=='-'||operate[s]=='+'){
                        arr="("+arr+")"+operate[s1]+b1;
                    }else{
                        arr=arr+operate[s1]+b1;
                    } 
                sum=a*b1;
                    
                if(operate[s1]=='-'){//如果运算符为减号,判断a-b的正负,如果为负数,再次随机产生b1并更新sum
                    while(a-b1<0){
                        b1=random.nextInt(100);//b可以为0
                    }
                    arr=arr+""+operate[s1]+b1;
                    sum=a-b1;
                }
                if(operate[s1]=='/'){//如果运算符为除号,判断a/b是否可以整除,如果不能整除,再次随机产生b1,
                                     //判断上一个运算符的优先级是否低于这个运算符,涉及加括号
                    if(b1==0)b1++;//b不能为0
                    while(a%b1!=0){
                        b1=random.nextInt(99)+1;//b不能为0
                    }
                    if(operate[s]=='-'||operate[s]=='+'){
                        arr="("+arr+")"+operate[s1]+b1;
                    }else{
                        arr=arr+operate[s1]+b1;
                    }
                    sum=a/b1;
                }
                
                s=s1;//将上一个运算符赋给s
            }

七、总结:我理解的“模块化”原则,有一下几个方面:

1.项目流程模块化。先明白用户需求,规范代码,设计相关的类和函数,具体编码,测试,调整,最后写总结。

2.设计编码模式化。Main函数与Lib函数之间的调用,具体编码时先构建整体框架,再逐步设计具体代码。

3.测试过程模式化。测试,修改代码时,可以由小极大地进行测试,方便明确具体bug的位置,减少不必要的时间浪费。

八、PSP

PSP

任务内容

计划共完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

15

10

Estimate

估计这个任务需要多少时间,并规划大致工作步骤

15

10

Development

开发

517

946

Analysis

需求分析 (包括学习新技术)

5

4

Design Spec

生成设计文档

7

9

Design Review

设计复审 (和同事审核设计文档)

5

4

Coding Standard

代码规范 (为目前的开发制定合适的规范)

10

8

Design

具体设计

15

23

Coding

具体编码

400

600

Code Review

代码复审

15

8

Test

测试(自我测试,修改代码,提交修改)

60

200

Reporting

报告

37

45

Test Report

测试报告

30

36

Size Measurement

计算工作量

2

2

Postmortem & Process Improvement Plan

事后总结, 并提出过程改进计划

5

7

 当我第一次看题目的时候是周三下午,用手机打开的。很长,真的好长。一项一项的,从设计到报告,非常全面详细,可想而知时间和经验的产物。但是当我分析的时候,我感觉好难啊。我自己本身没有工作室,接触的项目寥寥无几。所以,在一开始的时候,有不少困难。代码真的是你敲着敲着就懂了。懂了之后,总结一下,然后,你就敲快了。我记得一天晚上,不小心删了一个大括号,就找不到了,对着电脑一行一行的找。所以有一个规范很重要。还有的就是,遇到问题,先自己解决,调一调,问度娘。如果还不行,问一问同学,最好是做完,或者是理解能力,代码能力很强的同学,不是说问别人不行,而是每个人理解对方的算法和代码都需要时间,这样可以尽可能地减少双方的时间,提高效率。当然,问老师更好。还有一点,在这个项目中,我学会了什么叫“在做中学”。这可以理解成是一种碎片化的学习,碰到什么问题,就解决什么问题,把一个大问题的一部分弄明白,积少成多,总会都学会的。如果学到了新的知识可以对这个项目改进的话,我还会回来的。嗯,还要感谢帮助过我的小哥哥小姐姐们:)

原文地址:https://www.cnblogs.com/2016SE_NENU/p/8645048.html