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

1、实验目的与要求

(1)掌握软件项目个人开发流程。

(2)掌握Github上发布软件项目的操作方法。

2、实验内容和步骤
 
任务1:
尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个包含3到5个数字的四则运算练习的命令行软件开发题目参考:http://www.cnblogs.com/xinz/p/7417960.html
软件基本功能要求如下:
  • 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
  • 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
  • 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt中,不要输出额外信息,文件目录与程序目录一致。
  • 当程序接收的参数为4时,以下为输出文件示例。

3.软件附加功能要求如下:(请有余力的同学完成)
  • 支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。(5分)
  • 扩展程序功能支持真分数的出题与运算,例如:1/6 + 1/8 + 2/323/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6。(5分)

4.需求分析:

        (1)程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间;(2)每个练习题至少要包含2种运算符(3)同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。

5.功能设计:

    基本功能:小学四则运算加减乘除。

    扩展功能:实现了带括号的加减乘除,真分数的加减乘除正在完善中。

6.设计实现:

    我设计了两个类,一个是Main()类,主要是进行运行程序,另一个类是calchyt()类主要是四则运算的解决过程。还实现了一个附加功能带括号的运算式。由于我是一个模块一个模块来的,我在另一个类中已经写好了真分数的出题与运算,但是我可能能力还不够,没办法把它们整合到一起。

7.测试运行:下面是我的测试结果截图:

         

8.核心代码:我觉得最主要核心就是用逆波兰思想进行压栈和出栈的过程。这个我一开始的时候想过几种方法,但就是有点繁琐,就上网借鉴大神的思想,下面给出参考链接   http://tianyami.iteye.com/blog/1462498;http://leon-a.iteye.com/blog/186104;https://bbs.csdn.net/topics/390049006

if (youxianji(symbols.peek())<=youxianji(s)&&!s.equals(")")) 
                {
                      symbols.push(s);
                }
                else if(!s.equals(")")&&youxianji(symbols.peek())>youxianji(s))
                {
                       while (symbols.size()!=0&&youxianji(symbols.peek())>=youxianji(s)&&!symbols.peek().equals("(")) 
                       {
                           if (!symbols.peek().equals("(")) 
                                        {
                                                       String operator=symbols.pop();
                                                       houzhui.append(operator).append(" ");
                                            shuchus.push(operator);
                                        }
                                    }
                                    symbols.push(s);
                                }
                                
                      else if (s.equals(")")) 
                      {
                            while (!symbols.peek().equals("(")) 
                              {
                                   String operator=symbols.pop();
                                    houzhui.append(operator).append(" ");
                                    shuchus.push(operator);
                                          }
                                   
                     symbols.pop();
                                  }
                                 }

9.总结:模块化的设计是先给出具体实现的方法如,随机产生计算式的方法,转化成为逆波兰式的方法,还有怎么计算逆波兰式的方法,然后调用这些方法就可一了。

10.展示PSP,这个环节重要的是让自己看到自己的估计和实际消耗时间如下表:

PSP2.1

任务内容

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

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

Planning

计划

10

20

·       Estimate

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

8

6

Development

开发

200

300

··       Analysis

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

30

60

·       Design Spec

·  生成设计文档

5

30

·       Design Review

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

4

20

·       Coding Standard

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

3

20

·       Design

  具体设计

10

20

·       Coding

  具体编码

36

120

·       Code Review

·  代码复审

7

5

·       Test

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

13

21

Reporting

报告

30

40

··       Test Report

·  测试报告

3

2

·       Size Measurement

  计算工作量

2

5

·       Postmortem & Process Improvement Plan

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

3

3

11.个人感想:做软件的确是需要静下心来做的一件事,需要完善好前面包括需求分析,具体设计等每一步,如果需求分析和具体设计那一部分想的不够完善,那么当你具体写代码的时候会手忙脚乱,面对满篇的BUG;还有就是要注重代码的规范,这会让人在复查代码时节省很多时间;最重要的是要平时多联系写代码,这样敲代码的手速会快很多。

GitHub地址:https://github.com/hyt6233/calculate

原文地址:https://www.cnblogs.com/haoytlearnblog/p/8613020.html