团队成员:卢耀恒3118005065 莫政3118005067
二.需求
自然数:0, 1, 2, …。
- 真分数:1/2, 1/3, 2/3, 1/4, 1’1/2, …。
- 运算符:+, −, ×, ÷。
- 括号:(, )。
- 等号:=。
- 分隔符:空格(用于四则运算符和等号前后)。
- 算术表达式:
e = n | e1 + e2 | e1 − e2 | e1 × e2 | e1 ÷ e2 | (e),
其中e, e1和e2为表达式,n为自然数或真分数。
- 四则运算题目:e = ,其中e为算术表达式。
- 使用 -n 参数控制生成题目的个数,例如
Myapp.exe -n 10
将生成10个题目。
- 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围,例如
Myapp.exe -r 10
将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然数。该参数必须给定,否则程序报错并给出帮助信息。
- 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1− e2的子表达式,那么e1≥ e2。
- 生成的题目中如果存在形如e1÷ e2的子表达式,那么其结果应是真分数。
- 每道题目中出现的运算符个数不超过3个。
- 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。
生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:
- 四则运算题目1
- 四则运算题目2
……
其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。
- 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:
- 答案1
- 答案2
特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。
- 程序应能支持一万道题目的生成。
- 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,输入参数如下:
Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt
统计结果输出到文件Grade.txt,格式如下:
Correct: 5 (1, 3, 5, 7, 9)
Wrong: 5 (2, 4, 6, 8, 10)
三.PSP表格
|
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | |
Planning | 计划 | 60 | 60 | |
· Estimate | · 估计这个任务需要多少时间 | 0 | 0 | |
Development | 开发 | 1500 | 1550 | |
Analysis | 需求分析 (包括学习新技术) | 120 | 100 | |
Design Spec | 生成设计文档 | 60 | 55 | |
Design Review | 设计复审 (和同事审核设计文档) | 20 | 20 | |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0 | 0 | |
Design | 具体设计 | 60 | 55 | |
Coding | 具体编码 | 1300 | 1350 | |
Code Review | 代码复审 | 100 | 80 | |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 140 | |
Reporting | 报告 | 30 | 25 | |
Test Report | 测试报告 | 20 | 20 | |
Size Measurement | 计算工作量 | 0 | 0 | |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 50 | |
合计 | 1870 | 2050 |
四.效能分析
生成1万道题时总的内存与CPU情况
具体各个类的情况,其中字符串占比最多
四.设计实现过程
Util类(主要的工具类)实现分数题目的形成,整数题目的形成,分数类题目的运算操作,将题目插入文本文件,以及答案的检查。
util类主要分成了AnswerCheckUtil(答案的检查,正确与错误),ExerciseFractionUtil(生成分数题目),ExerciseIntegerUtil(生成整数题目),ExerciseInsertUtil(将题目与答案输出,写入文本文件),FractionOperationUtil(分数的操作),其中
ExerciseFractionUtil中通过设置随机符号与随机符号数,分类实现,又Math.random函数实现随机,由用户输入题目个数以及题目中数值范围实现对随机题目的控制,当输入进后,由代码实现随机生成。
ExerciseIntegerUtil同分数类的情况
FractionOperationUtil中有方法simplifiedFraction,changeToProperFraction,simplified。simplified递归实现求最大公约数,simplifiedFraction对simplified的调用,实现对分数的化简,而changeToProperFraction则是将假分数变成真分数,化成x\'x/x的形式
ExerciseInsertUtil则是对生成的题目与答案输入到文本文件中
AnswerCheckUtil则是将用户输入的答案与标准答案进行对比,批改,若正确则记录,错误也记录,最终输入正确与错误的题号。
由于对于查重未知如何实现,所以最后没有做到查重的功能,而且对于整数部分的除法也未转换成分数的形式
五.代码说明
主方法,main函数
1 package exercise.main; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.util.Scanner; 6 7 import exercise.utils.AnswerCheckUtil; 8 import exercise.utils.ExerciseFractionUtil; 9 import exercise.utils.ExerciseIntegerUtil; 10 11 public class main { 12 13 @SuppressWarnings("resource") 14 public static void main(String[] args) { 15 //n表示输入题目数量,x表示输入数字的范围 16 int choose,n,x,over; 17 System.out.println("自动生成小学四则运算题目"); 18 while(true) { 19 Scanner scanner=new Scanner(System.in); 20 System.out.println("请选择你需要出的题目的类型,1是整数类型,2是分数类型"); 21 //判断是否输入为数字 22 if(!scanner.hasNextInt()) 23 continue; 24 choose=scanner.nextInt(); 25 if(choose==1) { 26 System.out.println("请输入出题的数量以及数字的范围"); 27 n=new Scanner(System.in).nextInt(); 28 x=new Scanner(System.in).nextInt(); 29 ExerciseIntegerUtil.getExerise(n, x); 30 File file=new File("1.txt"); 31 try { 32 if(!file.exists()) 33 file.createNewFile(); 34 } catch (IOException e) { 35 // TODO Auto-generated catch block 36 e.printStackTrace(); 37 } 38 System.out.println("请在1.txt中作答,答题完毕请输入1"); 39 over=scanner.nextInt(); 40 //判断是否输入正确 41 while(over!=1) { 42 System.out.println("输入有误,请重新输入"); 43 over=new Scanner(System.in).nextInt(); 44 } 45 AnswerCheckUtil.checkAnswer(); 46 } 47 else if(choose==2) { 48 System.out.println("请输入出题的数量以及数字的范围"); 49 n=new Scanner(System.in).nextInt(); 50 x=new Scanner(System.in).nextInt(); 51 ExerciseFractionUtil.getExercise(n, x); 52 File file=new File("1.txt"); 53 try { 54 if(!file.exists()) 55 file.createNewFile(); 56 } catch (IOException e) { 57 // TODO Auto-generated catch block 58 e.printStackTrace(); 59 } 60 System.out.println("请在1.txt中作答,答题完毕请输入1"); 61 over=scanner.nextInt(); 62 while(over!=1) { 63 System.out.println("输入有误,请重新输入"); 64 over=new Scanner(System.in).nextInt(); 65 } 66 AnswerCheckUtil.checkAnswer(); 67 } 68 else { 69 System.out.println("你输入有误"); 70 } 71 } 72 } 73 74 }
ExerciseFractionUtil类
1 package exercise.utils; 2 3 /** 4 * @author lyh 5 * 全部为分数的题目 6 */ 7 public class ExerciseFractionUtil { 8 9 // n为传入的题目数量,x为传入的数值范围 10 public static void getExercise(int n, int x) { 11 // 结果 12 int sum = 0; 13 // 题目数量 14 int count = 0; 15 // 数值,运算符,运算符个数 16 int a, b, c, d, e, f, g, h, operator1, operator2, operator3, nterms; 17 // 储存题目以及答案 18 String[] results = new String[n + 1]; 19 String[] exercise = new String[n + 1]; 20 // 随机运算符+-*/,0表示+,1表示-,2表示*,3表示/ 21 while (n != count) { 22 operator1 = (int) (Math.random() * 4); 23 operator2 = (int) (Math.random() * 4); 24 operator3 = (int) (Math.random() * 4); 25 a = (int) (Math.random() * x); 26 b = (int) (Math.random() * x); 27 c = (int) (Math.random() * x); 28 d = (int) (Math.random() * x); 29 e = (int) (Math.random() * x); 30 f = (int) (Math.random() * x); 31 g = (int) (Math.random() * x); 32 h = (int) (Math.random() * x); 33 nterms = (int) (Math.random() * 3); 34 //一个运算符的情况下 35 if (b != 0 && d != 0 && nterms == 0) { 36 if (operator1 == 0) { 37 exercise[++count] = a + "/" + b + "+" + c + "/" + d + "="; 38 // 储存临时值,方便化简 39 sum = a * d + b * c; 40 b = b * d; 41 //判断是否为假分数,下同 42 if (sum > b) 43 //将其转换成带分数,下同 44 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 45 else 46 //将分数化简,下同 47 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 48 } else if (operator1 == 1) { 49 if ((a / b) > (c / d)) { 50 exercise[++count] = a + "/" + b + "-" + c + "/" + d + "="; 51 // 储存临时值,方便化简 52 sum = a * d - b * c; 53 b = b * d; 54 if (sum > b) 55 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 56 else 57 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 58 } 59 } else if (operator1 == 2) { 60 exercise[++count] = a + "/" + b + "×" + c + "/" + d + "="; 61 // 储存临时值,方便化简 62 sum = a * c; 63 b = b * d; 64 if (sum > b) 65 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 66 else 67 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 68 } else if (operator1 == 3) { 69 // 防止C为0出错 70 if (c == 0) 71 continue; 72 exercise[++count] = a + "/" + b + "÷" + c + "/" + d + "="; 73 // 储存临时值,方便化简 74 sum = a * d; 75 b = b * c; 76 if (sum > b) 77 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 78 else 79 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 80 } 81 //两个运算符的情况下 82 } else if (b != 0 && d != 0 && f != 0 && nterms == 1) { 83 if (operator1 == 0) { 84 if (operator2 == 0) { 85 exercise[++count] = a + "/" + b + "+" + c + "/" + d + "+" + e + "/" + f + "="; 86 b = b * d * f; 87 sum = a * d * f + c * b * f + e * b * d; 88 if (sum > b) 89 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 90 else 91 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 92 } 93 } else if (operator2 == 1) { 94 if ((a / b + c / d - e / f) > 0) { 95 exercise[++count] = a + "/" + b + "+" + c + "/" + d + "-" + e + "/" + f + "="; 96 b = b * d * f; 97 sum = a * d * f + c * b * f - e * b * d; 98 if (sum > b) 99 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 100 else 101 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 102 } 103 } else if (operator2 == 2) { 104 exercise[++count] = a + "/" + b + "+" + c + "/" + d + "×" + e + "/" + f + "="; 105 sum = a * d * f + c * e * b; 106 b = b * d * f; 107 if (sum > b) 108 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 109 else 110 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 111 } else if (operator2 == 3 && e != 0) { 112 exercise[++count] = a + "/" + b + "+" + c + "/" + d + "÷" + e + "/" + f + "="; 113 sum = a * d * e + c * f * b; 114 b = b * d * e; 115 if (sum > b) 116 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 117 else 118 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 119 } else if (operator1 == 1) { 120 if (operator2 == 0) 121 if ((a / b - c / d + e / f) > 0) { 122 exercise[++count] = a + "/" + b + "-" + c + "/" + d + "+" + e + "/" + f + "="; 123 sum = a * d * f - c * b * f + e * b * d; 124 b = b * d * f; 125 if (sum > b) 126 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 127 else 128 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 129 } else if (operator2 == 1) 130 if ((a / b - c / d - e / f) > 0) { 131 exercise[++count] = a + "/" + b + "-" + c + "/" + d + "-" + e + "/" + f + "="; 132 sum = a * d * f - c * b * f - e * b * d; 133 b = b * d * f; 134 if (sum > b) 135 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 136 else 137 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 138 } else if (operator2 == 2) { 139 if ((a / b - (c / d) * (e / f)) > 0) { 140 exercise[++count] = a + "/" + b + "-" + c + "/" + d + "×" + e + "/" + f + "="; 141 sum = a * d * f - b * c * e; 142 b = b * d * f; 143 if (sum > b) 144 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 145 else 146 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 147 } 148 } else if (operator2 == 3) { 149 if ((a / b - (c / d) / (e / f)) > 0) { 150 exercise[++count] = a + "/" + b + "-" + c + "/" + d + "÷" + e + "/" + f + "="; 151 sum = a * d * e - b * c * f; 152 b = b * d * e; 153 if (sum > b) 154 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 155 else 156 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 157 } 158 } else if (operator1 == 2) { 159 exercise[++count] = a + "/" + b + "×" + c + "/" + d + "×" + e + "/" + f + "="; 160 sum = a * c * e; 161 b = b * d * f; 162 if (sum > b) 163 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 164 else 165 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 166 } else if (operator1 == 3) { 167 if (a / b * c / d * e / f >= 0) { 168 exercise[++count] = a + "/" + b + "÷" + c + "/" + d + "÷" + e + "/" + f + "="; 169 sum = a * d * f; 170 b = b * c * e; 171 if (sum > b) 172 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 173 else 174 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 175 } 176 } 177 //3个运算符的情况下,仅仅举出了较为简单的运算+法 178 } else if (b != 0 && d != 0 && f != 0 && h != 0 && nterms == 2) { 179 if (operator1 == 0 && operator2 == 0 && operator3 == 0) { 180 exercise[++count] = a + "/" + b + "+" + c + "/" + d + "+" + e + "/" + f + "+" + g + "/" + h 181 + "="; 182 sum = a * d * f * h + c * b * f * h + e * b * d * h + g * b * d * f; 183 b = b * d * f * h; 184 if (sum > b) 185 results[count] = FractionOperationUtil.changeToProperFraction(sum, b); 186 else 187 results[count] = FractionOperationUtil.simplifiedFraction(sum, b); 188 } 189 } 190 } 191 } 192 // 此处为实现将答案存入文本文件 193 ExerciseInsertUtil.insertExercise(exercise); 194 ExerciseInsertUtil.insertAnswer(results); 195 // 将答案存起来 196 AnswerCheckUtil.setResults(results); 197 } 198 }
ExerciseIntegerUtil类
1 package exercise.utils; 2 3 /** 4 * @author lyh 5 * 全部为整数的题目 6 */ 7 public class ExerciseIntegerUtil { 8 9 /* 10 * 未处理除法的情况下变为分数 11 * 仅仅是变成了两位小数输出 12 */ 13 14 //n为传入的题目数量,x为传入的数值范围 15 public static void getExerise(int n,int x) { 16 //结果 17 double sum=0; 18 //题目数量 19 int count=0; 20 double[] results=new double[n+1]; 21 String[] exercise=new String[n+1]; 22 while(count!=n) { 23 //四个数据a,b,c,d 24 double a=(int) (Math.random()*x)+1; 25 double b=(int) (Math.random()*x)+1; 26 double c=(int) (Math.random()*x)+1; 27 double d=(int) (Math.random()*x)+1; 28 //随机运算符+-*/,0表示+,1表示-,2表示*,3表示/ 29 int operator1=(int) (Math.random()*4); 30 int operator2=(int) (Math.random()*4); 31 int operator3=(int) (Math.random()*4); 32 //控制题目的项数,0表示2两项,1表示3项,2表示4项 33 int nterms=(int) (Math.random()*3); 34 //运算符为1个的情况下 35 if(operator1==0&&nterms==0) { 36 sum=a+b; 37 exercise[++count]=a+"+"+b+"="; 38 } 39 //运算符为2个的情况下 40 else if(operator1==0&&operator2==0&&nterms==1) { 41 sum=a+b+c; 42 exercise[++count]=a+"+"+b+"+"+c+"="; 43 } 44 else if(operator1==0&&operator2==2&&nterms==1) { 45 sum=a+b*c; 46 exercise[++count]=a+"+"+b+"×"+c+"="; 47 } 48 else if(operator1==0&&operator2==1&&nterms==1) { 49 if(a+b<c) { 50 sum=a+c-b; 51 exercise[++count]=a+"+"+c+"-"+b+"="; 52 } 53 else { 54 sum=a+b-c; 55 exercise[++count]=a+"+"+b+"-"+c+"="; 56 } 57 } 58 else if(operator1==0&&operator2==3&&nterms==1) { 59 if(c==0&&b!=0) { 60 sum=a+c/b; 61 exercise[++count]=a+"+"+c+"÷"+b+"="; 62 } 63 else if(c!=0){ 64 sum=a+b/c; 65 exercise[++count]=a+"+"+b+"÷"+c+"="; 66 } 67 } 68 else if(operator1==1&&nterms==0) { 69 if(a<b) { 70 sum=b-a; 71 exercise[++count]=b+"-"+a+"="; 72 } 73 else { 74 sum=a-b; 75 exercise[++count]=a+"-"+b+"="; 76 } 77 } 78 else if(operator1==1&&operator2==0&&nterms==1) { 79 if(a-b+c<0) { 80 sum=b-a+c; 81 exercise[++count]=b+"-"+a+"+"+c+"="; 82 } 83 else { 84 sum=a-b+c; 85 exercise[++count]=a+"-"+b+"+"+c+"="; 86 } 87 } 88 else if(operator1==1&&operator2==1&&nterms==1) { 89 if(a-b-c<0) { 90 continue; 91 } 92 else { 93 sum=a-b-c; 94 exercise[++count]=a+"-"+b+"-"+c+"="; 95 } 96 } 97 else if(operator1==1&&operator2==2&&nterms==1) { 98 if(a<b) { 99 sum=(b-a)*c; 100 exercise[++count]="("+b+"-"+a+")"+"×"+c+"="; 101 } 102 else { 103 sum=(a-b)*c; 104 exercise[++count]="("+a+"-"+b+")"+"×"+c+"="; 105 } 106 } 107 else if(operator1==1&&operator2==3&&nterms==1) { 108 if(a-b<0) { 109 if(c==0) { 110 continue; 111 } 112 else { 113 sum=(b-a)/c; 114 exercise[++count]="("+b+"-"+a+")"+"÷"+c+"="; 115 } 116 } 117 else if(c!=0){ 118 sum=(a-b)/c; 119 exercise[++count]="("+a+"-"+b+")"+"÷"+c+"="; 120 } 121 } 122 else if(operator1==2&&nterms==0) { 123 sum=a*b; 124 exercise[++count]=a+"×"+b+"="; 125 } 126 else if(operator1==2&&operator2==0&&nterms==1) { 127 sum=a*b+c; 128 exercise[++count]=a+"×"+b+"+"+c+"="; 129 } 130 else if(operator1==2&&operator2==1&&nterms==1) { 131 if(a*b<c) { 132 sum=a*c-b; 133 exercise[++count]=a+"×"+c+"+"+b+"="; 134 } 135 else { 136 sum=a*b-c; 137 exercise[++count]=a+"×"+b+"+"+c+"="; 138 } 139 } 140 else if(operator1==2&&operator2==2&&nterms==1) { 141 sum=a*b*c; 142 exercise[++count]=a+"×"+b+"×"+c+"="; 143 } 144 else if(operator1==2&&operator2==3&&nterms==1) { 145 if(c==0&&b!=0) { 146 sum=a*c/b; 147 exercise[++count]=a+"×"+c+"÷"+b+"="; 148 } 149 else if(c!=0){ 150 sum=a*b/c; 151 exercise[++count]=a+"×"+b+"÷"+c+"="; 152 } 153 } 154 else if(operator1==3&&nterms==0) { 155 if(b==0&&a!=0) { 156 sum=b/a; 157 exercise[++count]=b+"÷"+a+"="; 158 } 159 else if(b!=0){ 160 sum=a/b; 161 exercise[++count]=a+"÷"+b+"="; 162 } 163 } 164 else if(operator1==3&&operator2==0&&nterms==1) { 165 if(b==0&&c!=0) { 166 sum=a/c+b; 167 exercise[++count]=a+"÷"+c+"+"+b+"="; 168 } 169 else if(b!=0) { 170 sum=a/b+c; 171 exercise[++count]=a+"÷"+b+"+"+c+"="; 172 } 173 } 174 else if(operator1==3&&operator2==2&&nterms==1) { 175 if(b==0&&c!=0) { 176 sum=a/c*b; 177 exercise[++count]=a+"÷"+c+"×"+b+"="; 178 } 179 else if(b!=0) { 180 sum=a/b*c; 181 exercise[++count]=a+"÷"+b+"×"+c+"="; 182 } 183 } 184 else if(operator1==3&&operator2==1&&nterms==1) { 185 if(b==0&&c!=0&&a/c>b) { 186 sum=a/c-b; 187 exercise[++count]=a+"÷"+c+"×"+b+"="; 188 } 189 else if(b!=0&&a/b>c) { 190 sum=a/b-c; 191 exercise[++count]=a+"÷"+b+"×"+c+"="; 192 } 193 } 194 else if(operator1==3&&operator2==3&&nterms==1) { 195 if(a!=0&&b!=0&&c!=0) { 196 sum=a/b/c; 197 exercise[++count]=a+"÷"+b+"÷"+c+"="; 198 } 199 } 200 //运算符为3个的情况下 201 else if(operator1==0&&operator2==0&&operator3==0&&nterms==2) { 202 sum=a+b+c+d; 203 exercise[++count]=a+"+"+b+"+"+c+"+"+d+"="; 204 } 205 else if(operator1==0&&operator2==2&&operator3==0&&nterms==2) { 206 sum=a+b*c+d; 207 exercise[++count]=a+"+"+b+"×"+c+"+"+d+"="; 208 } 209 else if(operator1==0&&operator2==1&&operator3==0&&nterms==2) { 210 if(a+b-c+d<0) { 211 continue; 212 } 213 else { 214 sum=a+b-c+d; 215 exercise[++count]=a+"+"+b+"-"+c+"+"+d+"="; 216 } 217 } 218 else if(operator1==0&&operator2==3&&operator3==0&&nterms==2) { 219 if(c==0) { 220 continue; 221 } 222 else { 223 sum=a+b/c+d; 224 exercise[++count]=a+"+"+b+"÷"+c+"+"+d+"="; 225 } 226 } 227 else if(operator1==0&&operator2==3&&operator3==1&&nterms==2) { 228 if(c==0||a+b/c-d<0) { 229 continue; 230 } 231 else { 232 sum=a+b/c-d; 233 exercise[++count]=a+"+"+b+"÷"+c+"-"+d+"="; 234 } 235 } 236 else if(operator1==0&&operator2==3&&operator3==2&&nterms==2) { 237 if(c==0) { 238 continue; 239 } 240 else { 241 sum=a+b/c*d; 242 exercise[++count]=a+"+"+b+"÷"+c+"×"+d+"="; 243 } 244 } 245 else { 246 continue; 247 } 248 //存储结果 249 results[count]=sum; 250 } 251 //此处为实现将答案存入文本文件 252 ExerciseInsertUtil.insertExercise(exercise); 253 ExerciseInsertUtil.insertAnswer(results); 254 //将答案存起来 255 AnswerCheckUtil.setResults(results); 256 } 257 }
FractionOperationUtil
1 package exercise.utils; 2 3 /** 4 * @author lyh 5 * 对分数的处理 6 */ 7 public class FractionOperationUtil { 8 9 //化简分数 10 public static String simplifiedFraction(int a,int b) { 11 //当分子为0后直接返回0 12 if(a==0) 13 return 0+""; 14 //当分母为1时返回整数 15 if(b==1) 16 return a+""; 17 int simplified = simplified(a,b); 18 return a/simplified+"/"+b/simplified; 19 } 20 21 //化成真分数 22 public static String changeToProperFraction(int a,int b) { 23 //当分子为0后直接返回0 24 if(a==0) 25 return 0+""; 26 //当分母为1时返回整数 27 if(b==1) 28 return a+""; 29 int temp,temp2; 30 temp=a/b; 31 temp2=a%b; 32 //化简 33 int simplified=simplified(temp2,b); 34 if(temp2==0) 35 return temp+""; 36 return temp+"\'"+temp2/simplified+"/"+b/simplified; 37 } 38 39 //递归调用,求最大公约数 40 private static int simplified(int a, int b) { 41 // TODO Auto-generated method stub 42 if(b==0) 43 return a; 44 else 45 return simplified(b,a%b); 46 } 47 48 }
ExerciseInsertUtil
1 package exercise.utils; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.OutputStreamWriter; 8 import java.math.BigDecimal; 9 10 /** 11 * @author lyh 12 * 将题目以及答案存储进文本文件中 13 */ 14 public class ExerciseInsertUtil { 15 16 private static String filename1="exercise.txt"; 17 private static String filename2="answer.txt"; 18 19 public static void insertAnswer(String[] answer) { 20 File file=new File(filename2); 21 FileOutputStream fos=null; 22 OutputStreamWriter osw=null; 23 BufferedWriter bw=null; 24 try { 25 if(!file.exists()) 26 file.createNewFile(); 27 fos=new FileOutputStream(file); 28 osw=new OutputStreamWriter(fos); 29 bw=new BufferedWriter(osw); 30 for(int i=1;i<=answer.length-1;i++) { 31 bw.write("答案"+i+":"+" "+answer[i]+"\\n"); 32 } 33 } catch (IOException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 }finally { 37 if(bw!=null) { 38 try { 39 bw.close(); 40 } catch (IOException e) { 41 // TODO Auto-generated catch block 42 e.printStackTrace(); 43 } 44 } 45 if(osw!=null) 46 try { 47 osw.close(); 48 } catch (IOException e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 } 52 if(fos!=null) 53 try { 54 fos.close(); 55 } catch (IOException e) { 56 // TODO Auto-generated catch block 57 e.printStackTrace(); 58 } 59 } 60 61 } 62 63 public static void insertAnswer(double[] answer) { 64 File file=new File(filename2); 65 FileOutputStream fos=null; 66 OutputStreamWriter osw=null; 67 BufferedWriter bw=null; 68 BigDecimal fomat=null; 69 double result=0; 70 try { 71 if(!file.exists()) 72 file.createNewFile(); 73 fos=new FileOutputStream(file); 74 osw=new OutputStreamWriter(fos); 75 bw=new BufferedWriter(osw); 76 for(int i=1;i<=answer.length-1;i++) { 77 //转化为两位小数 78 fomat=new BigDecimal(answer[i]); 79 result=fomat.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 80 bw.write("答案"+i+":"+" "+result+"\\n"); 81 } 82 } catch (IOException e) { 83 // TODO Auto-generated catch block 84 e.printStackTrace(); 85 }finally { 86 if(bw!=null) { 87 try { 88 bw.close(); 89 } catch (IOException e) { 90 // TODO Auto-generated catch block 91 e.printStackTrace(); 92 } 93 } 94 if(osw!=null) 95 try { 96 osw.close(); 97 } catch (IOException e) { 98 // TODO Auto-generated catch block 99 e.printStackTrace(); 100 } 101 if(fos!=null) 102 try { 103 fos.close(); 104 } catch (IOException e) { 105 // TODO Auto-generated catch block 106 e.printStackTrace(); 107 } 108 } 109 110 } 111 112 public static void insertExercise(String[] exercise) { 113 File file=new File(filename1); 114 FileOutputStream fos=null; 115 OutputStreamWriter osw=null; 116 BufferedWriter bw=null; 117 try { 118 if(!file.exists()) 119 file.createNewFile(); 120 fos=new FileOutputStream(file); 121 osw=new OutputStreamWriter(fos); 122 bw=new BufferedWriter(osw); 123 for(int i=1;i<=exercise.length-1;i++) { 124 bw.write("题目"+i+":"+" "+exercise[i]+"\\n"); 125 } 126 } catch (IOException e) { 127 // TODO Auto-generated catch block 128 e.printStackTrace(); 129 }finally { 130 if(bw!=null) { 131 try { 132 bw.close(); 133 } catch (IOException e) { 134 // TODO Auto-generated catch block 135 e.printStackTrace(); 136 } 137 } 138 if(osw!=null) 139 try { 140 osw.close(); 141 } catch (IOException e) { 142 // TODO Auto-generated catch block 143 e.printStackTrace(); 144 } 145 if(fos!=null) 146 try { 147 fos.close(); 148 } catch (IOException e) { 149 // TODO Auto-generated catch block 150 e.printStackTrace(); 151 } 152 } 153 } 154 }
六.测试用例
整数部分
七.项目总结
第一次尝试结对合作,收获还是很多的,这次结对项目我们首先进行了开会讨论,研究项目的细节与大致的框架,确定方向,认真研究分析了需求,开会讨论了很多的方案,收获颇多。
在开发的过程中,我们积极交流,将遇到的问题与困难及时向对方反馈,认真聆听对方的意见,将我们各自的进度在做项目的时候总结汇报。让我体会到了团队的力量,以前在一个人开发时候总会遇到各种问题
在结对项目中我们更有互相的支持与鼓励,有问题一起分担,一起解决,形成了一个极度良好的团队氛围。
在此次项目中也遇到一些困难,比如假分数换成真分数呀,如何实现随机运算,怎样把题目生成,最后不得已用了最笨的办法,穷举,虽然还是少考虑了一些情况,以后会更加优化我们的算法,不断提升自我。
还有的是没有实现查重的功能,这个功能思考许久没有地方入手,还要判断它的交换律,所以这次没有实现查重的功能。
卢耀恒:学习能力较强,能积极配合团队工作,积极与队友交流,能主动学习,上网查询学习方法,不偷懒,能尽快处理自己所需完成的功能代码。
莫政:思维灵敏,头脑清醒,思考出很多有趣独特的方法,学习能力出众,有着很强的责任感,能主动分担解决困难,有着很强的团队精神。