2016012009+小学四则运算练习软件项目报告
coding.net源码仓库地址:https://git.coding.net/sanmiaooo/sizeyunsuan.git
一、 需求分析
1.程序可从命令行接收一个输入参数n,然后随机产生n道+-*/习题
2.每个数字在 0 和 100 之间
3.运算符在3个到5个之间并且每道练习题至少要包含2种运算符
4.所出的练习题在运算过程中不得出现负数与非整数
5.使用JAVA编程语言
6.将学号和生成的练习题及对应答案输出到文件“result.txt”中,不输出额外信息
附加需求
1.产生带括号的四则运算并求解,算式中存在的括号必须大于2个,且不得超过运算符的个数
2.扩展程序功能支持真分数的出题与运算,运算过程中都为最简真分数
二、 功能设计
基本功能:用户输入的参数n随机产生n道符合要求的四则混合运算练习题,自动算出答案,式子与答案以文档的形式呈现
扩展功能:产生带括号的四则运算并求解,运算过程中都为最简真分数
注意:只能用JAVA进行编译,可使用的JDK版本为 jdk8u161,可使用的JRE版本为jre8u161,不得使用除限定版本jdk与jre外的额外依赖包
三、设计实现
共包含两个类文件
main函数:主函数,接收命令行参数并启动程序,负责输出到result.txt文件
Lib是辅助类,compute是支持带括号的整数加减乘除运算,fraction是负责真分数加减运算
采用模块化编程,方便调试,当运行报错时,可以分别测试每一个模块
四、算法详解 ·main函数(主函数)
import java.io.PrintStream; public class Main{ public static void main(String[] args){ int n=Integer.parseInt(args[0]); if(n<1||n>1000){ System.out.println("无法识别,请输入1000以内的正整数"); }else{ System.out.println("创建成功!"); try { PrintStream ps = new PrintStream("../result.txt"); System.setOut(ps); }catch(Exception e){ System.out.println("文件创建失败"); } System.out.println("2016012009"); Lib.count(n); } } }
五、 测试运行 输出到result.txt文件
六、代码展示
找最大公约数
public static int max(int a, int b) // 找最大公约数 { int k, l, p; if (a < b) { l = a; a = b; b = l; } while (b != 0) { k = a % b; a = b; b = k; } p = a; return p; }
整数运算
整数运算 static public void compute(int n) { String arr = ""; for (int j = 0; j < n; j++) { char[] oper = { '+', '-', ' ', '*', '/' }; Random random = new Random(); int th = random.nextInt(3) + 3; // 3-5个运算符 int s = random.nextInt(5); int a = random.nextInt(100); int b = random.nextInt(100); int sum = 0; if (oper[s] == ' ') { s++; } if (oper[s] == '-') { while (a - b < 0) { a = random.nextInt(100); b = random.nextInt(100); } sum = a - b; } if (oper[s] == '/') { if (b == 0) b++; while (a % b != 0) { a = random.nextInt(100); b = random.nextInt(99) + 1; } sum = a / b; } if (oper[s] == '+') { sum = a + b; } if (oper[s] == '*') sum = a * b; arr = a + "" + oper[s] + "" + b; System.out.print("(" + arr); int k = 1; for (int i = 1; i < th; i++) { int s1 = random.nextInt(5); int b1 = random.nextInt(100); a = sum; //更新sum if (oper[s1] == ' ') { s1++; } if (oper[s1] == '-') { while (a - b1 < 0) { b1 = random.nextInt(100); } sum = a - b1; } if (oper[s1] == '/') { if (b1 == 0) b1++; while (a % b1 != 0) { b1 = random.nextInt(99) + 1; } sum = a / b1; } if (oper[s1] == '+') sum = a + b1; if (oper[s1] == '*') sum = a * b1; String arr1 = ""; arr1 = "" + oper[s1] + "" + b1; if (i == 1) { k = s; if (s1 - k >= 2) { System.out.print(")" + arr1); } else { System.out.print(arr1); } } if (i != 1) { if (s1 - k >= 2) { System.out.print(")" + arr1); } else { System.out.print(arr1); } k = s1; } } System.out.println("=" + sum); } }
七、PSP展示
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
|
Planning |
计划 |
10 |
30 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
8*60 |
13.5*60 |
Development |
开发 |
7*60 |
12*60 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
5*60 |
· Design Spec |
· 生成设计文档 |
20 |
10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
30 |
30 |
· Coding |
· 具体编码 |
3*60 |
4*60 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
120 |
Reporting |
报告 |
60 |
1.5*60 |
· Test Report |
· 测试报告 |
15 |
30 |
· Size Measurement |
· 计算工作量 |
15 |
15 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
45 |
八、总结
·在本次实验中,主要在代码完成、调试中花了很多时间。一方面我对于Java语法结构、类的定义、函数的构造等知识方面都严重匮乏。另一方面还是对于软件工程这门课理解略有偏差
·最初只是实现这个四则运算的过程,就遇到了很多阻碍,一直查资料,修改,问同学,再修改,把我一个急性格的人,被它磨得无可奈何
·我是个笨蛋,在jdk和jre配置环境时把path删了,用了3个小时重装的系统,下载原来的软件又用了不少时间,一天的心情也浪费了,此愚蠢问题坚决杜绝
·虽然写出大体代码,但bug不断,一直补来补去,直至最终代码形成,着实松了一口气,我完成的不只是一次作业,更是一次挑战