零.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

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

  1. 2016012101小学四则运算练习软件项目报告

    2016012101小学四则运算练习软件项目报告 Coding.net源码仓库地址:https://git.coding.net/naiteu/sgwq.git 一.需求分析 1,程序可以接收一个参数 ...

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

    小学四则运算练习软件项目报告 作业源代码地址:https://git.coding.net/weijn/SiZe.git 一.需求分析 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题. 每个 ...

  3. 2016012090+小学四则运算练习软件项目报告

    2016012090+小学四则运算练习软件项目报告 Coding.net原码仓库地址:https://git.coding.net/Ai_Code/Work.git 目录: 一.需求分析 二.功能设计 ...

  4. 201571030107 小学四则运算练习软件项目报告

    本文转载自:http://www.javaxxz.com/thread-359437-1-1.html 201571030107 小学四则运算练习软件项目报告 项目Github地址 Arithmeti ...

  5. 201571030334 小学四则运算练习软件项目报告

    小学四则运算练习软件项目报告 Github的仓库主页链接地址:https://github.com/huicunzhang/sizeyunsuan 一.需求分析: 1. 程序可接收一个输入参数n,然后 ...

  6. 2016012028+小学四则运算练习软件项目报告

    任务1源码可直接克隆的仓库地址: (HTTPS)https://git.coding.net/zhaoliguaner/Calculate.git (SSH)git@git.coding.net:zh ...

  7. 2016012007+小学四则运算练习软件项目报告

    此次作业的源码地址:https://git.coding.net/ClausKE/Calculator1.git 写在前面:这次的作业完成得不易,在跟一些同学的交流中对这次作业有了更多的理解,在咨询了 ...

  8. 2016012033 小学四则运算练习软件项目报告

    week2的作业弄到现在week3才开始着手做,所幸截止日期还有几天. Coding.net源码仓库地址:https://git.coding.net/Agustin_Leonard_DPS/Calc ...

  9. 201571030138 小学四则运算练习软件项目报告

    项目gihub地址 fateiceb 项目过程 1.需求分析 基本功能 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间. 为了让小学 ...

最新文章

  1. 挺带劲,这款国人开源的监控系统功能真强大~
  2. php java session共享_php 函数session_id()思考。实现同服务器下session共享
  3. shell判断数字大小_shell! shell! shell!
  4. Hadoop 使用自动化脚本启动hdfs和yarn
  5. C++构造及析构执行顺序
  6. 如何还原桌面图标_如何为Windows 10桌面图标还原或更改文本的默认外观?
  7. C++|Qt最简单的http的get请求
  8. 通俗地告诉你:为什么Dijkstra算法是正确的?
  9. 电子书 Java程序员面试宝典(第4版).pdf
  10. Unity 3D - 常用插件汇总
  11. 自动生成banner网站
  12. amcharts使用总结
  13. Android仿制知乎滑动广告条
  14. 网络安全学习笔记——蓝队实战攻防
  15. android+8g开机剩余,8G内存的iQOO开机只剩4G,Jovi没用,网友直言后悔了
  16. 国家气象局天气预报城市及城市代码
  17. [windows]修改本机host配置
  18. java实现二叉堆,数据结构基础篇-二叉堆
  19. 计算机内存多大够用,内存多大才够用?电脑内存选购指南
  20. 希腊棺材之谜——复盘

热门文章

  1. 钢结构高强螺栓设计程序
  2. 未来计算机基于生物质 模拟人脑,IBM开发人脑模拟芯片 可能改变未来计算机
  3. 窗口坐标获取 windows
  4. Trimble Data Conversion编程相关补充
  5. python爬虫之中古诗网
  6. 多层json字符串转map_Java中Json字符串直接转换为对象的方法(包括多层List集合)
  7. 塞班简史:一个时代的终结
  8. Git 解决速度太慢问题(电信宽带)
  9. 【原创】关于IE地址栏历史记录的清除
  10. 九、stm32-蓝牙HC_05(接发通信、控制LED亮灭)