xuanyee

导航

软件开发创新结对编程作业

2352202 队友:2221110
程序标准:小学老师要每周给同学出300道四则运算练习题,使用java语言编写程序实现这一功能。每道题都有两个运算符,数字范围在1-1000内,并将答案输出。本博客就这个编程展开讨论。
程序代码:
package com.cherry.demo1;

import java.util.Random;
import java.util.Scanner;

public class test1 {

private static final int TOTAL_QUESTIONS = 300;
private static final int QUESTIONS_PER_GROUP = 10;
private static final int POINTS_PER_QUESTION = 10;

private static Random random = new Random();
private static Scanner scanner = new Scanner(System.in);

public static void main(String[] args) {
int totalScore = 0;

System.out.println("欢迎使用小学四则运算练习题系统!");
System.out.println("每周需要完成300道题,每10道题为一组");
System.out.println("每题10分,答对加分,答错不加分");
System.out.println("准备开始吗?(输入y开始,其他退出)");

if (!scanner.nextLine().equalsIgnoreCase("y")) {
System.out.println("已退出系统,再见!");
return;
}

int groups = TOTAL_QUESTIONS / QUESTIONS_PER_GROUP;
for (int group = 0; group < groups; group++) {
int groupScore = 0;
int correctCount = 0;

System.out.println("\n=== 第 " + (group + 1) + " 组练习题 ===");

for (int i = 0; i < QUESTIONS_PER_GROUP; i++) {
String expression = generateValidExpression();
int result = calculate(expression);

System.out.print((i + 1) + ". 计算: " + expression + " = ");
int userAnswer = Integer.parseInt(scanner.nextLine());

if (userAnswer == result) {
System.out.println("✓ 正确!");
groupScore += POINTS_PER_QUESTION;
correctCount++;
} else {
System.out.println("✗ 错误!正确答案是: " + result);
}
}

// 计算正确率
double accuracy = (double) correctCount / QUESTIONS_PER_GROUP * 100;
System.out.println("\n第 " + (group + 1) + " 组得分: " + groupScore + "分");
System.out.printf("正确率: %.1f%%\n", accuracy);

totalScore += groupScore;

// 检查是否继续
if (group < groups - 1) {
System.out.print("是否继续下一组?(输入y继续,其他退出): ");
if (!scanner.nextLine().equalsIgnoreCase("y")) {
break;
}
}
}

// 最终评价
System.out.println("\n=== 练习结束 ===");
System.out.println("总得分: " + totalScore + "/" + (TOTAL_QUESTIONS * POINTS_PER_QUESTION));
System.out.println("最终评价: " + getEvaluation(totalScore));
System.out.println("感谢使用本系统!");

scanner.close();
}

private static String generateValidExpression() {
// 生成两个数字
int num1 = random.nextInt(100) + 1; // 1-100
int num2 = random.nextInt(100) + 1; // 1-100
int num3 = random.nextInt(100) + 1; // 1-100

// 生成两个运算符
char operator1 = getRandomOperator();
char operator2 = getRandomOperator();

// 构建表达式
String expression = num1 + " " + operator1 + " " + num2 + " " + operator2 + " " + num3;

// 确保结果是整数且在0-1000之间
while (true) {
try {
int result = calculate(expression);
if (result >= 0 && result <= 1000) {
return expression;
}
} catch (Exception e) {
// 如果计算出错,重新生成
}

// 如果不符合条件,重新生成
num1 = random.nextInt(100) + 1;
num2 = random.nextInt(100) + 1;
num3 = random.nextInt(100) + 1;
operator1 = getRandomOperator();
operator2 = getRandomOperator();
expression = num1 + " " + operator1 + " " + num2 + " " + operator2 + " " + num3;
}
}

private static char getRandomOperator() {
String operators = "+-×÷";
return operators.charAt(random.nextInt(operators.length()));
}

private static int calculate(String expression) {
// 简单的表达式计算,处理两个运算符的情况
String[] parts = expression.split(" ");
int num1 = Integer.parseInt(parts[0]);
char op1 = parts[1].charAt(0);
int num2 = Integer.parseInt(parts[2]);
char op2 = parts[3].charAt(0);
int num3 = Integer.parseInt(parts[4]);

// 先处理乘除运算
int tempResult;
if (op1 == '×' || op1 == '÷') {
tempResult = performOperation(num1, op1, num2);
return performOperation(tempResult, op2, num3);
} else if (op2 == '×' || op2 == '÷') {
tempResult = performOperation(num2, op2, num3);
return performOperation(num1, op1, tempResult);
} else {
// 全是加减运算
tempResult = performOperation(num1, op1, num2);
return performOperation(tempResult, op2, num3);
}
}

private static int performOperation(int a, char operator, int b) {
switch (operator) {
case '+':
return a + b;
case '-':
return a - b;
case '×':
return a * b;
case '÷':
if (b == 0) throw new ArithmeticException("除数不能为零");
if (a % b != 0) throw new ArithmeticException("除法结果不是整数");
return a / b;
default:
throw new IllegalArgumentException("未知运算符: " + operator);
}
}

private static String getEvaluation(int score) {
double percentage = (double) score / (TOTAL_QUESTIONS * POINTS_PER_QUESTION) * 100;

if (percentage >= 90) {
return "Very Good!";
} else if (percentage >= 80) {
return "Good!";
} else if (percentage >= 70) {
return "Satisfactory!";
} else if (percentage >= 60) {
return "Pass!";
} else {
return "Fail!";
}
}
}
运算结果截图:



