个人项目互评——中小学数学卷子自动生成程序

发布时间 2023-09-21 11:10:43作者: 林楚朋

个人项目互评——中小学数学卷子自动生成程序

一、个人项目简介

用户:

​ 小学、初中和高中数学老师。

功能:

​ 1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;

​ 2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;

​ 3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);

​ 4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;

​ 5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;

二、个人项目运行测试与分析

​ 本次结对编程的队友为王致远同学,现对队友的个人项目进行测试分析。

测试:



登录功能测试:测试正常,有文字提示。

​ 部分代码展示:

public static void main(String[] args) {
  JudgeUser temp = new JudgeUser();
  System.out.println("********中小学数学自动出题系统*********");
  System.out.println("**请输入用户名和密码,两者之间用空格隔开**");
  String name = U.next();
  String pwd = U.next();
  while (temp.Judge(name, pwd) == null) {
    System.out.println("!!!!请输入正确的用户名、密码!!!!");
    System.out.println("********中小学数学自动出题系统*********");
    System.out.println("**请输入用户名和密码,两者之间用空格隔开**");
    name = U.next();
    pwd = U.next();
  }
  System.out.println("登陆成功!!");
  User tempUser = temp.Judge(name, pwd);
  type = tempUser.getUsertype();
  while (Login(name, type)) {
    continue;
  }

​ 优点:界面简洁干练,提示恰当到位

​ 存在的问题:当出现错误的格式输入时,会正常报错并提示重新输入,但是此后再次多次的正确输入,都会存在报错情况。

​ 原因分析:当一次输入三个内容,即两个空格内容分离时,.next()代码会处理第三次输入,并将第三次输入设置为下一次代码的第一次输入。

出题功能测试:测试正常:小初高中题目满足要求,生成的题目有题号和换号,切换类型时有正确的提示和正确的切换功能。

​ 部分代码展示:

public void txt(int randNum, String rand[], String type, String name, int num, String fo) {
  PaperMaker temp = new PaperMaker();
  String[] sign = {"+", "-", "*", "÷"};
  if (randNum >= 3 && number.nextBoolean()) {
    int length = number.nextInt(randNum - 2) + 1;
    int a = number.nextInt(randNum - length);
    int b = a + length;
    rand[a] = "(" + rand[a];
    rand[b] = rand[b] + ")";
  }
  fo += rand[0];
  for (int i = 0; i < randNum - 1; i++) {
    fo += sign[number.nextInt(4)];
    fo += rand[i + 1];
  }
  fo += "=\n";
  File file = new File(name);
  if (!file.exists()) {
    file.mkdirs();
  }

  PaperMaker temp2 = new PaperMaker();
  String time = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date().getTime());
  String file_name = time + ".txt";
  File math = new File(file, file_name);
  FileWriter ww = null;
  try {
    ww = new FileWriter(math, true);
  } catch (IOException e) {
    e.printStackTrace();
  }
  PrintWriter pw = new PrintWriter(ww);
  pw.println("第" + num + "题为" + fo);
  pw.flush();
}

查重功能测试:查重功能缺失,未找到相关代码。

切换功能测试:测试正常,切换难度时处理符合要求,功能正常。

​ 部分代码展示:

public static void changeType() {
  System.out.println("请输入“切换为xx”\n"
      + "xx只可输入小学/初中/高中\n");
  String newType = U.next();
  if (newType.equals("切换为小学") || newType.equals("切换为初中") || newType.equals(
      "切换为高中")) {
    System.out.println("已" + newType);
    type = newType.substring(3);
  } else {
    System.out.println("请输入小学、初中和高中三个选项中的一个");
    System.out.println("\n");
    changeType();
  }

保存功能测试:测试正常,文件名与需求一致。

​ 部分代码展示:

PaperMaker temp2 = new PaperMaker();
String time = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date().getTime());
String file_name = time + ".txt";
File math = new File(file, file_name);
FileWriter ww = null;
try {
  ww = new FileWriter(math, true);
} catch (IOException e) {
  e.printStackTrace();
}

代码规范检查:代码规范符合要求。

设计合理检查:设计合理符合要求。

分析:

User类:定义了方法,并将属性进行封装。

JudgeUser类:初始化用户,当用户名和密码不匹配时,判断错误并返回。

PaperMaker类:实现了小学,初中,高中类型题目出题,不同类型题目包含不同如平方根号,三角符号,以及实现文本的生成,其中包含文件,文件夹路径生成。

Main类:包含界面文字与文字交互,输入内容的处理。

三、总结与个人心得

优点:代码简洁干练,除了查重功能缺失以外,很好的实现了功能要求。

不足:缺少可以package包以更好的管理java文件,这一点可以做的更好。

心得:看完队友的代码,才发现我还有很多处代码可以优化改进,以及修复一些bug,要再接再厉啊!