首页 > 其他分享 >HNU个人项目互评博客

HNU个人项目互评博客

时间:2023-09-20 12:34:44浏览次数:40  
标签:题目 String int question 博客 互评 HNU new teacher

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

一.前言

本次个人项目中我的搭档袁秀广同学使用了Java进行开发。袁秀广同学的代码实现了自动生成题目的基本功能,注解详细,内容丰富,但在一些细节上也存在一些可优化的地方。

二.需求分析

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

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

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

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

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

三.代码分析

1.updateTeacherTxt函数

public static void updateTeacherTxt(ArrayList<Teacher> teachers, Teacher teacher) throws IOException {
  for(int i = 0; i < teachers.size(); ++i) {
    if (((Teacher)teachers.get(i)).getAccount().equals(teacher.getAccount()) && !((Teacher)teachers.get(i)).getType().equals(teacher.getType())) {
      ((Teacher)teachers.get(i)).setType(teacher.getType());
    }
  }

  BufferedWriter bw = new BufferedWriter(new FileWriter(new File("src\\teacher.txt")));

  for(int i = 0; i < teachers.size(); ++i) {
    String var10001 = ((Teacher)teachers.get(i)).getAccount();
    bw.write(var10001 + " " + ((Teacher)teachers.get(i)).getPassword() + " " + ((Teacher)teachers.get(i)).getType());
    bw.newLine();
    bw.flush();
  }

  bw.close();
}

该函数使用ArrayList存储教师对象,方便获取和修改对象信息,通过遍历ArrayList,根据账号匹配对象,实现指定教师类型的修改,使用FileWriter写入文件,操作简单直观;

2.getAllQuestions函数

public static ArrayList<String> getAllQuestions(Teacher teacher) throws IOException {
  ArrayList<String> questions = new ArrayList();
  String path = "src\\" + teacher.getAccount() + "\\all.txt";
  BufferedReader br = new BufferedReader(new FileReader(new File(path)));
  String line = null;

  while((line = br.readLine()) != null) {
    String[] info = line.split(" ");
    questions.add(info[0]);
  }

  br.close();
  return questions;
}

该函数用于获取指定教师的所有题目,使用ArrayList来存储题目信息,操作方便,根据教师账号动态获取文件路径,便于管理不同教师的题库,但没有对参数teacher进行校验,可能传入null值。

3.saveQuestions函数

public static void saveQuestions(Teacher teacher, ArrayList<String> questions) throws IOException {
  Instant instant = Instant.now();
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss");
  String datetime = instant.atZone(ZoneId.systemDefault()).format(formatter);
  String var10000 = teacher.getAccount();
  String path1 = "src\\" + var10000 + "\\" + datetime + ".txt";
  File file1 = new File(path1);
  file1.createNewFile();
  String path2 = "src\\" + teacher.getAccount() + "\\all.txt";
  File file2 = new File(path2);
  BufferedWriter bw1 = new BufferedWriter(new FileWriter(new File(path1)));
  BufferedWriter bw2 = new BufferedWriter(new FileWriter(file2, true));

  for(int i = 0; i < questions.size(); ++i) {
    String var10001 = String.valueOf(i + 1);
    bw1.write(var10001 + ".  " + (String)questions.get(i));
    bw1.newLine();
    bw1.newLine();
    bw1.flush();
    bw2.write((String)questions.get(i));
    bw2.newLine();
    bw2.flush();
    PrintStream var12 = System.out;
    var10001 = String.valueOf(i + 1);
    var12.println(var10001 + ".  " + (String)questions.get(i));
    System.out.println();
  }

  bw1.close();
  bw2.close();
}

该函数用于保存指定教师的题目到文件,使用BufferedWriter,高效写入文件内容。遍历列表写入每道题,同时打印到控制台,检查结果。

4.primary函数

public static void primary(Teacher teacher, int sum) throws IOException {
  String[] primarySymbol = new String[]{"+", "-", "*", "/"};
  ArrayList<String> questions = new ArrayList();
  Random rd = new Random();

  for(int i = 0; i < sum; ++i) {
    String question = "";
    int leftSubRight = 0;
    int operandSum = 0;
    int isExit = false;

    while(true) {
      int k = rd.nextInt(5);
      if (k == 1) {
        question = question + "(";
        ++leftSubRight;
      }

      int flag = rd.nextInt(100) + 1;
      question = question + flag;
      ++operandSum;
      if (k == 2 && leftSubRight > 0) {
        question = question + ")";
        --leftSubRight;
      }

      int isExit = rd.nextInt(3);
      if (operandSum > 1 && (isExit == 1 || operandSum == 5)) {
        for(k = 0; k < leftSubRight; ++k) {
          question = question + ")";
        }

        ArrayList<String> getQuestions = getAllQuestions(teacher);
        int flag = false;
        flag = check(getQuestions, question);
        if (flag == -1) {
          questions.add(question);
        } else {
          --i;
        }
        break;
      }

      int symbolNum = rd.nextInt(4);
      question = question + primarySymbol[symbolNum];
    }
  }

  saveQuestions(teacher, questions);
}

该函数用于生成小学难度的题目,使用随机数生成各种运算符和操作数,题目具有随机性,考虑了括号的嵌套情况,生成结构较复杂的表达式,检查生成的题目是否重复,避免重复保存,调用了题目保存和读取的封装方法,代码结构清晰。

