结对编程项目分析

结对编程项目分析

项目名称:中小学数学卷子自动生成程序
主要功能:登录,切换账号,生成题目,查重,将试卷输出到指定文件夹

开发环境

java

代码思路

分成以下四个模块

LoginFrame 用户登录及操作界面

  • 简要描述:

队友根据所给的数据要求设置用户信息:
1.用户的数据主要包括用户名、密码,其中把用户的密码统一用String存储。
2.登陆时首先判断用户选择登录/退出,进入登陆界面后输入用户信息(用户名、密码)
3.根据密码正确与否决定是否进行用户名的判断:
4.用户登录失败则给出系统提示
5.用户成功登陆则选择是否切换类型
若切换,则更改当前输出的题目类型

具体实现

  • 变量
 public static String type;      //小学、初中、高中类别选择
 static String PASSWORD = "123";
  • 登陆界面函数:login(),用于判断用户输入信息前,选择登录/退出
public static void login() {
        System.out.println("---------欢迎登录-------------");
        System.out.println("0:登录\n1:退出");
        Scanner in0 = new Scanner(System.in);
        int c0 = in0.nextInt();
        if (c0 == 1) {
            System.exit(0);
        } else {
            getIn();
        }

    }

  • 登录函数:getIn(),用于用户输入信息、判断用户信息是否正确,内置用户类型

提示文字、变量设置

System.out.println("请输入用户名和密码:");
Scanner in = new Scanner(System.in);
String name = in.nextLine();
int flag = 0;//用于判断用户名是否是规定用户名之一

队友在此采用判断方法是把所有用户密码单独存储(因为都相同)

  • 先判断用户名是否符合要求:例张三1 密码123 则输入的字符串长度为7(带空格)

*获得这个字符串后再进行字符串分割,得到需要的信息

if (name.length() == 7) {
            String name1 = name.substring(0, 2);       //截取用户名的中文部分
            String name2 = name.substring(2, 3);       //截取用户名的数字部分
            String name3 = name.substring(0, 3);       //截取用户名的数字部分
            String key = name.substring(4);           //截取密码部分
            WriteFile.NAME = name3;  //获取名字,用于之后的文件夹选择
  • 判断用户信息,
    若成功登录,按照要求设定用户类型,flag=1,向用户显示登陆成功
    否则,flag=0,显示登陆失败
            if (key.equals(PASSWORD)) {  //在密码正确的情况下去判断用户名是否正确
                if (name2.equals("1") || name2.equals("2") || name2.equals("3")) {
                    if (name1.equals("张三")) {
                        flag = 1;
                        type = "小学";
                    } else if (name1.equals("李四")) {
                        flag = 1;
                        type = "初中";
                    } else if (name1.equals("王五")) {
                        flag = 1;
                        type = "高中";
                    }
                }
            }
        }
  • 向用户显示登录结果
if (flag == 0) {
            System.out.println("请输入正确的用户名、密码!");
            System.out.println("--------------------------");
            getIn();
        } else {
            System.out.println("--------------登录成功!-------------");
            System.out.println("当前选择为" + type + "出题");
            TestFrame.getTest();
        }
  • 主函数
public static void main(String[] args) {
        login();
    }

CreateTest 生成题目

  • 简要概述

题目生成为字符串,通过随机数大小达到随机匹配符号的功能
期间用hashmap存储题目用于查重,但因为程序每次出完题目会自动退出登录,hashmap随之重置,只能实现单个文档不重复生成题目,不能实现单个用户没有不重复题目

  • 实现题目不重复
static HashSet<String> TotalTest = new HashSet<String>();     //用来记录生成的所有题目
  • create()很有巧思!

生成操作数数量、数值、生成的题目(不完整),题号,进入count()后生成完整题目,将其与题号结合,构成一道题,输出到txt

    public static void create() {
        for (int i = 0; i < testNum; i++) {
            //因为Math.random()的取值范围是[0,1),所以要让随机生成的操作数在1-5之间,那么生成的算数就要在2-6之间,就要使公式变为4*Math.random()+2
            sum = (int) (4 * Math.random() + 2);
            top = (int) (Math.random() * 100) + 1;
            formula = String.valueOf(top);        //将各种类型的函数转换成字符串
            orderString = "(" + order + ") ";
            word = orderString;
            count();
            totalNum = TotalTest.size();
            word += formula + "=()";
            WriteFile.sentence += (word + "\n");
            WriteFile.sentence += "\n";        //题目间空一行
            order++;
        }
        WriteFile.writetext();
        order = 1;
    }
  • count(),生成单道题目
  • 初中、高中的题目,每一项都含有特殊符号

相当于把一道题的各部分拆解,在该函数里按顺序填充,如果能把每一项是否出现特殊符号(√、sin……)变成随机的,代码会更完美
部分代码如下:

public static void count() {
        while (true) {
            for (int j = 0; j < sum - 1; j++) {
                if (testType.equals("初中")) {
                    //用来开根号和开平方
                    double operate1 = Math.random();
                    if (operate1 < 0.5) {
                        formula = formula + "^(1/2)";   //开根号
                    } else {
                        formula = formula + "^(2)";     //开平方
                    }
                }

                double operate2 = Math.random();           //用来随机生成操作数加减乘除
                number = (int) (Math.random() * 100) + 1;      //随机生成一个数字

                
    }

TestFrame 用户操作:切换/生成题目

简要概述:系统提示、用户输入信息、退出登录

  • getTest() 切换类型界面

  • test() 生成题目

WriteFile 将题目打印到.txt文件

  • 简要概述 用于生成txt文件
    不足:文件路径固定,他人使用时要修改路径

  • writetext() 数据输出

    public static void writetext() {
        gettime();
        filepath = "D:/zhuomian/rg/team_eva/软件2001叶宸宇/single_project/数学卷/" + NAME + "/" + time + ".txt";

    }

评价

优点:
1.代码简洁,结构清楚,用多个界面巧妙地化简了题目
2.注释详细,每个变量都标注其用途
3.生成题目的方法很巧妙,值得借鉴
不足:
1.生成题目时不是完全随机,初高中题目的每一项都带有特殊符号
2.用户每生成一次题目就会退出登录,想要继续生成只能重新登录
3.不能在单个用户生成的题目里进行查重,只能在单个文档里查重
4.生成的题目不带括号
5.部分函数名不符合命名规范

建议:
1.用户数据可以增加用户类型这一属性,

总结

队友和我都用了java编程,队友代码思路严谨,较人性化,考虑了多种情况,安插了大量系统提示,使用感好。

反思

没有经过大量测试,代码使用时没考虑到很多情况,造成使用体验感较差,同时函数名不规范,代码复用率不高

posted @ 2022-09-13 18:10  弗棵  阅读(225)  评论(0编辑  收藏  举报