项目代码地址: https://coding.net/u/liuseshz/p/Week2_2/git?public=true
一.需求分析
(1) 随机生成所需 n 道加减乘除练习题, 以符号 +-*÷ 表示
(2) 题中每个数字为 0 和 100 之间的整数
(3) 运算符在 3 个到 5 个之间
(4) 每个练习题必包含不少于两种运算符
(5) 运算过程与结果不能出现负数与非整数
(6) 学号, 练习题及正确计算结果输出至目标 txt 文件, 输出不含其它信息
二.功能设计
基本功能
(1)随机生成输入参数为 n 的 n 道 100 以内加减乘除运算 (分别使用符号 +-*÷ 来表示)(2) 实现 3 到 5 个运算符, 两种以上的运算, 计算过程不包含负数与非整数
附加功能(暂不考虑)
(1)支持有括号的运算式, 包括出题与求解正确答案算式中存在的括号必须大于 2 个, 且不得超过运算符的个数
(2)加入支持真分数加减法的出题与运算, 支持运算时分数的自动化简
三.设计实现
在不考虑附加功能的情况下, 分成生成与计算两部分
随机数与随机运算符生成, 用 Random 函数实现
- char[] sign = { +, -, *, ÷};
- // 用数组存运算符
- Random random = new Random();
- int m = random.nextInt(3) + 3;
- // 随机生成 3-5 个运算符数
- int index=(int)(Math.random()* m);
- char a[]=new char[m-1];
- int num[]=new int[5];
- for(int i=0;i<m+1;i++)
- {
- num[i]=(int) ( Math.random() *100 );
- // 随机取一百内整数
- for(int j=0;j<m;j++)
- {
- a[j]=sign[index];
- // 随机取运算符
- }
- }
算式生成
- if (m==3)
- {
- System.out.println(num[0]+a[0]+num[1]+a[1]+num[2]+a[2]+num[3]+"="+sum);
- }
- // 运算符个数为 3 时的运算式
- if (m==4)
- {
- System.out.println(num[0]+a[0]+num[1]+a[1]+num[2]+a[2]+num[3]+a[3]+
- num[4]+"="+sum);
- }
- // 运算符个数为 4 时的运算式
- if (m==5)
- {
- System.out.println(num[0]+a[0]+num[1]+a[1]+num[2]+a[2]+num[3]+a[3]+
- num[4]+a[4]+num[5]+"="+sum);
- }
- // 运算符个数为 5 时的运算式
四.算法详解
由于算法知识匮乏, 整个代码结构中只用到了简单的判断语句, 没有考虑括号的问题, 计算时准备使用逆波兰的后缀表示法, 但在套用时遇到了困难, 最后使用了很繁琐的办法
下面是百度到的后缀表达式算法
- class PostToResult{
- private String post; // 中缀表达式转换得到的后缀表达式
- private Stack<integer> stack; // 用于得到计算结果的栈
- public PostToResult(String post, Stack<integer> stack) {
- this.post = post;
- this.stack = stack;
- }
- // 由后缀表达式得到四则运算结果的实现过程
- public void operate(){
- String[] strArr = post.split(" ");
- for(int i = 0; i <strArr.length; i++){
- String temp = strArr[i];
- if(isDigital(temp)){
- stack.push(Integer.valueOf(temp));
- }else{
- int result = compute(temp);
- stack.push(result);
- }
- }
- }
- private int compute(String str){
- int re = 0;
- int m = stack.pop();
- int n = stack.pop();
- switch(str){
- case "+" :
- re = n + m;
- break;
- case "-" :
- re = n - m;
- break;
- case "*" :
- re = n * m;
- break;
- case "/" :
- re = n / m;
- break;
- default :
- break;
- }
- return re;
- }
- private boolean isDigital(String str){
- char[] chArr = str.toCharArray();
- int len = chArr.length;
- int count = 0;
- for(int i = 0; i < len; i++){
- if(chArr[i]>= 0 && chArr[i] <= 9)
- count++;
- }
- return count == len;
- }
- public int getResult() {
- return stack.pop();
- }
- }
五.测试运行
六.代码展示
七.总结
由于 Java 基础不怎么好, 长时间没有用的关系, 写代码时仿佛是在重学, 在编码时一直磕磕绊绊之前的习惯不太好, 每次写完代码都几乎不测试, 只是简单的运行一下, 在很多时候就直接跳过了这次测试时反反复复对代码进行修改纠错, 结果还是不尽人意在网上参考了各路网友的代码, 可能是之前没好好学的原因, 也不怎么看得懂此次作业过后, 我认为我应该加强自己的编码能力, 重拾 Java, 多打代码, 尽早摆脱啥都不会的窘境
八.展示 PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间 (min) | 实际完成需要的时间 (min) |
Planning | 计划 | 10 | 10 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 10 |
Development | 开发 | 315 | 688 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 60 |
· Design Spec | · 生成设计文档 | 5 | 8 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 20 | 40 |
· Coding | · 具体编码 | 180 | 480 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 40 | 60 |
Reporting | 报告 | 30 | 26 |
· Test Report | · 测试报告 | 10 | 8 |
· Size Measurement |
· 计算工作量 | 10 | 8 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 | 10 | 10 |
来源: http://www.bubuko.com/infodetail-2538800.html