1.仓库地址:https://git.coding.net/wangyy2016012041/Calculate.git
2.需求分析:
①程序接受一个输入的参数n后,随机生成n道四则运算式,其中要保证生成的运算式的运算符在3-5个之间,同时程序对生成的运算式自动求解,结果和运算式一同输出到result.txt文件中。
②因为面向对象是小学生,要保证生成的运算式中无负数和小数,运算的结果也不能出现负数和小数。
③程序需要判断输入的参数n是否合法。
④在原有的基础上,生成的运算式随机性的带有括号和真分数。(未实现)
3.功能设计:
①基本功能:
Ⅰ程序接收参数n,并对n的合法性作出判断,若出现错误则提示。
Ⅱ自动生成n个运算式,并计算得出结果。
Ⅲ将计算后的结果与运算式一同存入txt文件中,保存在指定目录下。
Ⅳ由于面向对象是小学生,因此数字在0-100之间。
②扩展功能:
Ⅰ随机产生括号并保证括号的合法有效性。(尚未实现)
Ⅱ加入分数运算式,并且保证计算前后都是真分数,且不可化简。(尚未实现)
4.设计实现:
①整体思路:
在最初拿到项目的要求时,我是一头雾水,因为已有将近一年没有碰过java代码,所以我也只好重新翻开java书,温习需要用到的java知识。我看了老师推荐的博客,觉得他们的想法很高深,对于我来说还是比较难。后来在网上学习调度场算法,经过多日的理解,仍然不明白其中的原理,因为我是学习前台的,本身对后端的知识不了解,接触后端语言也是用node.js和php,而且java本身就很繁琐,所以我想了很久,也问了同学和学长学姐该如何完成这个作业,在学长的推荐下使用了JS中的eval算法,算是一种解决的方法吧。
对于表达式的构成,我的想法是首先生成随机数和随机运算符,将随机数放入数组中,随后将数字与运算符相连,在这期间要注意负数和小数不能出现,相连后构成表达式,运用eval算法将表达式求解。
②设计的函数:
Ⅰ判断运算符的方法:Sign(int n)
Ⅱ计算的方法:calculate(ArrayList<String> arrayList)
Ⅲ分式化简的方法:gcd(int a,int b)
5.代码详情:
①生成表达式的算法:
这一段主要用来生成随机数以及运算符,生成后将随机数和运算符组成运算式。
for(int i = 0; i < num; i++){ int n = (int)(Math.random()*3+2);//3-5个运算符 int[] number = new int[n + 1];//数字要比运算符多1 String nStr = new String(); for (int j = 0; j <= n; j++) { number[j] = (int)(Math.random()*100+1); } for (int j = 0; j < n; j++) { int sign1 = (int)(Math.random()*4); nStr += String.valueOf(number[j]) + String.valueOf(Sign(sign1)); if (sign1 == 3) { number[j + 1] = gcd(number[j], number[j + 1]); } } nStr += String.valueOf(number[n]); Str.add(nStr);
②计算方法:
这里使用了JS中的eval算法,计算表达式的最终结果。
ArrayList<String> suanshi = new ArrayList<String>(); for (String ax : arrayList) { try { ax = ax + "=" + jse.eval(ax); System.out.println(ax); suanshi.add(ax); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
③判断非小数:
通过判断能否整除,如果不能,则重新生成随机数,重新判断。
Random ran = new Random(); if(x%y!=0){ y=ran.nextInt(100)+1; return gcd(x,y); } else{ return y; }
6.测试运行:
进入src文件下,输入javac -encoding utf-8 Main.java 编译出相应的class文件,再输入java Main 进行测试:
7.项目总结:
这次项目对我来说是一个挑战,在阅读任务和解决任务的时候都遇到了很大的问题和困难,由于太久不接触java代码,导致在刚刚接触这个项目时要回头重新温习java的知识点,虽然用别的语言确实能特别快的完成这个项目,但是我也觉得用java对我来说也算是一个提升。在真正动手实践这个项目的时候,发现我的后端基础很差,看不懂老师提供的调度场算法,也是因为当初选择了前端,也没有好好学习java语言。因此选择了加入eval算法结构,同时也在我的能力范围内使用java代码,完成了这个作业。在这个过程中,让我意识到了时间分配上的不足以及和其他同学的差距,在以后的任务中,我会努力调控好自己的时间分配,多学一些别的语言,温习以前的知识,争取编译出更好的代码。
8.PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 15 | 20
|
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 8 |
Development | 开发 | 360 | 900 |
Analysis | 需求分析 (包括学习新技术) | 6 | 8 |
Design Spec | 生成设计文档 | 0 | 0 |
Design Review | 设计复审 (和同事审核设计文档) | 30 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 8 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 300 | 360 |
Code Review | 代码复审 | 30 | 15 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 60 | 90 |
Test Report | 测试报告 | 5 | 3 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 3 | 3 |