算法设计思路:
1.TOTAL_QUESTIONS 代表每周需要完成的总题数,QUESTIONS_PER_GROUP 表示每组的题目数量,POINTS_PER_QUESTION 是每题的分值。这些常量在后续的计算和逻辑判断中会被频繁使用
2.借助 Random 类来生成随机数,用于生成随机的数字和运算符。Scanner 类则用于从控制台读取用户的输入
3.输出系统的欢迎信息和使用说明,接着询问用户是否准备开始。若用户输入不是 y,则退出系统。根据总题数和每组题数计算出总组数,然后通过循环依次处理每组题目。在每组题目中,通过 generateValidExpression 方法生成有效的四则运算表达式,再用 calculate 方法计算表达式的结果。接着提示用户输入答案,将用户答案与正确结果进行比较,根据比较结果输出相应信息并更新组得分和正确题数。计算每组的正确率,输出组得分和正确率。在每组结束后,询问用户是否继续下一组练习。若用户输入不是 y,则跳出循环,结束练习
4. 生成有效表达式 generateValidExpression,此方法的作用是生成有效的四则运算表达式。首先生成三个 1 - 100 之间的随机数和两个随机运算符,构建表达式。然后不断循环,计算表达式的结果,若结果在 0 - 1000 之间且计算过程无异常,则返回该表达式;否则,重新生成表达式
5. 生成随机运算符 getRandomOperator,该方法从 +-×÷ 这四个运算符中随机选取一个返回
6.calculate方法用于计算包含两个运算符的四则运算表达式的结果。按照先乘除后加减的运算规则,先处理乘除运算,再处理加减运算
7.具体运算操作 performOperation,该方法依据运算符对两个数进行具体的运算操作,处理加法、减法、乘法和除法运算,同时处理除数为零和除法结果不是整数的异常情况
8.最终评价 getEvaluation,此方法根据总得分计算得分百分比,然后依据百分比给出相应的最终评价
该系统借助模块化设计,将不同功能封装到不同的方法中,提高了代码的可读性和可维护性。通过循环和条件判断实现了分组练习、结果判断、评价生成等功能,同时对异常情况进行了处理,保证了系统的健壮性
总结体会:
从功能实现角度来看,该系统通过清晰的模块化设计,将核心功能拆分为表达式生成、计算、用户交互、结果评价等独立模块,每个方法各司其职。这种设计方式不仅让代码结构一目了然,也方便后续的维护与拓展。例如,generateValidExpression 方法通过不断循环验证确保生成的表达式符合要求,calculate 方法严格遵循四则运算优先级规则进行计算,这些都体现了对业务逻辑的精准把握。
在技术应用方面,Java 基础语法的运用贯穿始终。常量的定义增强了代码的可读性与可维护性,随机数生成与用户输入处理的结合,使系统具备了动态交互性。异常处理机制的引入,如在除法运算中对除数为零和非整数结果的判断,有效提升了系统的稳定性和健壮性,避免因用户输入或表达式异常导致程序崩溃。
然而,开发过程也暴露出一些不足。在表达式生成环节,虽然能够保证结果在一定范围内,但生成逻辑相对简单,未考虑更多复杂情况,如括号的使用、连续相同运算符等,限制了练习题的多样性。在用户交互体验上,输入提示不够友好,缺乏错误输入的引导,可能导致用户困惑。
未来,我计划进一步优化该系统。一方面,丰富表达式生成规则,增加括号、混合运算等复杂题型;另一方面,改进用户界面,提供更清晰的输入提示和错误反馈。此外,还可以考虑增加计时功能、生成错题集等拓展功能,提升系统的实用性和趣味性。此次开发经历是一次宝贵的实践,为我今后的编程学习和项目开发积累了经验,激励我不断追求更优质、更完善的代码实现

posted on 2025-04-17 22:48  xuanyee  阅读(15)  评论(0)    收藏  举报