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

零.coding链接

https://git.coding.net/hiawei/homework1.1.git

 

一.需求分析
程序为四则运算生成器

用户为小学生

1.功能需求:

输入参数N,随机产生N道加减乘除,数字为0到100之间,符号有3到5个

学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息文件目录与程序目录一致

2.开发过程需求:

语言为JAVA,提交日期为3.25,记录PSP开发流程,使用jdk8u161版本

3.服务质量需求:

用户为小学生,每个练习题至少要包含2种运算符,运算过程中不得出现负数与小数

不能产生重复算式

除法要简易正常,不应过多出现除数为1,被除数为零的情况

运行耗时不应过长

二.功能设计

基本功能:生成四则运算(无括号)并计算答案

扩展功能:生成四则运算(有括号)并计算答案、分数的加减法生成与运算

三.设计实现

1.基本功能:

初始想法:

实际设计:

编程思路:

生成算式使用整数数组存操作数、字符数组存操作符,数字为4到6个,随机生成时保证除法合法化,后转为字符串,求值过程未使用逆波兰算法,直接计算标记负数情况,储存运算结果以防止重复,输出符合要求的表达式

函数设计:

输出生成的算式:void prtFormula(int n) //n个算式

生成算式字符串:String creatFormula()

运算符生成:void creatOperator(int i)//在第i位字符数组储存运算符

随机生成运算符:char getOperator()

求最大公因数:int gcd(int m,int n)

表达式求值:int calculate(String ss)

2.扩展功能(暂未实现):

带括号表达式:使用中缀转后缀或者二叉树做表达式二叉树可得出计算结果,由于原先未考虑到扩展功能,java语法生疏,随机生成与合法性检测未抽象出来,使得扩展功能难以实现

分数加减:我的思路为先字符处理,将分子分母分别存在两个数组,求出所有分母的最小公倍数,将两个数组“通分”,计算结果后分子分母除去最大公约数。时间不足,未完成

四.算法详解与代码展示

1.表达式求值:

由于无括号,使用两个变量res,save;res保存当前表达式的值不管后面的运算;save是为后面优先运算保存的预留过程数。

res:

当前表达式的值

save:

做完1+2更新save为2,2-1更新save为-1

做玩1*2更新save为3,6/3更新save为2,做完1+1*2*6/3更新save为1*2*6/3

代码

 1 public static int calculate(String ss) {
 2         int res = 0, save = 0, n = 0;
 3         char s[] = ss.toCharArray();
 4         char sign = '+';//初始符号为+
 5         for (int i = 0; i < s.length; ++i) {
 6             if (s[i] >= '0') {
 7                 n = n * 10 + s[i] - '0';//读入两位数或一位数
 8                 if (i == s.length - 1 || s[i + 1] < '0') {
 9 
10                     if (sign == '+') {
11                         if (res < 0)//此类判断标记了负数情况
12                             ok = false;
13                         res += n;
14                         save = n;
15                     } else if (sign == '-') {
16                         if (res < 0)
17                             ok = false;
18                         res -= n;
19                         save = -1 * n;
20                     } else if (sign == '*') {
21                         res = res - save + save * n;
22                         if (res < 0)
23                             ok = false;
24                         save = save * n;
25                     } else if (sign == '/') {
26                         res = res - save + save / n;
27                         if (res < 0)
28                             ok = false;
29                         save = save / n;
30                     }
31                 }
32             } else {
33                 n = 0;
34                 sign = s[i];
35             }
36         }
37         return res;
38     }

 

2.查重:

为提高运行效率,开辟了长度100000000的数组rec记录得数,为防止溢出同时降低小学生计算难度程序避免了连乘的发生,储存方式例如得数为3,检查rec[3]是否为1,如果不为1,标记为1,如果为1就认为其极有可能重复,排除这个算式

3.保证整除:

生成算式我使用整数数组存数字字符数组存操作符,随机产生除法后,先把两个数字中大的排在前面,再将两数的最大公因数作为除数,若是除数为1,则打上标记,以便后续抛弃这个运算

