结对编程——基于JAVA开发的中小学生数学试卷自动生成程序
作者:互联网
这两个星期,我和覃同学一起参与了基于个人项目的中小学生数学试卷的自动生成程序结对编程项目。结对编程的实现是基于个人编程的,不过由于我是用c++而同伴是用的PYTHON商量之后我们决定用JAVA从头开始写,整个过程中工作量还是非常大的,花了很长时间完善项目。出题方法基本上借鉴了之前的思路,不过结对项目中有了新的要求,我们也想办法逐一满足了更新之后的需求。我的同伴负责了全部界面和阿里云短信接口服务的部分。在此之前我的JAVA基础其实是非常薄弱的,多谢覃同学一直帮忙讲解。
首先就是个人项目的部分是不要求计算算式结果的,只需要生成算式即可。但是结对编程中需要生成最终分数,即意味着需要我们对算式结果和选择题答案进行比较,我得知JAVA中其实是有计算算式的函数的,不过一开始我们生成的算式并不是可以被计算出的规范算式,所以在如何转化为可以直接计算的JAVA算式时耗费了一番功夫,比如说需要把算式中的等号去掉,再把我们日常习惯使用但却无法被识别(如^2之类)的转化为可计算算式,其中最困难的就是三角函数sin、cos和tan的计算,不过好在后来借鉴括号的配对规则顺利解决。
//这是我觉得很巧妙的括号配对实现,将括号和其他运算符创立一个字符串数组,其中定义了leftbra和rightbra两个变量来计算左右括号的数量,从而实现括号之间的匹配
Random ran=new Random();
for(int i=0;i<num;i++)
{
for(int j=0;j<ran.nextInt(4)+1;j++)
{
int rannum=ran.nextInt(5);
if(rannum==5)
{
rannum=rannum-2;
}
else if(rannum<=3)
{
System.out.print(num1[ran.nextInt(100)]);
}
System.out.print(str[rannum]);
if(rannum==4)
{
System.out.print(num1[ran.nextInt(100)]);
System.out.print(str[rannum-ran.nextInt(3)-1]);
}
if(rannum==4)
{
leftbra++;
}
else if(rannum==5)
{
rightbra++;
}
}
System.out.print(num1[ran.nextInt(100)]);
while(leftbra>rightbra)
{
System.out.print(str[5]);
rightbra++;
}
System.out.println("=");
}
//这是算式转化中的一小部分代码
while((str=br1.readLine())!=null)
{
str=str.replaceAll("Math.sin", "sin");
str=str.replaceAll("Math.cos", "cos");
str=str.replaceAll("Math.tan", "tan");
str=str.replaceAll("Math.pow\\(", "(");
str=str.replaceAll(",0.5\\)", ")^0.5");
str=str.replaceAll(",2\\)", ")^2");
System.out.println(str);
}
至于选择题中的各个答案,我们是采取的在正确答案基础上随机生成小范围加减后的数字作为错误答案,这样的话增强了题目的合理性。
在做出界面之后,也遇到了一些问题,如在考虑保密性的情况下如何将密码转化为不可显示的星号。我查阅了相关资料,发现可以调用.setEchoChar('*')来解决这一问题。可是调用后却发现,原来文本输入框里“请输入密码”的文字提示也变成了星号,这使我哭笑不得。再和搭档权衡之后,我们最后还是没有采纳改动后的结果,而是保留了之前的界面,这也是代码中不足的部分,有时间可以日后改正。
最后就是修改密码的功能。由于数据库相关的知识储备不足,我们的代码是采用文本文档存储用户数据的方法。这样做也能基本实现功能,不过很遗憾的是我们的代码出现了BUG,如果有两个用户密码相同时,更改其中一个用户的密码也会把另一个用户的密码改掉。目前为止我们还没能很好地解决这个BUG,这算是我们结对编程项目的不足之处。
总地说来,我从这次结对编程的过程中获益匪浅。之前很少有过做项目的经验,像这样一点点构建、最后成品出来的时候满足感真的非常强烈。再次感谢搭档的辛苦劳动,从他那里我也学到了很多解决问题的方法。
标签:结对,rannum,JAVA,数学试卷,算式,System,str,out 来源: https://www.cnblogs.com/kisaragi11037/p/11605021.html