结对编程项目分析
结对编程项目分析
项目名称:中小学数学卷子自动生成程序
主要功能:登录,切换账号,生成题目,查重,将试卷输出到指定文件夹
开发环境
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编程,队友代码思路严谨,较人性化,考虑了多种情况,安插了大量系统提示,使用感好。
反思
没有经过大量测试,代码使用时没考虑到很多情况,造成使用体验感较差,同时函数名不规范,代码复用率不高