结对项目
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13230 |
这个作业的目标 | 组队编程实现四则运算的项目 |
组队成员 | 阿依古再丽(3222004721)、张汉洁(3222004598) |
这次作业的github链接:https://github.com/fw-1208/11111111111
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(mins) | 实际耗时(mins) |
---|---|---|---|
Planning | 计划 | 30 | 20 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 360 | 200 |
Analysis | 需求分析(包括学习新技术) | 60 | 100 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 | 50 | 30 |
Coding | 代码规范(为目前的开发制定合适的规范) | 30 | 20 |
Design | 具体设计 | 60 | 50 |
Coding | 具体编码 | 300 | 320 |
Code Review | 代码复审 | 40 | 50 |
Test | 测试 | 100 | 200 |
Reporting | 报告 | 100 | 100 |
Test Repor | 测试报告 | 30 | 100 |
Size Measurement | 计算工作量 | 30 | 25 |
Postmortem & Process Lmprovement plan | 事后总结,并提出过程改进计划 | 20 | 30 |
合计 | 1240 | 1285 |
二、开发环境
开发环境:IntelliJ IDEA 2022
开发语言:Java
三、需求分析
四、效能分析
五、设计实现过程
1、Number类:随机生成数、运算符,并对分数格式进行处理。
2、number_string类:处理数字和分数的格式转换。
其中,zhen_fen_change 方法负责将输入字符串数组中的分数格式进行转换。
对于包含分数格式(例如带有/的字符串),调用 Number 类的 false_fraction 方法进行处理。
对于不包含/的整数(且不是运算符或空格),将其转换为分数形式,即添加 /1,以标准化处理
3、Main类:生成数学题目并将其输出到一个文本文件exercises.txt中,代码中写有查重机制,保证了题目的唯一性。
4、answer类:从一个文本文件exercises.txt中读取数学题目,计算这些题目,得到正确答案,将答案输出到另一个文本文件answer.txt中。
5、Operation类:对分数进行运算。
6、answer_student类:学生的答案进行判断。它从两个文本文件中读取数据:一个是学生的答案 (student_answer.txt),另一个是正确答案 (answer.txt)。程序逐行比较两个文件中的内容,统计正确和错误的答案数量,并记录下题号。最终,它将结果输出到一个名为 Grade.txt 的文件中,包括正确和错误答案的数量及其对应的题号。
六、代码说明
1、关键代码
生成题目时查重机制,避免题目重复
boolean flag = true;
// 查重
for (int i = 0; i < str0; i++) {
if (str_num[i] != null && jieguo2 != null && str_num[i].equals(jieguo2)) {
flag = false;
break;
}
}
if (!flag) {
k--;
} else {
String jieguo3 = (k + 1) + ". " + jieguo + " =";
System.out.println(jieguo3);
str_num[k] = jieguo2; // 记录生成的结果以防重复
}
对于“生成的题目中如果存在形如e1÷ e2的子表达式,那么其结果应是真分数”这个要求,为方便运算,将所有数字转化为真分数
// 分数转换为真分数和整数转化为分数
public static String[] zhen_fen_change(String[] a) {
Number s = new Number();
for (int i = 0; i < a.length; i++) {
if (a[i].contains("'")) {
a[i] = s.false_fraction(a[i]);
}
if (!a[i].contains("/") && !a[i].equals("×") && !a[i].equals("÷") &&
!a[i].equals("-") && !a[i].equals("+") && !a[i].equals(" ")) {
a[i] = a[i] + "/1"; // 将整数转化为分数
}
}
return a;
}
四则运算的代码
// 乘法
public static String mul(String a, String b) {
int[] c = operation.split(a);
int[] d = operation.split(b);
int e = c[0] * d[0];
int f = c[1] * d[1];
int g = operation.gongyinzi(e, f);
return (e / g) + "/" + (f / g);
}
// 除法
public static String div(String a, String b) {
int[] c = operation.split(a);
int[] d = operation.split(b);
int e = c[0] * d[1];
int f = c[1] * d[0];
int g = operation.gongyinzi(e, f);
return (e / g) + "/" + (f / g);
}
// 加减法
public static String add_sub(String a, String b, String yunsuanfu) {
int[] c = operation.split(a);
int[] d = operation.split(b);
int g = c[1] * d[1] / operation.gongyinzi(c[1], d[1]);
int e = g / c[1] * c[0];
int f = g / d[1] * d[0];
int h = yunsuanfu.equals("+") ? e + f : e - f;
return h + "/" + g;
}
// 算术表达式最后运算
public static String last(String[] a) {
for (int i = 1; i < a.length; i += 2) {
int n = 1;
while (a[i - n].equals("")) {
n++;
}
if (a[i].equals("×")) {
a[i - n] = operation.mul(a[i - n], a[i + 1]);
} else if (a[i].equals("÷")) {
a[i - n] = operation.div(a[i - n], a[i + 1]);
}
a[i] = "";
a[i + 1] = "";
}
for (int i = 1; i < a.length; i += 2) {
int n = 1;
while (a[i - n].equals("")) {
n++;
}
if (a[i].equals("+")) {
a[i - n] = operation.add_sub(a[i - n], a[i + 1], "+");
} else if (a[i].equals("-")) {
a[i - n] = operation.add_sub(a[i - n], a[i + 1], "-");
}
a[i] = "";
a[i + 1] = "";
}
return a[0];
}
七、测试运行
正确运行的结果
当不存在题目文件exercises.txt时候,计算正确答案时候会报错
八、项目小结
本次项目旨在开发一个能够进行四则运算(加、减、乘、除)的程序。通过这个项目,我们提升了团队成员的编程能力、协作能力以及对基本运算逻辑在程序中的实现能力。我们在debug过程中耗费了较长的时间,遇到了环境不适配、代码冗余等问题,在搜集资料后,我们成功地解决了这个问题!