个人项目互评

个人项目代码互评

软件2003 文齐

队友:王彦博

1.功能测试

测试程序是否满足需求,需求如下

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

用户:

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

功能:

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

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

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

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

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

6、个人项目9月26日晚上10点以前提交至创新课程管理系统。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。迟交2天及以内者扣分,每天扣20%。迟交2天及以上者0分。

附表-1:账户、密码

账户类型 账户 密码 备注
小学 张三1 123
张三2 123
张三3 123
初中 李四1 123
李四2 123
李四3 123
高中 王五1 123
王五2 123
王五3 123

附表-2:小学、初中、高中题目难度要求

小学 初中 高中
难度要求 +,-,*./ 平方,开根号 sin,cos,tan
备注 只能有+,-,*./和() 题目中至少有一个平方或开根号的运算符 题目中至少有一个sin,cos或tan的运算符

测试结果如下:

1.1 主界面

image

1.2 登录

image

能够进行验证且给出相应提示

1.3 生成试题

题目格式符合要求

image

image

1.4 切换年级

image

可切换年级

2.代码分析

2.1类的架构

程序主体分为三个类:

Paper 提供创立试卷文件的接口

Sys 负责菜单、试卷题目生成、用户数据读取等功能

User 存储用户的账号、密码等基本信息

image

2.2 代码实现

2.2.1 Sys类

image

核心函数

登陆环节

getUsers() 从User.txt中读入用户的信息

    static User[] getUsers() throws IOException {
        FileReader fr = new FileReader("C:\\Users\\wen\\Documents\\Windows OS\\wyb papers\\Users.txt");
        BufferedReader br = new BufferedReader(fr);
        User[] UsersArry = new User[9];
        for (int i=0; i<=8; i++) {
            UsersArry[i] = new User();
        }
        int i=0;
        String[] tmp;
        while (i!=9) {
            tmp = br.readLine().split("\\s+");
            UsersArry[i].setName(tmp[0]);
            UsersArry[i].setPassWord(tmp[1]);
            UsersArry[i].setGrade(tmp[2]);
            i++;
        }
        return UsersArry;
    }

生成试卷

