结对编程作业
本次作业要求:小学老师要每周给同学出300道四则运算练习题。两个运算符,100 以内的数字,不需要写答案。需要检查答案是否正确,并且保证答案在 0..1000 之间 尽可能地多设置一些条件。
本人(2352731)与同学(2352730)共同完成了该次作业,以下是本次作业的算法设计思路、程序代码、运算结果、结对编程作业体会等。
算法设计思路:
首先在 MathExerciseGenerator 类中定义了存储加减乘除运算符的常量数组 OPERATORS,创建 Random 实例用于随机生成操作数和运算符,创建 Scanner 实例用于读取用户输入;在 main 方法里调用 generateExercises 方法生成 300 道练习题并启动考试;generateExercises 方法借助 while 循环不断生成练习题,每次循环随机生成三个 0 到 100 之间的整数和两个随机运算符,调用 evaluateExpression 方法计算表达式结果,若结果不为 null 且在 0 到 1000 之间,就格式化表达式并添加到练习题列表中;evaluateExpression 方法先获取两个运算符的优先级,依据优先级决定计算顺序,先计算优先级高的运算符,调用 calculate 方法进行具体运算;startExam 方法初始化正确题数计数器,遍历练习题列表,依次显示题目,调用 getValidInput 方法确保用户输入有效整数,将用户答案与正确答案比较并统计正确题数,最后调用 printStatistics 方法打印考试结果。对于除法部分,我们采用了保留除法结果的整数部分,去除小数部分。
程序代码`package Test1;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
/**
-
数学练习生成器类,用于生成数学练习题并进行考试模拟。
/
public class MathExerciseGenerator {
private static final String[] OPERATORS = {"+", "-", "", "/"};
private static final Random random = new Random();
private static final Scanner scanner = new Scanner(System.in);public static void main(String[] args) {
Listexercises = generateExercises(300);
startExam(exercises);
}//生成指定数量的数学练习题。
private static ListgenerateExercises(int count) {
Listexercises = new ArrayList<>();
while (exercises.size() < count) {
// 随机生成三个 0 到 100 之间的整数
int a = random.nextInt(101);
int b = random.nextInt(101);
int c = random.nextInt(101);
// 随机选择两个运算符
String op1 = OPERATORS[random.nextInt(4)];
String op2 = OPERATORS[random.nextInt(4)];
//计算表达式的结果
Integer answer = evaluateExpression(a, b, c, op1, op2);
if (answer != null && answer >= 0 && answer <= 1000) {
String expression = formatExpression(a, b, c, op1, op2);
exercises.add(new Question(expression, answer));
}
}
return exercises;
}//开始考试
private static void startExam(Listexercises) {
int correctCount = 0;
int count = 300;
System.out.println("======== 开始答题 ========");
for (int i = 0; i < exercises.size(); i++) {
Question q = exercises.get(i);
System.out.printf("第%3d题:%s = ", i+1, q.expression);int userAnswer = getValidInput(); if (userAnswer == q.answer) { correctCount++; System.out.println("✓ 正确"); } else { System.out.printf("✗ 错误 (正确答案: %d)\n", q.answer); } System.out.println("还剩余" + --count +"题"); } printStatistics(exercises.size(), correctCount);}
//从控制台获取用户输入的有效整数答案。
private static int getValidInput() {
while (true) {
try {
return Integer.parseInt(scanner.nextLine().trim());
} catch (NumberFormatException e) {
System.out.print("输入无效,请重新输入整数答案:");
}
}
}//打印考试统计信息,包括总题数、正确题数、错误题数和正确率。
private static void printStatistics(int total, int correct) {
double accuracy = (correct * 100.0) / total;
System.out.println("\n======== 考试结果 ========");
System.out.printf("总题数:%d\n", total);
System.out.printf("正确题数:%d\n", correct);
System.out.printf("错误题数:%d\n", total - correct);
System.out.printf("正确率:%.2f%%\n", accuracy);
}static class Question {
String expression;
int answer;Question(String expression, int answer) { this.expression = expression; this.answer = answer; }}
private static Integer evaluateExpression(int a, int b, int c, String op1, String op2) {
//获取第一个运算符的优先级
int precedence1 = getPrecedence(op1);
//获取第二个运算符的优先级
int precedence2 = getPrecedence(op2);Integer intermediate; Integer result; if (precedence1 >= precedence2) { intermediate = calculate(a, op1, b); if (intermediate == null) return null; result = calculate(intermediate, op2, c); } else { intermediate = calculate(b, op2, c); if (intermediate == null) return null; result = calculate(a, op1, intermediate); } return result;}
//将三个操作数和两个运算符格式化为数学表达式字符串。
private static String formatExpression(int a, int b, int c, String op1, String op2) {
return String.format("%d %s %d %s %d", a, op1, b, op2, c);
}
private static int getPrecedence(String op) {
return (op.equals("+") || op.equals("-")) ? 1 : 2;
}
private static Integer calculate(int num1, String op, int num2) {
switch (op) {
case "+": return num1 + num2;
case "-": return num1 - num2;
case "*": return num1 * num2;
case "/":
if (num2 == 0) return null;
//对于除法,去除小数部分,只保留整数部分
return num1 / num2;
default: return null;
}
}
}`
运算结果:

结对编程作业体会:
从合作的角度来看,与伙伴的协作极大地提升了我们的工作效率。在项目开始初期,我们对整体的架构设计进行了深入的讨论,充分发挥各自的优势,一个人擅长逻辑思考,负责算法的设计,另一个人则对 Java 的语法和库函数更为熟悉,负责代码的具体实现。通过这样的分工,我们能够快速地确定了代码的大致框架,避免了许多不必要的弯路。
然而,合作过程中也不可避免地遇到了一些挑战。由于我们的编程习惯和思维方式有所不同,在代码风格和实现细节上存在一些分歧。但正是这些分歧促使我们更加深入地思考问题,通过多次的沟通和交流,我们最终达成了共识,找到了一个最优的解决方案。这让我深刻体会到,在团队合作中,沟通是解决问题的关键,只有充分尊重对方的意见,才能实现共同的目标。
在技术层面,这个项目让我对 Java 语言有了更深入的理解。通过使用 Random 类和 Scanner 类,我更加熟练地掌握了 Java 的随机数生成和用户输入处理的方法。同时,在实现表达式计算的过程中,我学会了如何利用运算符优先级来设计算法,提高了自己的逻辑思维能力。在处理异常情况时,如用户输入无效的整数,我们使用了 try-catch 语句来捕获 NumberFormatException,这让我对 Java 的异常处理机制有了更深刻的认识。
回顾整个作业过程,我不仅提升了自己的编程技能,还学会了如何与他人有效地合作。在未来的学习和工作中,我将继续发扬团队合作的精神,不断提升自己的技术水平,努力解决更多更复杂的问题。我相信,这次的作业经历将成为我宝贵的财富,帮助我在编程的道路上不断前进。
浙公网安备 33010602011771号