四.结果测试

1.登录

账户和密码输入正确

账户和密码输入不正确

2.生成题目

题目数量符合范围


题目数量不符合范围

3.切换题目类型

题目类型输入错误

4.退出当前账号

五.总结

经过我的测试,我可爱的搭档袁秀广同学编写的代码基本实现了有关功能,优缺点如下:

优点:

1.使用数组定义不同的运算符号,便于进行选择,也比较容易区分难易程度;

2.考虑到生成题目的随机性,采用了随机数生成与操作数、括号和运算符,大大增加了题目的丰富性,是题目结构更为立体;

3.运用了面向对象的思想,使用了三个类和一个接口,提高了代码的封装性和结构性,便于后期维护;

4.将获取题目、检查重复和保存题目等函数分开编写,既提高了代码的可读性又有利于维护;

5.通过javadoc详细解释了每一个类和每一个方法的用途、参数以及返回值,是代码便于理解。

缺点:

1.随机数范围设置比较简单,可能生成结构不合理的题目,如连续两个括号等。

2.在查重机制上,由于仅检查题目字符串,从而无法识别等价表达的题目,如操作符左右互换;

3.将过多的函数方法实现放在了mian类中,类的结构性没有很好的体现出来,函数粒度较大,后期扩展性不足;

总体来说,这份代码实现了自动生成题目的基本功能,利用随机数提高随机性,但在结构控制、重复判断、题型支持等方面还有待优化,后期维护难度较大。

标签:题目,String,int,question,博客,互评,HNU,new,teacher
From: https://www.cnblogs.com/summergod/p/17717012.html

相关文章

  • 【结对编程互评-C++】中小学数学卷子自动生成程序
    【结对编程互评-C++】中小学数学卷子自动生成程序项目名称:中小学数学卷子自动生成程序编程语言:C++代码作者:李义评价人:张恒硕目录[1.项目要求][1.1目标用户][1.2实现功能][2.代码分析][3.功能测试][3.1登录功能测试][3.2出题功能测试][4.优缺点分析与总结]......
  • 个人项目互评
    结队编程,分析结队队友的代码能够让小组队员之间更加了解彼此的风格。指出队友的优缺点,既能两个人互相提醒改进,也可以在往后的结队编程项目达到更好的效果。后续我将分析队友方缘的C++代码的功能及性能。基本功能实现基本要求:用户:小学、初中和高中数学老师。功能:1、命令行输......
  • 个人项目互评-中小学数学试卷生成
    个人项目互评-中小学数学试卷生成队友:软件2104李锦华队友语言选择:Python题目要求个人项目:中小学数学卷子自动生成程序用户:小学、初中和高中数学老师。功能:1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正......
  • 【HNU软件设计与实现】个人项目代码分析
    引言项目背景和目的:本项目为软件设计与实现课程的个人编程项目。在课程设置方面,这个项目旨在提高我们独立编程、规范编码的能力。个人项目:中小学数学卷子自动生成程序用户:小学、初中和高中数学老师。功能:1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高......
  • 结对项目队友个人项目互评
    一、概述1.项目名称:中小学数学卷子自动生成程序2.编程语言:Python3.目标:分析结对编程队友的个人项目代码,分析其代码的优缺点 二、整体架构1.代码整体基于面向对象的思想,根据功能分为了数量相对较多的类,其类图如下:  根据类图可以总结其思路为:Account作为账户类......
  • HNU个人项目互评——中小学数学卷子自动生成程序
    HNU个人项目互评——中小学数学卷子自动生成程序代码作者:刘蕴哲评价人:李锦华一、个人项目需求1.用户小学、初中和高中数学老师。2.功能(1)命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显......
  • 中小学数学卷子自动生成程序-个人项目互评
    前言:首先,很有幸能有这样一次和队友互相学习的机会。正好我们两个人都是选择的C++,通过对比分析对方的代码,学习到了很多,也深刻认识到了自己的不足,还有很长的路要走。程序结构:队友的代码用了一个cpp文件便包含了所有代码,这稍微有点不好,如果能够将各个功能函数各自放在头文件,就能让......
  • 知名IT网站博客园陷入绝境
    我是卢松松,点点上面的头像,欢迎关注我哦!博客园陷入生死存亡的绝境。5月份知名IT开发者网站发布文章称“博客园网站遇到困难了:寻求捐助”,并开通了捐助渠道。4个月过去了,好像效果并不明显,随后几个月的时间里,博客园仅仅依靠用户捐助、天使投资和少量会员费用苦苦支撑。而在昨天,博客园再......
  • 结对项目互评
    1.队友代码测试登陆注册(要求外添加的功能)退出出题(以下为三种难度的题目)切换难度切换账号2.代码分析接下来将主要分析核心代码首先是展示模块,这部分代码刘同学主要用了两个类来实现首先是正常输入正确的情况点击查看代码packagelogin;impor......
  • 个人项目:中小学数学卷子自动生成程序互评
    前言:我和队友使用的都是c++来实现这个程序,通过沟通交流,我们明白了彼此代码的优缺点,对这个程序有了更深的理解。 结构:队友的代码主要包括一个cpp文件和三个h头文件,将功能函数分散开来,我觉得这是一个很好的点。优点:1.功能分解成了多个函数,在运行时方便查找错误出现的位置; ......