此次作业的源码地址:https://coding.net/u/ClausKE/p/Calculator1/git/tree/master/
写在前面:这次的作业完成得不易,在跟一些同学的交流中对这次作业有了更多的理解,在咨询了一些较厉害的大佬后,我才学习到了一些新的东西,但因理解得不够完全,只是较为基础地完成了这次作业,不得不说,大一时候在工作室的学习到的一些东西渐渐都忘了,日后要更加努力打好基础。
一、需求分析
1.完成一个程序,输入参数n,随机产生n道加减乘除练习题,每个数字在0和100之间,运算符在3个到5个之间。
2.每个练习题至少包含两种运算符,在练习运算中不能出现负数和非整数。
二、功能设计
1)基本功能:实现简单的加减乘除四则运算,一道题目中包含三到五个符号。这一部分的功能已经实现,可以生成10000道以内任意数量的题目以供小学生进行简单练习;
2)附加功能:支持有括号的运算,支持真分数的出题与运算。这部分还没有实现,希望能在询问同学、与同学交流过后,从同学和老师那儿获得一些帮助。
三、设计实现
我的代码较为简单,实现的功能也较为基础,包含一个Main类,负责设计生成n道题目,其中包含三个方法,分别实现生成一个符号的运算题目、生成多个符号的运算题目和对生成的题目进行计算得值。
四、算法详解
通过比较得出被减数与减数的大小并判断是否交换它们的值来保证不会出现负数的运算,通过对除数与被除数设定关系,保证运算中出现除法都是整除。通过了解,java中有一个eval函数能够对加减乘除进行优先级判断。
五、测试运行
以下是我的生成题目和其对应的计算结果:
六、代码片段
以下代码片段是我用来保证减法运算不会得到负数,除法运算得到的结果都是整除的。
//生成简单的四则运算 public String Sentence1() { int x = (int) (Math.random() * 100);// 定义x为一个100内的数 int y = (int) (Math.random() * 100);// 定义y为一个100内的数 int z = (int) (Math.random() * 4);// 定义z为0或1或2或3 //用z代表符号,z=1则为减法 if (z == 1) {// 如果是减法,保证减数小于被减数 if (x < y) { int temp = x; x = y; y = temp; } } //z=3为除法 if (z == 3) {// 如果是除法,保证能整除 y = (int) (Math.random() * 20) + 1; x = (int) (Math.random() * 6) * y; } //a为表达式 String a = x + symbols1[z] + y; if (symbols1[z].equals("-") || symbols1[z].equals("+")) { flag = 1; } return a; }
//进行计算 public void Sentence3() { Stack<String> num = new Stack<>(); Stack<Character> operate = new Stack<>(); int q = (int) (Math.random() * 2) + 2; String sentence = Sentence2(q);//调用方法sentence2(q),生成多个符号的运算 int l = sentence.length(); int t = 0; int rt = 0; for (int m = -1; m < l - 1; m++) { if (sentence.charAt(m + 1) == ‘+‘ || sentence.charAt(m + 1) == ‘-‘ || sentence.charAt(m + 1) == ‘*‘ || sentence.charAt(m + 1) == ‘÷‘ || m == l - 2) { if (m == -1) { operate.push(sentence.charAt(0)); } else if (m == l - 2) { num.push(sentence.substring(t)); break; } else { if (t <= m) { num.push(sentence.substring(t, m + 1)); } if (operate.empty() ) { operate.push(sentence.charAt(m + 1)); } else if ((operate.peek() == ‘+‘ || operate.peek() == ‘-‘) && (sentence.charAt(m + 1) == ‘*‘ || sentence.charAt(m + 1) == ‘÷‘)) { operate.push(sentence.charAt(m + 1)); } else { if(operate.peek()==sentence.charAt(m + 1)){ rt++; } num.push(String.valueOf(operate.pop())); operate.push(sentence.charAt(m + 1)); } } t = m + 2; } } if(rt==q+2){//符号有无重复 er=1; } while (!operate.empty()) { num.push(String.valueOf(operate.pop())); } String[] result = new String[20]; int g = 0; while (!num.empty()) { result[g] = num.pop(); g++; }
七、总结
我设计的程序用三个方法的相互调用来完成了生成的n道题目,并保证完成了基础的作业要求。经过这次作业,我也体会到了IT行业的不易,软件工程这个专业的不易,虽然我现在做的还只是一个小小的项目,但是我已经意识到了我要为了这份作业付出的努力,未来的编程之路也会更坎坷,需要我不断地学习,与他人交流,向大佬还有老师们提问,借鉴他们逻辑、算法和项目实现过程中的优点。只有努力地学习,才能在未来有一份好的工作,才能为国家做出点贡献。加油!
八、PSP展示
PSP | 任务内容 | 计划时间(h) | 实际完成时间(h) |
planning | 计划 | 0.5 | 1 |
estimate | 估计每个阶段的时间成本,并规划大致工作步骤 | 0.5 | 1 |
development | 开发 | 5 | 7 |
analysis | 需求分析 | 0.5 | 0.5 |
design spec | 生成设计文档 | 0.5 | 0.5 |
design review | 设计复审 | 1 | 1.5 |
coding standard | 代码规范 | 1 | 1 |
design | 具体设计 | 1 | 1 |
coding | 具体编码 | 5 | 10 |
code review | 代码复审 | 2 | 2 |
test | 测试 | 1 | 1 |
reporting | 报告 | 0.5 | 0.5 |
size measurement | 计算工作量 | 0.5 | 0.5 |
postmortem&process improvement plan | 事后总结,并提出过程改进计划 | 1 | 1 |