.仓库地址:https://git.coding.net/yanglq/week2work2.git
1.需求分析:
- 程序可接收一个输入参数n,然后随机产生n道加减乘除,每个数字在 0 和 100 之间,运算符在3个到5个之间。结果和运算式一同输出到result.txt文件中。
- 面向对象为小学生。运算式及结果不能出现分数和负数。
- 程序需要判断输入的参数n是否合法,在不合法时要进行一定的处理。
- 在原有的基础上,生成的运算式随机性的带有括号,算式中存在的括号必须大于2个,且不得超过运算符的个数。
2.功能设计:
输入练习题的个数,并判断是否为整数,是否合理
产生随机数和随机符
利用栈设计运算符的优先级并计算练习题的结果
将结果输出到指定文件中,并输入学号
3.设计实现:
创建两个类Main和Count
用了Main方法产生随机数及随机运算符
用TranSuffix方法实现用盏中缀转后缀的运算
用opration方法计算后缀表达式
BufferedWriter将结果输出到文件
4.代码详情:
产生随机数和随机运算符。先产生四个随机数,然后把四个随机产生的运算符插入。
Random ran = new Random(); int len = 0; String arry[] = new String[100]; for(int i = 0;i<4;i++){ len++; arry[i] = String.valueOf(ran.nextInt(100)); } char[] ch = {'+','-','*','/'}; for(int i= 0;i<3;i++){ int index = ran.nextInt(ch.length); int head = (i+1)*2; int tail = len+1; for(int j = tail;j >= head;j--){ arry[j] = arry[j-1]; } }
中缀表达式换为后缀表达式
//中缀转后缀
public static String toSuffix(String infix){ List<String> queue = new ArrayList<String>(); List<Character> stack = new ArrayList<Character>(); char[] charArr = infix.trim().toCharArray(); String standard = "*/+-()"; char ch = '?';//对ch初始化 int len = 0; for (int i = 0; i < charArr.length; i++) { ch = charArr[i]; if(Character.isDigit(ch)) { len++; }else if(Character.isLetter(ch)) { len++; }else if(ch == '.'){ len++; }else if(Character.isSpaceChar(ch)) { if(len > 0) { queue.add(valueOf(Arrays.copyOfRange(charArr, i - len, i))); len = 0; } continue; }else if(standard.indexOf(ch) != -1) { if(len > 0) { queue.add(valueOf(Arrays.copyOfRange(charArr, i - len, i))); len = 0; } if(ch == '(') { stack.add(ch); continue; } if (!stack.isEmpty()) { int size = stack.size() - 1; boolean flag = false; while (size >= 0 && ch == ')' && stack.get(size) != '(') { queue.add(valueOf(stack.remove(size))); size--; flag = true; } while (size >= 0 && !flag && basic.get(stack.get(size)) >= basic.get(ch)) { queue.add(valueOf(stack.remove(size))); size--; } } if(ch != ')') { stack.add(ch); } else { stack.remove(stack.size() - 1); } } if(i == charArr.length - 1) { if(len > 0) { queue.add(valueOf(Arrays.copyOfRange(charArr, i - len+1, i+1))); } int size = stack.size() - 1; while (size >= 0) { queue.add(valueOf(stack.remove(size))); size--; } } } return queue.stream().collect(Collectors.joining(",")); }
对后缀表达式进行运算
public static String dealEquation(String equation){ String [] arr = equation.split(","); List<String> list = new ArrayList<String>(); for (int i = 0; i < arr.length; i++) { int size = list.size(); switch (arr[i]) { case "+": double a = Double.parseDouble(list.remove(size-2))+ Double.parseDouble(list.remove(size-2)); list.add(valueOf(a)); break; case "-": double b = Double.parseDouble(list.remove(size-2))- Double.parseDouble(list.remove(size-2)); list.add(valueOf(b)); break; case "*": double c = Double.parseDouble(list.remove(size-2))* Double.parseDouble(list.remove(size-2)); list.add(valueOf(c)); break; case "/": double d = Double.parseDouble(list.remove(size-2))/ Double.parseDouble(list.remove(size-2)); list.add(valueOf(d)); break; default: list.add(arr[i]); break; } }
接收一个输入参数n,然后随机产生n道加减乘除,结果和运算式一同输出到result.txt文件中
BufferedWriter bw = new BufferedWriter(new FileWriter("C:\Users\xiaoqing\Desktop\untitled\result.txt"));
bw.write("2016012086"); while (s-- > 0) {
bw.newLine();
bw.write(p);
}
bw.close();
5.测试运行:
6.不足与改进:
(1)代码增加括号的部分由于时间关系只完成了一部分,未能完全实现;
(2)代码扩展性有待提高,由四个扩展的较少的话容易完成,但扩展太多较为麻烦。
7.项目总结:
本以为三四天可以完成的代码,却用了一个星期多。在开始代码的编写时,毫无头绪,后来采用了书中和老师所推荐的“逐步求精”的设法方法,将一个项目分解成几个不同的小问题,通过编写不同的方法来逐步解决
每个问题。一开始把任务分成几个模块,但在编码的过程中也有许多自己解决不了的问题,问题的解决方案是先上网查资料,然后编写代码,通过请教同学发现有更好
用的方法,然后得到进步。做一个项目可以学习到很多,在实践中学习,在请教中进步。
8.PSP展示:
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
10 |
5 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
6 |
Development |
开发 |
500 |
650 |
· Analysis |
· 需求分析 (包括学习新技术) |
50 |
70 |
· Design Spec |
· 生成设计文档 |
10 |
10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
5 |
5 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
5 |
· Design |
· 具体设计 |
10 |
20 |
· Coding |
· 具体编码 |
400 |
450 |
· Code Review |
· 代码复审 |
10 |
20 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
25 |
Reporting |
报告 |
10 |
30 |
· Test Report |
· 测试报告 |
5 |
8 |
· Size Measurement |
· 计算工作量 |
1 |
1 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
20 |