四则运算-
四则运算
项目总结
李瑞超
软件工程2016012038
2018年3月25号
原码仓库地址:https://git.coding.net/lrc331/four.git
一、前言
这个项目对我来说难度还挺大的,其实当初学前端所以Java课并没有投入很多时间去学习,在最开始我一直在研究用JavaScript来实现,并且实现了不带扩号、题目和答案分开。后来老师强调只能用Java,但是对我来说很有难度。
二、需求分析
数字在0~100之间,运算符在3~5个,每个练习题至少含有两个运算符。
程序接收参数n,然后随机产生n到四则运算题目,例如当接收参数为4是,输出:
2018012023
13+17-1=19
11*15-5=160
3=10+4-16=1
15÷5+3-2=4
练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致;
使用Java语言,生成文件时请使用相对路径,生成的TXT文件需要在项目的根目录下,可直接查看演示示例。
使用的JDK版本是jdk8u161,使用的JRE版本为jre8u161。
不得使用除限定版本jdk与jre外的额外依赖包。
三、功能设计
- 基本功能:实现四则混合运算出题,计算完成,使答案和题目分开。
- 扩展功能:未实现。
四、算法详解
1.生成固定范围随机数
private static int rand(int min,int max){ return (int)(min)+(int)Math.round(Math.random()*(max-min)+min); }
2..创建两个栈类,数字栈:
package src; public class MyStack { private int array[]=new int [20]; private int index=-1; public void push(int i){ index++; array[index]=i; } public int getTop(){ return array[index]; } public int pop(){ int j=array[index]; index--; return j; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
运算符栈:
package src; public class MyStackChar { private char array[] = new char[20]; private int index = -1; public void push(char i) { index++; array[index] = i; } public char getTop() { return array[index]; } public char pop() { char j = array[index]; index--; return j; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
package src; import java.util.Scanner; public class SiZeYunSun { public static void main(String[] args) { Scanner sca = new Scanner(System.in); String str = sca.nextLine(); MyStack num = new MyStack(); MyStackChar fuhao = new MyStackChar(); String digit = ""; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (Character.isDigit(c)) { digit += c; } else { num.push(Integer.parseInt(digit)); digit = ""; if (c == '=') { int after = num.pop(); int before = num.pop(); char fu = fuhao.pop(); // 运算 int jieguo = yunsuan(after, fu, before); num.push(jieguo); if(fuhao.getIndex()==-1){ System.out.println(num.getTop()); }else{ int after1 = num.pop(); int before1 = num.pop(); char fu1 = fuhao.pop(); // 运算 int jieguo1 = yunsuan(after1, fu1, before1); System.out.println(jieguo1); } } else { if (fuhao.getIndex() == -1) { fuhao.push(c); } else { // 判断入栈出栈并将需要计算的进行计算。 // 如果符号栈有内容,将c与栈顶内容进行比较优先级 // 如果c比栈顶内容高 (true) 将c压栈 // 从栈顶开始取出两个数字,将两个数字与符号栈取出符号进行计算。 // 如果c没有符号栈栈顶内容高(包括同等级别和优先级低)(false)则将符号栈内容取出,数字栈 // 从栈顶开始取出两个数字,将两个数字与符号栈取出符号进行计算。 jisuan(num, fuhao, c); } } } } } public static void jisuan(MyStack num, MyStackChar fuhao, char c) { if (fuhao.getIndex() == -1) { fuhao.push(c); } else { char top = fuhao.getTop(); if (youXianji(c, top)) { // true的情况 fuhao.push(c); } else { // false的情况 int after = num.pop(); int before = num.pop(); char fu = (char) fuhao.pop(); // 运算 int jieguo = yunsuan(after, fu, before); num.push(jieguo); jisuan(num, fuhao, c); } } } public static int yunsuan(int after, char top, int before) { int result = 0; switch (top) { case '+': result = before + after; break; case '-': result = before - after; break; case '*': result = before *after; break; case '/': result = before / after; break; } return result; } public static boolean youXianji(char c, char top) { if (top == '*' || top == '/') { return false; } else if (c == '*' || c == '/') { return true; } else { return false;
五、运行测试
六、总结
上面的截图是我JavaScript的最后结果,Java的完整程序我并没有写完,只完成了上面的代码学习。我已经尽力把我能做到的都做出来了。没有达到老师的要求我很遗憾,说实话,最近几天挺折磨的,因为不止要为这一件事忙。但我付出了很多努力在这上面,因为一开始在研究js的写法,做好之后发现不可以,又重新学Java,赶得很紧,希望下次提前看好需求,从头一点一点努力吧。
七、psp
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
495 |
|
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
20 |
|
Development |
开发 |
100 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
|
· Design Spec |
· 生成设计文档 |
30 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
|
|
· Design |
· 具体设计 |
40 |
|
· Coding |
· 具体编码 |
120 |
|
· Code Review |
· 代码复审 |
30 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
|
Reporting |
报告 |
60 |
|
· Test Report |
· 测试报告 |
0 |
|
· Size Measurement |
· 计算工作量 |
10 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
5 |
|
实际开发过程中并没与统计时间用量,一直都在用很多零碎的时间做这个事,包括晚上原本很多计划要做的事都没有去做完。感觉还挺成长的把。