一、项目需求
用户:
小学、初中和高中学生。
功能:
1、用户注册功能。用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册;
2、用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功。密码6-10位,必须含大小写字母和数字。用户在登录状态下可修改密码,输入正确的原密码,再输入两次相同的新密码后修改密码成功;
3、密码设置成功后,跳转到选择界面,界面显示小学、初中和高中三个选项,用户点击其中之一后,提示用户输入需要生成的题目数量;
4、用户输入题目数量后,生成一张试卷(同一张卷子不能有相同题目,题目全部为选择题),界面显示第一题的题干和四个选项,用户选择四个选项中的一个后提交,界面显示第二题,...,直至最后一题;
5、最后一题提交后,界面显示分数,分数根据答对的百分比计算;
6、用户在分数界面可选择退出或继续做题;
7、小初高数学题目要求见个人项目。
二、
本次结对编程我和队友选定我的个人项目作为结对编程项目的主要参考,个人项目时我们采用的都是c++,结对编程需要实现UI界面,所以我们改用Java,我做的部分是出题部分、计分部分和出题的UI界面显示,主要复用了个人项目的出题部分代码。下面是我的感受与收获:
1、
结对编程要求将题目改成选择题,则需要我们将正确答案算出并生成另外三个选项。
在算正确答案时,我想到的是可以使用jse.eval(strs)计算出字符串式子,但这个只能计算四则运算,所以在处理初中的开方,平方和高中的三角函数时,我先将开方,平方和三角函数计算出值,再连接到字符串中,最后计算四则运算,就可以得出正确答案了。为了美观,我将开方,平方和三角函数的计算结果保留两位小数,最后的计算结果也保留两位小数。
开方:
double op=Math.sqrt(operator_rand);
DecimalFormat df = new DecimalFormat("0.00");
question=question+df.format(op);
平方:
question1=question1+which_operator[operator_number]; question=question+Math.pow(operator_rand,2);
三角函数:
if(operator_number==6) { double op=Math.sin(operator_rand2); DecimalFormat df = new DecimalFormat("0.00"); question=question+df.format(op); } else if(operator_number==7) { double op=Math.cos(operator_rand2); DecimalFormat df = new DecimalFormat("0.00"); question=question+df.format(op); } else if(operator_number==8) { double op=Math.tan(operator_rand2); DecimalFormat df = new DecimalFormat("0.00"); question=question+df.format(op); }
在处理其他的选项时,我将正确答案加上或减去一个随机数,随机数为1-5,保证和正确答案相差不大,再产生一个随机数确定正确答案的位置,然后其他选项随机分布,保证正确答案的位置随机分布。
double result1=result_all[count-1]+(int)(1+ran.nextInt(2)),result2=result_all[count-1]-(int)(1+ran.nextInt(2)),result3=result_all[count-1]+(int)(3+ran.nextInt(5)); int k=(int)(ran.nextInt(4));//随机选择答案出现在四个位置的哪一个 double result_choose[]=new double[4]; result_choose[k]=result_all[count-1]; if(k==0) { result_choose[2]=result1; result_choose[3]=result2; result_choose[1]=result3; } else if(k==1) { result_choose[2]=result1; result_choose[3]=result2; result_choose[0]=result3; } else if(k==2) { result_choose[1]=result1; result_choose[3]=result2; result_choose[0]=result3; } else if(k==3) { result_choose[1]=result1; result_choose[2]=result2; result_choose[0]=result3; }
在做显示题目的UI界面时我们一开始是让一个题目出完后显示一个题目,发现这样做UI界面无法弹出,于是我们将其改成将所有题目存入一个数组,然后在点击选择某个选项后将此窗口关闭打开另一道题的窗口,从而实现显示题目的页面。在选择到正确答案时答对题数加一,达到出题数后将答对题数除以出题数乘以100算出得分并显示。以下为部分代码:
f.setVisible(true); result_0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(k==0) { score++; } call( question_number); f.dispose(); } }); result_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(k==1) { score++; } call( question_number); f.dispose(); } }); result_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(k==2) { score++; } call( question_number); f.dispose(); } }); result_3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(k==3) { score++; } call( question_number); f.dispose(); } }); } public static void call(int question_number){ if(count<question_number){ count++; init(count,question_number); } else { if(count==question_number) { sum=(score/question_number)*100;//总分 JFrame fs; fs = new JFrame(); fs.setBounds(600, 100, 500, 350); fs.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fs.getContentPane().setLayout(null); JLabel codef = new JLabel("得分为"+sum); codef.setBounds(163, 92, 151, 50); fs.getContentPane().add(codef); fs.setVisible(true); //frame.setVisible(true); } } }
在我做完我的部分后和队友做的部分连接起来的过程中,也遇到了一些问题,我们主要是采用上网寻找解决方法并与实际问题相结合的方式解决的,经过这次结对编程,我觉得和队友的有效沟通与合作是非常重要的,并且学到了很多Java UI界面的相关知识和前后端如何更好的结合。在完成自己部分的代码时,我会更注重写的条理清晰一些,并加上一些必要的注释,有利于队友理解,队友的各个页面的代码也分成了几个模块,我在理解时很快就能找到对应部分,有利于后期debug。正是我们的不懈努力和对项目的不断完善,最终完成了本次结对编程项目。