代码:

 1 if (operas[i] == '/') {// 除法处理为大数除以两数最大公约数
 2             if (nums[i + 1] == 0)
 3                 nums[i + 1] = 2;// 避免除数为零
 4             if (nums[i] < nums[i + 1]) {
 5                 int t = nums[i];
 6                 nums[i] = nums[i + 1];
 7                 nums[i + 1] = t;
 8             }
 9             nums[i + 1] = gcd(nums[i], nums[i + 1]);
10             if (nums[i + 1] == 1) {
11                 ok = false;
12             }
13         }

4.运算符不重复:

 使用字符数组储存的运算符直接检测一遍以达到目的

五.测试运行

测试:

 

完全实现了基本功能,去除了a/a,a+0的情况,去除了连乘防止数据过大

六.总结

  我的模块化设计首先是计划出主要的函数,然后是将必要的函数抽象独立出来。主要分为生成表达式、计算表达式与打印表达式三个部分。通过这三个函数的协作可直接明了的完成程序的任务。不足之处是未将检测表达式环节抽象出来,导致扩展功能开发无法直接利用基本功能的代码。

 

展示PSP

PSP2.1

任务内容

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

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

Planning

计划

15

10

Estimate

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

15

10

Development

开发

325

1150

Analysis

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

15

10

Design Spec

生成设计文档

10

5

Design Review

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

0

0

CodingStandard

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

10

5

Design

具体设计

20

30

Coding

具体编码

120

480

Code Review

代码复审

30

60

Test

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

120

560

Reporting

报告

80

85

Test Report

测试报告

5

5

Size Measurement

计算工作量

5

5

Postmortem & Process Improvement Plan

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

60

75

反思:

1.java知识薄弱,第一次用java写如此复杂的程序。开发过程中,java的语法例如字符串字符数组间的处理必须结合资料才能完成。其中java main的运行方式直到阅读了别人的博客才学会了处理。

2.不熟悉开发流程。感觉自己还是不能按照原先的计划来编辑程序。很多原来的构思都在编程的过程中丢掉了,一边开发,一边思考新的方法,逐渐地,原先觉得比较独立抽象的函数等到作业完成的差不多时,发现好多功能都没有独立出来,给后续的扩展功能的开发造成了阻碍,更麻烦的是,独立性较低,给debug造成了极大的困难。

3.测试真的好难,自己明明感觉逻辑是对的,可偏偏就是不按照自己所想的运行。测试函数自己只会用笨方法在另一个java文件修改这个函数再测试。

4.自己感觉自己的程序还有很多不足,没有把乘法结果限制在100以内,重复出现的数字有时很奇怪。自己直接排除了像88/88、65/65、0+23这种式子,感觉程序还有很多优化的空间

转载于:https://www.cnblogs.com/hiawei/p/8645644.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件开发成本估算 软件开发成本主要是指软件开发过程中所花费的工作量及相应的代价。它不包括原材料和能源的消耗,主要是人的劳动的消耗。 人的劳动消耗所需代价就是软件产品的开发成本。 软件产品开发成本的计算方法不同于其它物理产品成本的计算。 软件的开发成本是以一次性开发过程所花费的代价来计算的。 软件开发成本的估算,应是从软件计划、需求分析、设计、编码、单元测试、组装测试到确认测试,整个软件开发全过程所花费的代价作为依据的。 对于一个大型的软件项目,由于项目的复杂性,开发成本的估算不是一件简单的事,要进行一系列的估算处理。主要靠分解和类推。 基本估算方法分为三类。 自顶向下的估算方法 自底向上的估计法 差别估计法 这种方法的主要思想是从项目的整体出发,进行类推。 估算人员根据以前已完成项目所消耗的总成本(或总工作量),推算将要开发的软件的总成本(或总工作量),然后按比例将它分配到各开发任务单元中去,再来检验它是否能满足要求。 ...... 差别估计法 这种方法综合了上述两种方法的优点,其主要思想是把待开发的软件项目与过去已完成的软件项目进行类比,从其开发的各个子任务中区分出类似的部分和不同的部分。 类似的部分按实际量进行计算,不同的部分则采用相应方法进行估算。 这种的方法的优点是可以提高估算的准确程度,缺点是不容易明确“类似”的界限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值