满足不同难度下的题目格式要求,括号生成较为巧妙。其中调用judgeDuplicate函数进行题目判重。

 static void getPaper(int n, User user) throws IOException {
        String paperdir = "C:\\Users\\wen\\Documents\\Windows OS\\wyb papers";
        File dir = new File(paperdir + "\\" + user.getName());
        int k = 1;
        String content = new String();
        String[][] problem = new String[n][];
        int[] arrylen = new int[n];
        String[] symbol = new String[]{"+", "-", "*", "/", "^2", "√", "sin", "cos", "tan"};
        while (k != n + 1) {
            Random r = new Random();
            int num;
            problem[k-1] = new String[25];
            if (user.getGrade().equals("小学")) {
                num = r.nextInt(4) + 2;
            } else {
                num = r.nextInt(5) + 1;
            }
            int m = 0;
            for(int i = 0; i <= num-2; i++) {
                problem[k-1][m] = new String(Integer.toString((r.nextInt(100)) + 1)) ;
                m++;
                problem[k-1][m] = new String(symbol[r.nextInt(4)]);
                m++;
            }
            problem[k-1][m] = new String(Integer.toString((r.nextInt(100)) + 1));
            m++;
            problem[k-1][m] = new String("=");
            m++;
            arrylen[k-1] = m;
            k++;
        }
        k--;
        String[][] problem2 = new String[n][];
        int[] arrylen2 = new int[n];
        for (int i = 0; i <= k-1; i++) {
            problem2[i] = new String[25];
            int len = arrylen[i];
            Random r = new Random();
            int flag = -1;
            int m = 0;
            for(int j = 0; j <= len-1; j++) {
                if (r.nextBoolean() && j <= len - 4 && problem[i][j].matches("\\d+") && flag == -1) {
                    problem2[i][m] = new String("(");
                    m++;
                    flag = i;
                    n++;
                }
                problem2[i][m] = new String();
                problem2[i][m] = problem2[i][m].concat(problem[i][j]);
                m++;
                if((r.nextBoolean() &&  (j-2>=flag) && problem[i][j].matches("\\d+") && flag != -1) ||
                        (j == len-2 &&flag != -1)){
                    problem2[i][m] = new String(")");
                    m++;
                    flag = -1;
                }
            }
            arrylen2[i] = m;
        }
        if (user.getGrade().equals("小学")) {
            for (int i = 0; i <= k-1; i++) {
                String str = new String();
                content = content.concat(Integer.toString(i + 1)).concat(".");
                for (int q = 0; q <= arrylen2[i]-1; q++) {
                    str = str.concat(problem2[i][q]);
                }
                content = content.concat(str).concat("\n");
            }
        } else if (user.getGrade().equals("初中")) {
            for (int i = 0; i <= k-1; i++) {
                String str = new String();
                content = content.concat(Integer.toString(i + 1)).concat(".");
                for (int q=0 ; q <= arrylen2[i]-1; q++) {
                    str = str.concat(problem2[i][q]);
                }
                Random r = new Random();
                int symbolNum = r.nextInt(arrylen[i] - 1) + 1;
                while (symbolNum != 0) {
                    for (int j = 0; j <= str.length() - 1; j++){
                        if ((symbolNum != 0) && r.nextBoolean() && str.substring(j, j + 1).matches("\\d+") &&
                                str.charAt(j) != '0'){
                            if (j == 0 ) {
                                str = symbol[5] + str.substring(0, str.length());
                            } else if ((j == str.length()-2) && (str.charAt(j - 1) != '√')) {
                                str = str.substring(0, j + 1) + symbol[4] + "=";
                            } else if((str.charAt(j-1) != '√')) {
                                if (r.nextBoolean()) {
                                    str = str.substring(0, j) + symbol[5] + str.substring(j, str.length());
                                } else {
                                    str = str.substring(0, j + 1) + symbol[4] + str.substring(j + 1, str.length());
                                }
                            }
                            symbolNum--;
                            break;
                        }
                    }
                }
                content = content.concat(str).concat("\n");
            }
        } else if (user.getGrade().equals("高中")) {
            for (int i = 0; i <= k-1; i++) {
                String str = new String();
                content = content.concat(Integer.toString(i + 1)).concat(".");
                for(int q = 0; q <= arrylen2[i] - 1; q++){
                    str = str.concat(problem2[i][q]);
                }
                Random r = new Random();
                int symbolNum = r.nextInt(arrylen[i] - 1) + 1 ;
                while (symbolNum != 0) {
                    for (int j = 0; j <= str.length() - 1; j++) {
                        if ((symbolNum != 0) && r.nextBoolean() && str.substring(j, j + 1).matches("\\d+")) {
                            String sym = symbol[r.nextInt(3) + 6];
                            if (j ==0 ) {
                                str = sym + str.substring(0, str.length());
                            } else if ((j == str.length() - 2) && (str.charAt(j - 1) != 'n') &&
                                    (str.charAt(j - 1) != 's')) {
                                str = str.substring(0, j) + sym + str.substring(j, str.length());
                            } else if ((str.charAt(j - 1) != 'n') && (str.charAt(j - 1) != 's')) {
                                str = str.substring(0, j) + sym + str.substring(j, str.length());
                            }
                            symbolNum--;
                            break;
                        }
                    }
                }
                content = content.concat(str).concat("\n");
            }
        }
        if (!dir.exists()) {
            dir.mkdir();
            System.out.println(content);
            makeFile(user, content);
        } else {
            if (judgeDuplicate(user, content) == 1) {
                getPaper(n, user);
            } else {
                System.out.println(content);
                makeFile(user, content);
            }
        }
    }

题目判重

便利用户目录下的每个文件,判断题目是否有重复

 static int judgeDuplicate(User user, String content) throws IOException {
        String[] contentAyy = content.split("\n");
        String paperdir = "C:\\Users\\wen\\Documents\\Windows OS\\wyb papers\\" + user.getName();
        File file = new File(paperdir);
        File[] tempList = file.listFiles();
        for (int i = 0; i < tempList.length; i++) {
            FileReader fr = new FileReader(tempList[i]);
            BufferedReader br = new BufferedReader(fr);
            String tmp;
            String[] tmpArry = new String[2];
            while ((tmp = br.readLine()) != null) {
                tmpArry = tmp.split("\\.");
                for (int a = 0; a <= contentAyy.length-1; a++) {
                    String[] con = contentAyy[a].split("\\.");
                    if (con[1].equals(tmpArry[1])) {
                        System.out.println("警告!!!重复!!!即将生成下一份试卷!!!");
                        return 1;
                    }
                }
            }
        }
        return 0;
    }
}

Paper类

image

User类

image

2.3 代码规范

使用google java style ,格式清晰明了
image

三.总结与改进

队友王彦博完成了中小学试卷生成系统中的功能,代码符合编程规范且逻辑清晰。待改进之处如下:

  • 文件输出格式可以进一步改进,即在每道题目间空一行,
  • 试卷生成系统在登录并生成试卷之后就退出执行了,建议加入多次出题的功能。
posted @ 2022-09-14 16:30  文齐  阅读(216)  评论(0)    收藏  举报