week_2 四则运算
coding地址: https://git.coding.net/lvgx/week_2.git
一. 需求分析
1.接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题
2.每个数字在 0 和 100 之间,运算符在3个到5个之间。
3.每个练习题至少要包含2种运算符。
4.所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
5.练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
附加需求(改进部分):
1.支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。
2.扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1 /6=2/3,而非4/6,且计算过程中与结果都须为真分数。
二.功能设计
实现点击可执行程序,出现提示词“请输入要生成的运算式”,运行结束,显示运算式,且运算式满足题目要求。最后计算结束,可以点击文件“result.txt”,对照答案。
三.设计实现
设计了三个类
main:主函数,实现输出运算式,运算的功能
symbol:随机实现运算符
randomnumber:随机生成随机数
四.算法详解
1.生成随机数
有Math类的random()方法以及Random类生成随机数两种方式,选择了第一种较为熟悉便捷的方法,并将生成随机数的方法装入一个类,便于调用,实现模块化
2.生成随机符号
将四种运算符装入一个数组中,通过生成随机数,对应到数组的检索值,并且个数满足设定范围,当几个随机符号一致时,将最后一个重新生成且不同于其他符号,并且覆盖掉最后一个字符,实现生成随机运算符的步骤
3.生成运算式
将生成的随机数放在一个数组里,将生成的运算符放在一个数组里,将二者合并,去除逗号括号,输出
4.获取生成个数N
通过函数获取输入数字,并判断其是否为正整数,且满足设定范围。
5.运算式的计算
通过迭代进行运算符优先级的判定,进行正常的运算
6.txt文件的生成
五.测试运行
六.代码
int results; int n=numberTest(); //生成问题---------------------------------------------------- Result result = new Result(); String[] boxs = new String[n]; for(int j=0; j<n;) { //随机生成运算符的个数 int Snum = (int) (Math.random() * 4 + 2); //随机生成的数字个数 int Nnum = Snum + 1; //创建一个链表,并填入随机数 int[] nums = new int[Nnum]; for (int i = 0; i <= nums.length - 1; i++) { nums[i] = (int) (Math.random()*101); } //创建一个字符链表,并填入随机运算符 char[] sysmbols = new char[Snum]; for (int i = 0; i <= sysmbols.length - 1; i++) { sysmbols[i] = Symbol.symbol(); } //连接两个链表,获得运算式 Object[] temp = new Object[Snum + Nnum+3]; for (int i = 0; i <Snum + Nnum; i += 2) { temp[i] = nums[i / 2]; } for (int i = 1; i <Snum + Nnum; i += 2) { temp[i] = sysmbols[i / 2]; } List<Integer>resultN = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { resultN.add(nums[i]); } List <Character>resultS = new ArrayList<>(); for (int i = 0; i < sysmbols.length; i++) { resultS.add(sysmbols[i]); } Box box = new Box(resultN,resultS); results = result.getResult(box); if(results > 0 ) { temp[Snum + Nnum] = '='; temp[Snum + Nnum+1] = results; temp[Snum + Nnum+2]= "\r\n"; boxs[j] = Arrays.toString(temp).replace(',', ' ').replace('[', ' ').replace(']', ' ') ; j++; } else continue; //生成完毕-------------------------------------------------------- //输出 result.outQuestion(boxs); System.out.println(Arrays.toString(temp).replace(',', ' ').replace('[', ' ').replace(']', ' '));
七.总结
其实对于java我并不是非常熟悉,可以说非常薄弱了,对于一个程序,我可能有一定的思维,但是因为不熟悉这门语言而不能熟练的运用相关函数,所以觉得这次作业对我来讲比较困难。通过这次作业,我深深的明白自己的代码能力有多薄弱,别人很快能编辑好的函数方法,我却要查询尝试多次才能实现。这促使我对java学习,有了一个微小的提高,因为只有不断应用,才能更加深刻的了解他的含义。所以我个人觉得,通过项目可以较好的促进个人的学习。还有非常感谢课代表张航同学,是他的耐心和帮助,才能使我在规定时间完成作业。故而有些内容是借鉴张航同学的博客http://www.cnblogs.com/zanghh/
还有我觉得讨论式学习有助于大家共同的提高,就比如说大家交流,互相学习发现还可以通过js成熟的eval函数可以简化运算过程等
八.PSP
SP2.1 |
任务内容 |
计划共完成需要的时间(h) |
实际完成需要的时间(h) |
Planning |
计划 |
25 |
50 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
25 |
50 |
Development |
开发 |
20 |
45 |
· Analysis |
· 需求分析 (包括学习新技术) |
3 |
5 |
· Design Spec |
· 生成设计文档 |
0 |
0 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
0 |
0 |
· Design |
· 具体设计 |
3 |
5 |
· Coding |
· 具体编码 |
10 |
25 |
· Code Review |
· 代码复审 |
2 |
4 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
2 |
6 |
Reporting |
报告 |
5 |
5 |
· Test Report |
· 测试报告 |
4 |
4 |
· Size Measurement |
· 计算工作量 |
0.5 |
0.5 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
0.5 |
0.5 |
九.不足
通过这次小小的项目,我认识到自己知识储备量的不足,也意识到不动手,只会一些理论的东西,并不能提高自己的能力。我会更加努力,做出更好的程序