结对编程前对队友程序的分析与对比总结
1. 项目需求
1.1 项目名称
中小学数学卷子自动生成程序
1.2 用户
小学、初中、高中老师
1.3 功能
- 命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入 正确的用户名、密码”,重新输入用户名、密码:
- 登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
- 目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5)
- 登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
- 成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
- 附表
(1)附表1–用户名及密码

(2)附表2–小学、初中、高中题目难度要求

2. 对队友程序的分析
2.1 主要函数分析
- static void menu()
(1)参数:无。
(2)功能:显示主菜单,进行操作选项的选择 0-退出 1-登陆。
(3)实现:输出提示+接收选项命令后使用if-else语句进行判断。
(4)调用函数:无。 - static void login()
(1)参数:无。
(2)功能:接收由键盘输入的用户名和密码信息。
(3)实现:接收一个字符串(用户名+一个空格+密码)。
(4)调用函数:check_userright(login_username, login_password)检查用户名和密码是否正确。 - static void check_userright(String x,String y)
(1)参数:String x–输入的用户名;String y–输入的密码。
(2)功能:将传入的用户名和密码与设置好的9个用户名进行比对,如果和其中的一个相同则进入下一个登录界面,进行产生题目数量的合理性检查;如果和9个设置好的用户名均不相同,则需要重新输入。
(3)实现:在一个for循环中,调用user[i].checkmessage函数,如果用户名和密码均相同,则调用menu2函数,进行下一个功能,同时将难度等级作为menu2的参数传入;如果均不相同,则调用login,从新输入用户名和密码。
(4)调用函数:user[i].checkmessage获取已设置好的9个用户名和密码;menu2进入下一个功能;login再次输入用户名和密码;getLevel返回难度等级(小学、初中、高中)。 - static void menu2(String x,String y)
(1)参数:String x–用户名;String y–难度等级(小学、初中、高中)。
(2)功能:第二界面菜单,进行产生题目数量合理性检查
(3)实现:首先选择是切换卷子类型还是直接出题:如果切换卷子类型,则重新设置难度参数;输入题目数量时如果输入-1,则调用menu函数,返回到最初的主界面菜单;如果输入[10,30]则调用display函数,进行出题;如果输入超出前两个范围,则重新输入。
(4)调用函数:menu返回最初登陆界面;display进行出题。 - static void menu3(String username,String level,int paper_num)
(1)参数:String username–用户名;String level–难度等级(小学、初中、高中);int paper_num–题目数量。
(2)功能:重复操作出题步骤和切换难度步骤。
(3)实现:输入题目数量具体判断和menu2中相同。
(4)调用函数:无。 - static String paper_level(String x)
(1)参数:String x–输入的难度等级(小学、初中、高中)。
(2)功能:接收传入的难度参数,根据难度获取卷子。
(3)实现:根据难度等级的不同,调用不同的获取试卷函数:小学paper_create_p(x);初中paper_create_m(x);高中paper_create_s(x)。
(4)调用函数:paper_create_p(x)小学难度试卷;paper_create_m(x)初中难度试卷;paper_create_s(x)高中难度试卷。 - static String paper_create_p(String x)
(1)参数:String x–难度(小学、初中、高中)。
(2)功能:出一张试卷。
(3)实现:调用小学难度出题函数Q_create_p(x)。
(4)调用函数:Q_create_p(x)小学难度出题。 - static String paper_create_m(String x)
(1)参数:String x–难度(小学、初中、高中)。
(2)功能:出一张试卷。
(3)实现:调用初中难度出题函数Q_create_m(x)。
(4)调用函数:Q_create_m(x)初中难度出题。 - static String paper_create_s(String x)
(1)参数:String x–难度(小学、初中、高中)。
(2)功能:出一张试卷。
(3)实现:调用高中难度出题函数Q_create_s(x)。
(4)调用函数:Q_create_s(x)高中难度出题。 - static void display(String username,String level,int paper_num)
(1)参数:String username–用户名;String level–难度(小学、初中、高中);int paper_num–出题数量)。
(2)功能:在对应用户的文件夹下产生一张试卷(含查重)。
(3)实现:获取时间作为文件名称;创建对应名称文件夹;调用paper_level函数随机生成一张试卷;查重:获取文件夹下每一个文件的名称,进入每一个文件获取每一行题目和刚刚生成的题目进行对比(不含题号),如果重复则重新生成一道题目,如果均没有重复则写入文件中;此过程重复9次(张三1、2、3,李四1、2、3,王五1、2、3)。在创建完试卷后判断下一步的功能:重新登陆(调用menu函数)或者继续生成试卷(调用menu3函数)。
(4)调用函数:paper_level根据等级产生试卷;menu重新接受登陆的用户名和密码;menu3再次生成试卷。 - static String add_bracket(String x,int y)
(1)参数:String x–难度(小学、初中、高中),int y --运算符的数量。
(2)功能:向题目中合适的位置添加括号。
(3)实现:记下所有可能的左右括号的位置随机添加并检查合理性。
(4)调用函数:无。 - static String Q_create_p(String x)
(1)参数:String x–难度(小学、初中、高中)。
(2)功能:随机生成一道小学难度的题目。
(3)实现:随机生成运算符的数量(题目的额长度);每次随机生成一个操作数并一个运算符(存在一个数组中),将每次生成的内容写入一个字符串中形成一个题目;最后调用add_bracket进行括号的添加。
(4)调用函数:add_bracket添加括号。 - static String Q_create_m(String x)
(1)参数:String x–难度(小学、初中、高中)。
(2)功能:随机生成一道初中难度的题目。
(3)实现:随机生成运算符的数量(题目的额长度);每次随机生成一个操作数并一个运算符(存在一个数组中),将每次生成的内容写入一个字符串中形成一个题目;调用add_bracket进行括号的添加;判断根号和平方的位置,如果不合理进行相应的调整。
(4)调用函数:add_bracket添加括号。 - static String Q_create_s(String x)
(1)参数:String x–难度(小学、初中、高中)。
(2)功能:随机生成一道高中难度的题目。
(3)实现:随机生成运算符的数量(题目的额长度);每次随机生成一个操作数并一个运算符(存在一个数组中),将每次生成的内容写入一个字符串中形成一个题目;调用add_bracket进行括号的添加;判断根号和平方的位置,如果不合理进行相应的调整;判断sin cos tan的位置,如果不合理进行相应的调整。
(4)调用函数:add_bracket添加括号。
2.2 优点
- 封装性
将一些普遍性的功能进行了函数的封装(添加括号,菜单界面等),减少了一些代码的重复,使代码的长度减少,减轻了代码的赘余。 - 信息保密化
用户名和密码等信息不能直接获取,需要用特定的函数返回才可以获取,保证了信息的安全性。 - 用户体验感良好
设置了美观的菜单界面,用户登陆系统后每次输入前都会有文字提示输入的内容和格式,还可以在功能中进行选择,体验感良好。
2.3 缺点
- 代码过长
虽然对一些功能进行了封装,但是还有一些功能也可以封装成一个函数,比如在初中难度出题时可以在调用已有的小学难度出题函数的基础上增加初中难度的要求,同理,在高中难度出题时可以调用初中函数并增加高中的难度要求,这样可以使代码更加剪短,阅读更加方便。 - 函数参数名不直观
一些函数的参数为x、y这样的随意字母,阅读起来很不直观,不能直接获得此参数的用途和功能等有效信息。
3. 与自己的程序比较
我们都是用的Java,很多功能的思考方式都相同(查重、创建文件、设置用户名和密码信息、将信息设置为私有只能通过函数调用等),但是我的程序中没有添加菜单界面,只有每次输入前的提示,在用户体验感方面需要加强。我们有相同的问题都是代码过长,封装性不够高,导致程序阅读起来很困难,这一点在结对编程时希望我们可以共同努力。
4. 个人项目总结
4.1 收获
- 学会了Java中获取实时时间的函数。
- 学会了创建文件夹的方法(包括相对路径和绝对路径)。
- 学会了Java中文件读写的方法,并可以简单应用。
- 学会了打包jar的方法,并可以在cmd中使用命令行直接运行程序。
4.2 总结
这次的个人项目让我真切的感受到了“做中学”的含义,在做项目前我会的只是Java这门语言的简单编程规则,在项目进行的过程中,我不断被需要的技术卡住,每次都需要停下来学一学相关的知识技能,然后继续编程。在这次个人项目中,我的能力得到了很快的提升,我已经可以基本适应这种“一遍做一遍学,学完立刻做”的模式,让我对接下来要进行的结对编程和团队项目有了一些信心,希望我可以在后面的项目中可以更快更好提升自己,掌握更多知识技能!

浙公网安备 33010602011771号