2016012031 小学四则运算练习项目
2016012031+小学四则运算练习软件项目报告
Coding.net源码仓库地址: https://git.coding.net/wsshr/Question.git
需求分析
1.程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
2.为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出
现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
3.练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
4.支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。
功能设计
基本功能
生成随机运算符以及随机数
接受键盘输入的数字,产生多行表达式
计算表达式的结果
创建并输出数据到txt文件
输出学号
扩展功能
表达式中带有括号时判断优先级
运算过程中没有负数和分数的产生
设计实现
随机运算符以及随机数我通过random函数产生,运算符由基本数据型态转换成String 型。
在lib类我存放了数据属性以及方法,在主类里我通过随机逆波兰式然后利用它转化为带括号的运算式并计算结果。逆波兰表达式的参数通过栈来储存。
算法详解
因为在写代码的过程中,为表达式输出结果这个方面我就一直很疑惑。
所以我在网上查了很多资料,发现普遍用的都是逆波兰表达式和栈去求的结果。
所以我就学习网上的先生成了随机的逆波兰式,通过switch case条件语句来对运算符进行判断,并通过if语句控制数字的出入栈。运算式则通过逆波兰
式的后缀转中缀转成的。
测试运行
代码展示
通过逆波兰式计算结果
private static boolean evoe(ArrayList<String> strArr){ String str = ele.getOperations(); boolean flag = true; int temp = 0; Stack<String> stack = new Stack<String>(); for(String s : strArr){ if(!str.contains(s)){ stack.push(s); }else{ int a = Integer.valueOf(stack.pop()); int b = Integer.valueOf(stack.pop()); try { switch(s){ case "+" : stack.push(String.valueOf(a+b)); break; case "-" : temp = b-a; if(temp < 0) flag=false; stack.push(String.valueOf(temp)); break ; case "*" : stack.push(String.valueOf(a*b)); break; case "/" : if(a == 0) {a = 1;flag = false;} temp = b/a; if(a*temp != b) flag = false; stack.push(String.valueOf(temp)); break ; } } catch (Exception e) { } } } ele.setResult(Integer.parseInt(stack.pop())); return flag; }
随机生成逆波兰表达式
public static void test(){ ArrayList<String> strArr=new ArrayList<String>(); List list = Collections.synchronizedList(strArr); N = new Random().nextInt(4)+2; synchronized(list) { strArr.clear(); for (int i = 0; i < N; i++) { strArr.add(ele.random_N()); } for (int i = 0; i < N - 2; i++) { strArr.add(new Random().nextInt(strArr.size() - N + 1) + N - 1, ele.random_E()); } strArr.add(strArr.size(), ele.random_E()); } ele.setStrArr(strArr); }
总结
在这次作业中,我是在边学边写,虽然逆波兰表达式和栈的用法还是不太清楚,但还是收获到了很多的知识。在之前一直觉得不知道怎么去练习编程,
通过这次的作业发现还是有很多途径去学习和练习。同时也在写作业的过程中发现了编程的乐趣。
展示PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(h) |
实际完成需要的时间(h) |
Planning |
计划 |
5 |
4 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
5 |
4 |
Development |
开发 |
59 |
76 |
· Analysis |
· 需求分析 (包括学习新技术) |
10 |
25 |
· Design Spec |
· 生成设计文档 |
0.5 |
0.5 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0.5 |
0.5 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
3 |
3 |
· Design |
· 具体设计 |
5 |
5 |
· Coding |
· 具体编码 |
30 |
25 |
· Code Review |
· 代码复审 |
5 |
10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
5 |
7 |
Reporting |
报告 |
3 |
3 |
· Test Report |
· 测试报告 |
1 |
1 |
· Size Measurement |
· 计算工作量 |
1 |
1 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
1 |
1 |