一、coding.net源码仓库地址:https://git.coding.net/mx123422/CaCulateMaster.git
二、流程记录
1.需求分析
(1)程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
(2)为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
(3)练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
(4)当程序接收的参数为4时,以下为一个输出文件示例。
2018010203
13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
软件附加功能要求如下:(请有余力的同学完成)
支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。(5分)
扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。(5分)
2.功能设计
生成的算术表达式以字符串的形式,使用BigDecimal以及io流分别完成字符串转化为算术表达式并计算结果和写入文件。
基本功能实现
附加功能未能全部实现
3.设计实现
Main类:主程序,可以从命令行接收参数; 生成算式表达式字符串。
Calculate类:解析字符串,优先级判别,文件写入。
4.算法详解
(1)生成题目.jisuanshi(n)
利用随机函数以及字符串型的数组生成和存储计算表达式(内容较为繁琐,暂时没想到更好的方法).调用.jisuanshi(n)。
(2)字符串转换、计算及写文件
运算符优先级比较compare(char str);
计算BigDecimal。通过构造字符串型的算术表达式(jisuanshi生成),使用BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象,接受来自主函数的字符串信息然后进行字符串解析,内含caculate(String st)、括号处理parse(String st);
文件写入:通过io流(输出流)将内容写入写入文件。
1 public static void write(String fileName, String content) {
2
3 FileWriter writer = null;
4
5 try {
6
7 writer = new FileWriter(fileName, true); /*打开一个写文件器,构造函数中的
第二个参数true表示以追加形式写文件,false表示覆盖的方式写入*/
8 writer.write(content+"
");
9 } catch (IOException e) {
10 e.printStackTrace();
11 } finally {
12
13 try {
14 if(writer != null){
15 writer.close();
16 }
17 } catch (IOException e) {
18 e.printStackTrace();
19
20 }
21 }
22 }
5.测试运行
(1)文件创建
(2)
6.满意代码
(1)优先级
1 //①优先级判别
2
3 private boolean compare(char str) {
4
5 if (chs.empty()) {
6 // 当为空时,显然 当前优先级最低,返回高
7 return true;
8 }
9
10 char last = (char) chs.lastElement();
11 switch (str) {
12 case '*': {
13
14 // '*/'优先级只比'+-'高
15 if (last == '+' || last == '-')
16 return true;
17 else
18 return false;
19 }
20
21 case '/': {
22 if (last == '+' || last == '-')
23 return true;
24 else
25 return false;
26 }
27
28 // '+-'为最低,一直返回false
29 case '+':
30 return false;
31 case '-':
32 return false;
33 }
34 return true;
35
36 }
(2)括号处理
1 //②括号处理
2
3 public BigDecimal parse(String st) {
4
5 int start = 0;
6 StringBuffer sts = new StringBuffer(st);
7 int end = -1;
8
9 while ((end = sts.indexOf(")")) > 0) {
10
11 String s = sts.substring(start, end + 1);
12 int first = s.lastIndexOf("(");
13 BigDecimal value = caculate(sts.substring(first + 1, end));
14 sts.replace(first, end + 1, value.toString());
15
16 }
17
18 return caculate(sts.toString());
19 }
7.总结
(1)反思:个人能力明显不足,对于Java知识的缺少是一大缺点,除数据结构的堆栈了解能力稍好,字符串型的算术表达式生成完全是靠了C语言的数组使用;Java中的io流读写文件完全是现学现用,为了节约时间也仅仅是了解了写文件的有关知识。
(2)感想:在Calculate这个类中,自认为生成字符串型的表达式很简单,所以放在最后写的jisuanshi生成这个方法。然而后来开始写jisuanshi的时候才感觉到前面有很多问题已经不好解决了,由于时间原因也没想到更便捷的方法。比如附加功能真分数的这个情况就不知道该如何处理。所以如果要对这个项目进行再次改进,重写jisuanshi的代码应该是首要的,随后而来的各种问题也将十分困难。所以项目中的每一个部分都应该认真对待,合理安排时间,全面考虑后续可能的扩展内容,才能尽可能地将它完美的实现。
8.PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
20 |
30 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
20 |
30 |
Development |
开发 |
18×60 |
25×60 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
120 |
· Design Spec |
· 生成设计文档 |
20 |
25 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
25 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
30 |
· Design |
· 具体设计 |
60 |
100 |
· Coding |
· 具体编码 |
5×2×60 |
6×2×60 |
· Code Review |
· 代码复审 |
2×1×60 |
2×2×60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
3×1×60 |
2×2×60 |
Reporting |
报告 |
60 |
60 |
· Test Report |
· 测试报告 |
20 |
20 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |