代码仓库地址:https://git.coding.net/qiuyuwutong/operation.git
一、需求分析
二、功能设计
(一)基础功能
- 输入参数n,随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题
- 数字在 0 和 100 之间,运算符在3个到5个之间
- 每个练习题至少要包含2种运算符
- 在运算过程中不得出现负数与非整数
- 将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中
(二)拓展功能
- 支持有括号的运算式
- 扩展程序功能支持真分数的出题与运算,(只需要涵盖加减法即可)
三、设计分析及代码展示
(一)判断输入是否合法
输入的参数n是否合法,如果是字符,自动转化为数字;如果是非整数,提示再次输入
try { int n = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.out.println("输入格式有误,请重新输入"); e.printStackTrace(); }
(二)随机生成运算数和运算符
利用math.random()类生成生成给定范围的随机数;将运算符“+,-,*,/”存储到一个数组内,利用math.random()类生成访问数组的小标,来随机生成运算符
char[] operator= new char[]{'+','-','*','/'}; Random random = new Random(); for (int i = 0; i < num; i++) { String ex = new String(); int n = random.nextInt(3)+3;//产生3-5个运算符 int[] number = new int[n+1];//运算数要比运算符加一 for (int j = 0; j <= n; j++) { number[j] = random.nextInt(99)+1; } for (int j = 0; j < n; j++) { int op = random.nextInt(4);//产生随机运算符 ex+=String.valueOf(number[j])+String.valueOf(operator[op]); if(op==3){ number[j+1] = judge(number[j],number[j+1]); } } ex+=String.valueOf(number[n]); }
在遇到‘/’时,判断被除数是否能整除除数,如果不能,重复生成除数,直到能被被除数整除
private static int judge(int x,int y){ Random random = new Random(); if(x%y!=0){ y = random.nextInt(99)+1; return judge(x,y); }else{ return y; } }
(三)计算表达式
利用js里面的eval()函数来计算生成的表达式
static ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); public static String calculateExpression(String ex){ try { return String.valueOf(engine.eval(ex)); } catch (ScriptException e) { e.printStackTrace(); return null; } }
(四)判断生成的算式是否正确
如果算式结果是负数或者是小数,则重新生成算式
int answer = Integer.valueOf(Calculate.calculateExpression(ex)); if(answer>0){ ex+="="+Calculate.calculateExpression(ex); expression.add(ex); }else{ i--; }
四、算法详情
(1)随机生成运算式
嵌套了两层for循环,外面一层用来控制生成运算式的个数,里面一层用来控制运算符和运算数的个数
(2)计算运算式结果
使用ScriptEngine调用js脚本即可调用eval函数,eval() 函数可计算某个字符串,并执行其中的的JavaScript代码。
五、测试运行
六、总结
在实际开发这个命令行软件时,我将其分为了产生随机运算式、计算随机运算式、将运算式打印到txt文件中这三个大板块进行设计,一步步攻克了每一个板块,最后在Main函数中合在了一起。当然这过程中也有许多不足,比如,附加功能中的加入括号和真分数运算没有完成,其次,在计算随机表达式时,只是运用了js里面现成的eval()函数,没有运用到相应算法。项目比我想象中难得很多,自己查阅了许多资料,在不断出现问题,解决问题中完善着自己的代码与功能,这一过程让我收获满满。
七、展示PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
10 |
10 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
10 |
Development |
开发 |
464 |
714 |
· Analysis |
· 需求分析 (包括学习新技术) |
50 |
62 |
· Design Spec |
· 生成设计文档 |
10 |
10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
8 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
4 |
4 |
· Design |
· 具体设计 |
15 |
15 |
· Coding |
· 具体编码 |
360 |
600 |
· Code Review |
· 代码复审 |
10 |
10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
5 |
5 |
Reporting |
报告 |
10 |
10 |
· Test Report |
· 测试报告 |
5 |
5 |
· Size Measurement |
· 计算工作量 |
2 |
3 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
3 |
2 |