第一次作业
2017-09-24 11:19
169 查看
一、需求分析
1. 控制生成题目的个数
2. 控制题目中数值(自然数、真分数和真分数分母)的范围
3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。
4. 每道题目中出现的运算符个数不超过3个。
5. 程序一次运行生成的题目不能重复,生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:
1. 四则运算题目1
2. 四则运算题目2
6. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:
1. 答案1
2. 答案2
特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。
7. 程序应能支持一万道题目的生成。
8. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,并会输出所有题目中重复的题目,输入参数如下:
统计结果输出到文件Grade.txt,格式如下:
Correct: 5 (1, 3, 5, 7, 9)
Wrong: 5 (2, 4, 6, 8, 10)
Repeat:2
RepeatDetail:
(1) 2,45+32 Repeat 3,32+45
(2) 5,3+(2+1) Repeat 7,1+2+3
二、功能设计
1.在控制台输入题目的数量及生成数的范围
2.在文本中记录所有生成的题目
3.在文本中记录每道题对应的正确答案
4.把正确答案和做题者输入的答案进行对比,在文本中计算出正确和错误的题目数量并标记题号
三、设计实现
我并没有用什么高级的方法,自己也并没有学过那些高端算法。我的基本想法全部都是借用数组来实现,比如将一个算数表达式分成一个一个的字符存到数组里面,再从数组里面一个一个拿出去用,不过基本实现了老师所要求的内容,这里我对一些重要方法进行说明一下:
fuhao():随机返回一个符号(加,减,乘,除)
eqrandom(String[] randomMade,int i):随机生成算数表达式,并分别将他们存到数组里面
syssome(int numberquestion):计算答对多少道题目和最后得分并输出
createFile(String filename):根据文件名创建文件
question(int d):将产生的问题和对应的正确答案分别写到相应的文件中,并接受用户输入的自己的答案
eventual(String[] eq):根据问题算出正确的整数,带分数和真分数
thebiggest(int a,int b):计算公约数
四、部分代码说明
计算公约数的代码如下:
根据问题描述计算得出真分数,带分数及整数的代码如下:
随机产生算数表达式:
五、测试运行
与用户进行交互,并显示计算结果:
根据问题将标准答案保存到文件里面:
将产生的问题保存到文件里面:
将与用户交互的结果保存到文件里面:
六、PSP展示
七、总结与反思
记得大一的时候也是用javac实现一个图形界面的计算器,从来都是随心所欲地想怎么写就怎么写,虽然自由度很大,但是无形之中浪费我很多时间,也没有任何规划。我第一次使用psp,有种很正式的感觉,虽然感到一些限制,但总可以对自己做了多少,耗费了多少时间,哪里耗费时间多了,得到一个全面的评价,从而看到自己的一些缺点,这个psp很有用!
附上我的代码地址:https://coding.net/u/aaa2222339/p/Calculate/git
1. 控制生成题目的个数
2. 控制题目中数值(自然数、真分数和真分数分母)的范围
3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。
4. 每道题目中出现的运算符个数不超过3个。
5. 程序一次运行生成的题目不能重复,生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:
1. 四则运算题目1
2. 四则运算题目2
6. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:
1. 答案1
2. 答案2
特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。
7. 程序应能支持一万道题目的生成。
8. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,并会输出所有题目中重复的题目,输入参数如下:
统计结果输出到文件Grade.txt,格式如下:
Correct: 5 (1, 3, 5, 7, 9)
Wrong: 5 (2, 4, 6, 8, 10)
Repeat:2
RepeatDetail:
(1) 2,45+32 Repeat 3,32+45
(2) 5,3+(2+1) Repeat 7,1+2+3
二、功能设计
1.在控制台输入题目的数量及生成数的范围
2.在文本中记录所有生成的题目
3.在文本中记录每道题对应的正确答案
4.把正确答案和做题者输入的答案进行对比,在文本中计算出正确和错误的题目数量并标记题号
三、设计实现
我并没有用什么高级的方法,自己也并没有学过那些高端算法。我的基本想法全部都是借用数组来实现,比如将一个算数表达式分成一个一个的字符存到数组里面,再从数组里面一个一个拿出去用,不过基本实现了老师所要求的内容,这里我对一些重要方法进行说明一下:
fuhao():随机返回一个符号(加,减,乘,除)
eqrandom(String[] randomMade,int i):随机生成算数表达式,并分别将他们存到数组里面
syssome(int numberquestion):计算答对多少道题目和最后得分并输出
createFile(String filename):根据文件名创建文件
question(int d):将产生的问题和对应的正确答案分别写到相应的文件中,并接受用户输入的自己的答案
eventual(String[] eq):根据问题算出正确的整数,带分数和真分数
thebiggest(int a,int b):计算公约数
四、部分代码说明
计算公约数的代码如下:
int k = 1; int math = 0; if (a < 0){ a = -a; } if (b < 0 ){ b = -b; } while (k <= a && k <= b){ if (a % k == 0 && b % k == 0){ math = k; } k++; } return math;
根据问题描述计算得出真分数,带分数及整数的代码如下:
if (equalnumber >= 1){ if (eq[1] != "/" && eq[1] != "*"){ for (int s = 3; s < arraylength(eq); s = s + 2){ if (eq[s] == "*" || eq[s] == "/"){ control = false; String[] RPG2 = new String[10000]; for (int i = 0; i < arraylength(eq) - 2; i++) { RPG2[i] = eq[s - 1 + i]; } for (int i = 0; i < arraylength(eq) - 2; i++){ if (i < s - 1){ RPG[i] = eq[i]; } else if (i == s - 1){ equalnumber = 0; RPG[i] = eventual(RPG2); } else { RPG[i] = eq[i + 2]; } if (i == arraylength(eq) - 3){ equalnumber = 0; res = eventual(RPG); } } } else { if (control == true){ String[] RPG2 = new String[10000]; for (int i = 0; i < arraylength(eq) - 2; i++){ RPG2[i] = eq[i]; } equalnumber = 0; for (int i = 0; i < arraylength(eq) - 2; i++){ if (i == 0){ RPG[i] = eventual(RPG2); } else { RPG[i] = eq[i + 2]; } if (i == arraylength(eq) - 3){ res = eventual(RPG); } } } } } } else{ if (control == true){ String[] RPG2 = new String[10000]; for (int i = 0; i < 3; i++){ RPG2[i] = eq[i]; } equalnumber = 0; for (int i = 0; i < arraylength(eq) - 2; i++){ if (i == 0){ RPG[i] = eventual(RPG2); } else { RPG[i] = eq[i + 2]; } if (i == arraylength(eq) - 3){ res = eventual(RPG); } } } } } else { int con0 = 0; int con2 = 0; for (int i = 0; i < eq[0].length(); i++){ if (eq[0].charAt(i) == '/'){ con0 = 1; } } for (int i = 0; i < eq[2].length(); i++){ if (eq[2].charAt(i) == '/'){ con2 = 1; } } if (con0 == 0 && con2 == 0){ switch (ss) { case '+': res = Integer.toString(Integer.parseInt(eq[0]) + Integer.parseInt(eq[2])); break; case '-': res = Integer.toString(Integer.parseInt(eq[0]) - Integer.parseInt(eq[2])); break; case '*': res = Integer.toString(Integer.parseInt(eq[0]) * Integer.parseInt(eq[2])); break; case '/': realnumber = Integer.parseInt(eq[0]) / Integer.parseInt(eq[2]); fenzi = Integer.parseInt(eq[0]) % Integer.parseInt(eq[2]); fenmu = Integer.parseInt(eq[2]); if (Integer.parseInt(eq[0]) >= Integer.parseInt(eq[2])){ if (fenzi != 0){ int k = thebiggest(fenzi, Integer.parseInt(eq[2])); fenzi = fenzi / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + Integer.parseInt(eq[2]) / k; } else { res = Integer.toString(realnumber); } } else { int k = thebiggest(fenzi, Integer.parseInt(eq[2])); fenzi = fenzi / k; res = Integer.toString(fenzi) + "/" + Integer.parseInt(eq[2]) / k; } break; default: break; } } else if (con0 == 1 && con2 == 0){ int fz = realnumber * fenmu + fenzi; switch (ss) { case '+': fz = fz + Integer.parseInt(eq[2]) * fenmu; realnumber = fz / fenmu; fenzi = fz % fenmu; if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fenmu; } else { int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fenmu; } } break; case '-': fz = fz - Integer.parseInt(eq[2]) * fenmu; realnumber = fz / fenmu; fenzi = fz % fenmu; if (fz == 0){ res = "0"; } else if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fenmu; } else { int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fenmu; } } break; case '*': fz = fz * Integer.parseInt(eq[2]); realnumber = fz / fenmu; fenzi = fz % fenmu; if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fenmu; } else { int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fenmu; } } break; case '/': fenmu = Integer.parseInt(eq[2]) * fenmu; realnumber = fz / fenmu; fenzi = fz % fenmu; if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fenmu; } else { int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fenmu; } } break; default: break; } } else if (con0 == 0 && con2 == 1){ int fz = realnumber * fenmu + fenzi; switch (ss) { case '+': fz = Integer.parseInt(eq[0]) * fenmu +fz; realnumber = fz / fenmu; fenzi = fz % fenmu; if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fenmu; } else { int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fenmu; } } break; case '-': fz = Integer.parseInt(eq[0]) * fenmu - fz; realnumber = fz / fenmu; fenzi = fz % fenmu; if (fz == 0){ res = "0"; } else if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fenmu; } else { int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fenmu; } } break; case '*': fz = Integer.parseInt(eq[0]) * fz; realnumber = fz / fenmu; fenzi = fz % fenmu; if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fenmu; } else { int k = thebiggest(fenzi, fenmu); fenzi = fenzi / k; fenmu = fenmu / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fenmu; } } break; case '/': int fz1 = fz; fz = Integer.parseInt(eq[0]) * fenmu; realnumber = fz / fenmu; fenzi = fz % fenmu; if (realnumber == 0 && fenzi != 0){ int k = thebiggest(fz, fenmu); fz = fz / k; fenmu = fenmu / k; res = Integer.toString(fz) + "/" + fenmu; } else if (realnumber != 0 && fenzi == 0){ res = Integer.toString(realnumber); } else if (realnumber != 0 && fenzi != 0){ if (fenzi > 0){ int k = thebiggest(fenzi, fz1); fenzi = fenzi / k; fz1 = fz1 / k; res = Integer.toString(realnumber) + "'" + Integer.toString(fenzi) + "/" + fz1; } else { int k = thebiggest(fenzi, fz1); fenzi = fenzi / k; fz1 = fz1 / k; res = Integer.toString(realnumber) + "'" + Integer.toString(-fenzi) + "/" + fz1; } } break; default: break; } } else { } }
随机产生算数表达式:
if (equalnumber == 0){ randomMade[0] = Integer.toString(new Random().nextInt(i) + 1); randomMade[1] = fuhao(); randomMade[2] = Integer.toString(new Random().nextInt(i) + 1); } else if (equalnumber == 1){ randomMade[0] = Integer.toString(new Random().nextInt(i) + 1); randomMade[1] = fuhao(); randomMade[2] = Integer.toString(new Random().nextInt(i) + 1); randomMade[3] = fuhao(); randomMade[4] = Integer.toString(new Random().nextInt(i) + 1); } else{ randomMade[0] = Integer.toString(new Random().nextInt(i) + 1); randomMade[1] = fuhao(); randomMade[2] = Integer.toString(new Random().nextInt(i) + 1); randomMade[3] = fuhao(); randomMade[4] = Integer.toString(new Random().nextInt(i) + 1); randomMade[5] = fuhao(); randomMade[6] = Integer.toString(new Random().nextInt(i) + 1); }
五、测试运行
与用户进行交互,并显示计算结果:
根据问题将标准答案保存到文件里面:
将产生的问题保存到文件里面:
将与用户交互的结果保存到文件里面:
六、PSP展示
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
Planning | 计划 | 5 | 5 |
· Estimate | 估计这个任务需要多少时间 | 1000 | 1500 |
Development | 开发 | 700 | 800 |
· Analysis | 需求分析 (包括学习新技术) | 5 | 5 |
· Design Spec | 生成设计文档 | 0 | 0 |
· Design Review | 设计复审 | 4 | 4 |
· Coding Standard | 代码规范 | 10 | 10 |
· Design | 具体设计 | 20 | 50 |
· Coding | 具体编码 | 700 | 800 |
· Code Review | 代码复审 | 20 | 20 |
· Test | 测试(自我测试,修改代码,提交修改) | 15 | 22 |
Reporting | 报告 | 30 | 20 |
· | 测试报告 | 1 | 1 |
· | 计算工作量 | 1 | 1 |
· | 并提出过程改进计划 | 1 | 1 |
记得大一的时候也是用javac实现一个图形界面的计算器,从来都是随心所欲地想怎么写就怎么写,虽然自由度很大,但是无形之中浪费我很多时间,也没有任何规划。我第一次使用psp,有种很正式的感觉,虽然感到一些限制,但总可以对自己做了多少,耗费了多少时间,哪里耗费时间多了,得到一个全面的评价,从而看到自己的一些缺点,这个psp很有用!
拿破仑: 凡事都要有统一和决断,因此成功不站在自信的一方,而站在有计划的一方。
附上我的代码地址:https://coding.net/u/aaa2222339/p/Calculate/git
相关文章推荐
- 第一次作业
- 全新Linux+Python高端运维班第一次作业
- 软件工程实践2017结对项目——第一次作业
- 第一次作业
- 系统集成项目管理中项培训--李云坤第一次作业(3月7日)
- 第一次作业
- 第一次作业
- c++第一次上机作业1-1
- 第一次作业
- 第一次作业 -- 四则运算题目生成
- 第一次作业答案(官方)
- 软件工程第一次作业程序开发历程
- 软件工程第一次作业
- 关于我的第一次大学商品打折编程作业
- 第一次作业:提五个问题
- 自动化1121 冯庭辉 第一次作业
- 第一次作业:网络数据截获
- 《Java程序设计》第一次作业:简单的JAVA源代码之计算器
- 计算机组成第一次上机作业
- 第一次作业:《国际贸易学》—国际贸易的分类与特点