一、作业要求
(1)能够自动生成四则运算练习题
(2)可以定制题目数量
(3)用户可以选择运算符
(4)用户设置最大数(如十以内、百以内等)
(5)用户选择是否有括号、是否有小数
(6)用户选择输出方式(如输出到文件、打印机等)
(7)最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二、任务分工
驾驶员:王赫(负责代码编写和图形化设计)
领航员:李凌宇(负责测试)
三、算法细节
1.项目类的功能简介
(1)MyCount.java:用于生成四则运算图形化界面,以及运行该项目产生结果
(2)Calculator.java:用于产生四则运算表达式
(3)OutPutFile.java:用于将生成的四则运算表达式保存到.txt文本文件中
2.函数的功能介绍
(1)createOperator():生成运算符
public void createOperator() {
Random ra = new Random();
int pointer = 0;
int l = 4;
if(!createMD)
l = 2;
int length = 2+(int)ra.nextInt(4);
for(int i=0;i<length;++i) {
pointer =ra.nextInt(l);
if (i!=0&&operator[pointer]==arrOperator.get(i-1))
i--;
else
arrOperator.add(operator[pointer]);
}
}
(2)addInteger():生成整数
public void addInteger() {
int i=0;
Random ra = new Random();
int d = ra.nextInt(maxNumber);
arrNumber.add(new StringBuffer(Integer.toString(d)));
for(StringBuffer sb:arrOperator) {
int m = createInteger(i,sb);
arrNumber.add(new StringBuffer(Integer.toString(m)));
++i;
}
}
(3)addDecimal():生成小数
public void addDecimal() {
Random ra = new Random();
int d = ra.nextInt(maxNumber-1)+1;
arrNumber.add(new StringBuffer(Integer.toString(d)));
double flag = 0;
for(StringBuffer sb:arrOperator) {
flag = ra.nextDouble();
if(flag<0.7) {
arrNumber.add(new StringBuffer(Integer.toString(ra.nextInt(maxNumber-1)+1)));
}else {
StringBuffer st = new StringBuffer();
st.append(ra.nextInt(maxNumber));
st.append('.');
st.append(ra.nextInt(maxNumber));
arrNumber.add(st);
}
}
}
(4)addBrackets()和departInteger(int i):生成带有括号的表达式
public void addBrackets() {
int tempI;
double tempD;
int i = 0;
boolean jump = false;
for(StringBuffer sb:arrNumber) {
tempD = Double.parseDouble(sb.toString());
tempI = (int)tempD;
if((tempD-tempI)<0.00000001&&(tempI>1)) {
String s = String.valueOf(tempD);
for(int t=0;t<s.length();++t)
if(s.charAt(t)!='.') {
departInteger(i);
jump = true;
break;
}
if(jump)
break;
}
++i;
}
}
public void departInteger(int i) {
Random ra = new Random();
int l = 4;
if(!createMD)
l=2;
int pointer = ra.nextInt(l);
int number1 = 0;
int number2 = 0;
StringBuffer s = arrNumber.get(i);
int element = Integer.parseInt((s.toString()));
if(pointer == 0) {
number1 = ra.nextInt(element);
number2 = element - number1;
StringBuffer newS = new StringBuffer("("+Integer.toString(number1)+"+"+Integer.toString(number2)+")");
arrNumber.remove(i);
arrNumber.add(i,newS);
}else if(pointer == 2) {
for(number1=element;number1>0;--number1)
if(element%number1 == 0) {
number2 = element/number1;
break;
}
StringBuffer newS = new StringBuffer("("+Integer.toString(number1)+"*"+Integer.toString(number2)+")");
arrNumber.remove(i);
arrNumber.add(i,newS);
}else if(pointer == 3) {
for(int j=maxNumber-1;j>=1;++j)
if(j%element==0) {
number1 = j;
break;
}
number2 = number1/element;
StringBuffer newS = new StringBuffer("("+Integer.toString(number1)+"/"+Integer.toString(number2)+")");
arrNumber.remove(i);
arrNumber.add(i,newS);
}
}
(5)createInteger():排除除数是0的情况
private int createInteger(int i,StringBuffer sb) {
Random ra = new Random();
if(sb==operator[3]) {
int num = Integer.parseInt(arrNumber.get(i).toString());
if(num == 0)
return ra.nextInt(maxNumber)+1;
for(int j = num-1;j>0;--j)
if(num%j == 0)
return j;
}
return ra.nextInt(maxNumber)+1;
}
(6)create(Boolean MD, Boolean pointNum, Boolean brackets,String maxNum):调用以上函数产生表达式,MD代表四则表达式是否有乘除, pointNum代表是否有小数, brackets代表是否有括号,maxNum代表最大数值
public ArrayList<StringBuffer> create(Boolean MD, Boolean pointNum, Boolean brackets,String maxNum) {
if(pointNum == false)
createDecimal = false;
if(brackets == false)
createBrackets = false;
if(MD == false)
createMD = false;
maxNumber = Integer.parseInt(maxNum);
operator[0] = new StringBuffer("+");
operator[1] = new StringBuffer("-");
operator[2] = new StringBuffer("*");
operator[3] = new StringBuffer("/");
arrOperator= new ArrayList<StringBuffer>();
arrNumber = new ArrayList<StringBuffer>();
arrDemo = new ArrayList<StringBuffer>();
createOperator();
if(createDecimal)
addDecimal();
else
addInteger();
if(createBrackets)
addBrackets();
Merge();
return arrDemo;
}
四、项目结果
1.结果样例
(1)数值范围在100以内
(2)选择所有算符
(3)生成50道题
(4)生成的题目保存到文件中,并显示到预览文本框中
2.结果截图
(1)文本框显示
(2)文本文件显示
五、项目总结
通过此次结对作业,我对项目的大体流程有了简单的了解,感触最深的是这次我们并不是像以前一样,用一个超级大类去实现功能,而是将功能分为多个类去实现,完成以后才觉得这样确实使项目层次分明,理解起来更加容易。此外,这次的项目我负责算法生成和图形化界面设计,李凌宇负责代码测试,虽然项目有些困难,但毕竟是两个人,总是有信心能够完成,这让我们两个对于结对编程产生了更大的兴趣。在我写代码过程中,很多基础的知识都需要去查百度和书籍,可见以前会的知识要经常巩固,否则会耽误很多不必要的时间。
这次项目中,需要考虑的因素有很多,比如要排除除数是零的情况,还有功能实现以后怎样在图形化界面中实现这个功能也是其中的重要组成部分,遗憾的是虽然图形化界面基本完成,但样式却不美观,制作过程花费很多时间成果却不显著,可见一个完整的项目,需要了解多方面知识。值得庆幸的是,我的领航员在制作图形化界面的时候查了许多资料,帮助我完成这次设计,还有算法设计的过程中也帮我指出许多不必要发生的错误,加快了项目进程,结对编程在此处发挥了巨大的作用。虽然结对编程告一段落,但以后我会注重结对编程,因为它是提高效率的最好方法之一。