2016012032小学四则运算练习软件项目报告
Coding.net源码仓库地址:https://coding.net/u/hahahahaoleng/p/calc_demo/git
一、需求分析
1,程序可以接收一个参数n,然后随机生成n道小学四则运算题
2,每个数字都必须在0~100以内
3,每个运算式必须包括3~5个运算符并且至少有两种运算符
4,运算式在运算过程中不能出现小数以及负数
5,将学号以及输出的n道运算题包括答案一起输出到result.txt文件中
二、功能设计
需要两个数组,一个用来装数字,一个用来装符号。
分析加减乘除的具体情况。
写出两组随机数分别随机数字与符号
重点解决负数,整除问题。
三、设计实现
使用了两个 逆波兰公式,一个用来产生随机的四则运算,一个用来判断其是否符合要求,即计算过程中有无出现分数小数的情况。如何生成随机四则运算不算太艰难,但是如何去除小数,负数,无法整除的情况是难点重点。我使用了两个 逆波兰公式,一个用来产生随机的四则运算,一个用来判断其是否符合要求,即计算过程中有无出现分数小数的情况。
四、算法详解
通过random函数随机生成两组随机数,第一组代表数字,第二组每一个数字代表一种符号。
我使用了逆波兰表达式逆波兰表达式,逆波兰表达式又叫做后缀表达式。它的语法规定,表达式必须以逆波兰表达式的方式给出。
解决小数,负数的问题上,运用了Boolean方法。以true false 来进行判断。
五、测试运行
六、代码展示
产生随机数,符号
char[] ch = {'+','-','*','/'}; //字符数组 Random r = new Random(); int x,i=0; System.out.println("2016012080"); System.out.print ("请输入题目的数量:"); Scanner in=new Scanner(System.in); x=in.nextInt(); while(i<x){ int l = r.nextInt(ch.length); //随机符号 int m = r.nextInt(ch.length); //随机符号 int n = r.nextInt(ch.length); //随机符号 int o = r.nextInt(ch.length); //随机符号 int a=(int)(Math.random()*99)+1;//随机生成一个1-99的整数 int b=(int)(Math.random()*99)+1;//随机生成一个1-99的整数 int c=(int)(Math.random()*99)+1;//随机生成一个1-99的整数 int d=(int)(Math.random()*99)+1;//随机生成一个1-99的整数 int e=(int)(Math.random()*99)+1;//随机生成一个1-99的整数 int g=(int)(Math.random()*3)+3;//生成四则运算的位数
计算逆波兰式
private static void evoe(ArrayList<String> strArr){ String str = ele.getOperations(); boolean flag = true; //判断过程中是否有负数或小数 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 "-" : if(b-a < 0) flag=false; stack.push(String.valueOf(b-a)); break ; case "*" : stack.push(String.valueOf(a*b)); break; case "/" : if(a == 0) {a = 1;flag = false;} if(b/a*a != b) flag = false; stack.push(String.valueOf(b/a)); break ; } } catch (Exception e) { } } } ele.setResult(Integer.parseInt(stack.pop())); return flag; }
七、展示psp
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
10 |
30 |
· Estimate |
·估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
10 |
Development |
开发 |
300 |
600 |
· Analysis |
·需求分析 (包括学习新技术) |
20 |
15. |
· Design Spec |
·生成设计文档 |
15 |
17 |
· Design Review |
·设计复审 (和同事审核设计文档) |
10 |
30 |
· Coding Standard |
·代码规范 (为目前的开发制定合适的规范) |
10 |
3 |
· Design |
·具体设计 |
15 |
25 |
· Coding |
·具体编码 |
120 |
1200 |
· Code Review |
·代码复审 |
10 |
20 |
· Test |
·测试(自我测试,修改代码,提交修改) |
15 |
50 |
Reporting |
报告 |
10 |
30 |
· Test Report |
测试报告 |
5 |
3 |
· Size Measurement |
·计算工作量 |
5 |
3 |
· Postmortem & Process |
·事后总结, 并提出过程改进计划 |
5 |
9
|
八、总结
一开始我觉得这个作业没有多少难度。当我真正开始着手做的时候才发现问题的繁多与自己的才疏学浅。一开始我用最笨的方法分析了每一种符号出现的情况,做了一下午只做出的三个符号着一种情况。我知道自己的方法虽然能做出与题目要求差不多的效果,但是工程量太大,做到一半就放弃了。我才知道自己的知识储备是多么的匮乏。后来查阅了大量的资料与代码,又经室友的提醒学习了逆波兰算法,终于算是完成了。基本理解了代码的意思与这么做的意义。
这次的作业过程十分艰辛困难,由于自己之前的怠慢,又使得难上加难。我深刻了解到了软件工程的艰苦,并需要及时加强自己的代码能力,不能再眼高手低了。这次作业我也知道了代码不只是一些if语句的堆砌,而是需要更高层次的代码思想。
这次的作业存在许多的不足之处。我只使用了一个类,导致出现几百行的代码,难以查错与维护。这些我会在之后的学习与实践中渐渐完善。