当日总结

import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;
import java.util.Vector;
public class Main {
public static void main(String[] args) {
Random random = new Random();
Scanner scanner = new Scanner(System.in);
Set Okques=new HashSet<>();
Vector vec=new Vector<>();
int cnt=0;

    for (int i = 1; i <= 30; ) {
        String ques="";
        int correct=0;
        int num1 = random.nextInt(100) + 1;
        int num2 = random.nextInt(100) + 1;
        int op = random.nextInt(4) + 1;
        while(!judge(num1,num2,op)){
             num1 = random.nextInt(100) + 1;
             num2 = random.nextInt(100) + 1;
            //int op = random.nextInt(4) + 1;
        }
        switch(op){
            case 1:
                correct=num1+num2;
                ques=num1+"+"+num2+"=";
                break;
            case 2:
                correct=num1-num2;
                ques=num1+"-"+num2+"=";
                break;
            case 3:
                correct=num1*num2;
                ques=num1+"*"+num2+"=";
                break;
            case 4:
                correct=num1/num2;
                ques=num1+"/"+num2+"=";
                break;
            default :
                break;

        }
        if(!ChongFu(Okques,ques)) {
            Okques.add(ques);

            System.out.print("第" + i + "题:");
            System.out.println(ques);
            int ans = scanner.nextInt();
            if(check(ans,correct,ques,vec)){
                cnt++;
            }
            i++;
        }
    }
    double rate=(double)cnt/30;
    rate*=100;
   int wrong=30-cnt;
    System.out.println("答题完成,错题数:"+wrong+"正确率:"+rate+"%");
    wrongOutput(vec);
}
public static boolean judge(int x,int y,int op){
    switch(op){
        case 2:
            if(x<y){
                return false;
            }
            break;
        case 3:
            if(x*y>=1000)return false;
            break;
        case 4:
            if(y==0)return false;
            if(x%y!=0)return false;
            break;
            default:
                break;
    }
    return true;
}
public static boolean ChongFu(Set<String> Okques,String ques) {
             return Okques.contains(ques);
}
public static void wrongOutput(Vector<String> wrongQues){
    if (wrongQues.isEmpty()) {
        System.out.println("恭喜,没有错题!");
        return;
    }
    System.out.println("错题列表:");
    for (int i = 0; i < wrongQues.size(); i++) {
        System.out.println((i + 1) + ". " + wrongQues.get(i));
    }
}
public static  boolean check(int userAns,int correctAns,String ques,Vector<String> wrongQues){

    if (userAns != correctAns) {
        System.out.println("答案错误,正确答案为:" + correctAns);
        wrongQues.add(ques);
        return false;
    } else {
        System.out.println("答案正确");
        return true;
    }
}

}

程序的目标是提供一套完整的数学练习流程:自动生成符合约束的题目→用户作答→判断对错→统计结果→展示错题。整体围绕"30道不重复计算题"的核心需求设计。Set Okques用于存储已生成的题目字符串(如"3+5="),利用Set的去重特性确保30道题无重复。
Vector vec:用于存储用户答错的题目,方便后续输出错题列表(Vector支持动态扩容,适合存储有序元素)。
cnt变量:记录答对的题目数量,用于最终计算正确率。

程序通过循环生成30道题,每道题的生成过程如下:

  1. 随机生成计算要素

    • 两个操作数num1num2(1-100的随机整数)。
    • 操作符op(1-4,分别对应加、减、乘、除)。
  2. 验证题目合法性(judge方法)

    • 减法(op=2):确保被减数num1≥减数num2(避免结果为负数)。
    • 乘法(op=3):确保乘积num1*num2<1000(控制计算难度)。
    • 除法(op=4):确保除数num2≠0num1能被num2整除(避免小数或错误)。
    • 若不满足条件,重新生成num1num2(操作符op保持不变),直到符合要求。
  3. 构建题目字符串并去重

    • 根据操作符生成题目字符串(如num1+num2=)。
    • 通过ChongFu方法检查该题目是否已存在(利用Set.contains()),若未存在则加入Set,确保不重复。

4. 用户交互与判分逻辑

  1. 展示题目并接收答案:输出题目序号和题目内容,通过Scanner获取用户输入的答案。
  2. 判断对错(check方法)
    • 对比用户答案与正确答案(根据操作符预先计算)。
    • 若错误:提示正确答案,并将题目加入错题列表vec
    • 若正确:提示"答案正确",并累加cnt(答对计数)。

5. 结果统计与展示

  • 计算正确率:(答对题数/30)*100%
  • 输出总错题数和正确率。
  • 通过wrongOutput方法打印错题列表(若为空则提示"恭喜,没有错题!")。

总结

程序通过"随机生成→合法性校验→去重→用户作答→结果统计"的流程,实现了一个功能完整的数学练习工具。核心设计亮点在于:

  • 用Set确保题目不重复,用Vector记录错题,数据结构选择贴合需求。
  • 对不同运算设置约束条件(如减法不出现负数、除法为整数),控制了题目的合理性和难度。
  • 清晰分离了题目生成、判分、结果展示等功能(通过多个辅助方法),代码结构清晰。
posted @ 2025-09-29 23:54  lagranSun  阅读(9)  评论(0)    收藏  举报