您的位置:首页 > 其它

第一次作业

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):计算公约数

四、部分代码说明

计算公约数的代码如下:

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.1Personal Software Process StagesTime Senior StudentTime
Planning计划55
· Estimate估计这个任务需要多少时间10001500
Development开发700800
· Analysis需求分析 (包括学习新技术)55
· Design Spec生成设计文档00
· Design Review设计复审44
· Coding Standard代码规范1010
· Design具体设计2050
· Coding具体编码700800
· Code Review代码复审2020
· Test测试(自我测试,修改代码,提交修改)1522
Reporting报告3020
·测试报告11
·计算工作量11
·并提出过程改进计划11
七、总结与反思

  记得大一的时候也是用javac实现一个图形界面的计算器,从来都是随心所欲地想怎么写就怎么写,虽然自由度很大,但是无形之中浪费我很多时间,也没有任何规划。我第一次使用psp,有种很正式的感觉,虽然感到一些限制,但总可以对自己做了多少,耗费了多少时间,哪里耗费时间多了,得到一个全面的评价,从而看到自己的一些缺点,这个psp很有用!


拿破仑:
凡事都要有统一和决断,因此成功不站在自信的一方,而站在有计划的一方。


  附上我的代码地址:https://coding.net/u/aaa2222339/p/Calculate/git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: