结对作业
1 成员信息和github项目地址
1.1成员信息
这个作业属于哪个课程 | 班级链接 |
---|---|
这个作业要求在哪里 | 作业链接 |
这个作业的目标 | 四则运算生成器+生成应用程序+结对 |
项目成员1 | 3119005454 陈嘉喜 Github地址 |
项目成员2 | 3119005480 谢晓岚 Github地址 |
1.2 Github链接click on
2 效能分析
-
全部性能
-
类的占用情况
- CPU视图
因为我电脑上的Jprofiler体验时间已经到了,所以我选择了免费的visualvm性能分析软件。可以看到byte[]占的内存最大,17%左右,在程序出现问题时可以从这方面入手。一开始因为求最大公因数的函数写错,导致陷入死循环,所以产生不到10000个式子,后来通过性能分析,完美地找到了出错点。
3 设计实现过程
3.1 类和类的结构
总共有七个类,四个用于运行程序的类,三个单元测试的类,工程结构图如下:
三个实现核心功能的类topic_structure,operator_structure,number_structure结构如下:
- topic_structure
- operator_structure
- number_structure
3.2 类之间的关系
number_structure用于产生随机数字,operator_structure用于重构加减乘除并计算只有一个运算符的结果,topic_structure用于生成题目和结结果,MAIN相当于接口的功能,实现数据的输入和输出。
3.3 关键函数
- gcd函数(求最大公因数)的流程图:
- turn_two(把结果转化为真分数格式)函数的流程图:
4 代码说明
- number_structure类,随机选取分数和整数两种情况,结果返回到String[] result中,包括分子部分,分母部分,整数部分。如果返回的是整数,分子,分母部分就为空格;如果返回的是分数,整数部分就为空格。代码如下:
public class number_structure {
public static void main(String[] args) {
}
int range;
String[] result;
public number_structure(int range) {
this.range=range;
int a1=(int)(Math.random()*2+1);
if(a1==1) {result=fractional_number();}
else
{int x=(int)(Math.random()*(range-1)+1);String inter=String.valueOf(x);String[] r= {inter,"","",inter};result=r;}
}
//分数结构
public String[] fractional_number(){
int t = 0;
int x1=1+(int)(Math.random()*10);
int x2=1+(int)(Math.random()*10);//分母
if(x2<=x1 ){
t = x2;
x2 = x1;
x1 = t;
if( x1 == x2 ) {
x1 = x1 - 1;//保证分子比分母小
}
}
int x_1=x1/(gcd(x1, x2));
int x_2=x2/(gcd(x1, x2));
String str_up = String.valueOf( x_1 );
String str_down = String.valueOf( x_2 );
String str = str_up + "/" + str_down ;
String[] arr = {str,str_up,str_down,""};
return arr;
}
//求公因子
public int gcd(int a, int b) {
while (b != 0) {
int c = a % b;
a = b;
b = c;
}
return a;
}
}
- operator_structure类,加减乘除的重构,每种运算符又分为(整数&&整数)(整数&&分数)(分数&&分数)(分数&&整数)四种。turn_esay()可以保证分母为1,0,分子为0的情况不存在,代码如下:
public class operator_structure {
public static void main(String[] args) {
}
String inter1;
String inter2;
String str_up1;
String str_down1;
String str_up2;
String str_down2;
String site;
String[] result;
//String str_up3,String str_down3分数结果,String inter3整数结果
public operator_structure(String str_up1,String str_down1,String inter1,String str_up2,String str_down2,String inter2,String site) {
this.inter1=inter1;
this.inter2=inter2;
this.str_up1=str_up1;
this.str_down1=str_down1;
this.str_up2=str_up2;
this.str_down2=str_down2;
this.site=site;
if(site==" + "){
if(inter1==""&&inter2=="") {result=operator_string1_1();}
else if(inter1!=""&&inter2!="") {result=operator_string1_2();}
else if(inter1==""&&inter2!="") {result=operator_string1_3();}
else if(inter2==""&&inter1!="") {result=operator_string1_4();}}
else if(site==" - "){
if(inter1==""&&inter2=="") {result=operator_string2_1();}
else if(inter1!=""&&inter2!="") {result=operator_string2_2();}
else if(inter1==""&&inter2!="") {result=operator_string2_3();}
else if(inter2==""&&inter1!="") {result=operator_string2_4();}}
else if(site==" × "){
if(inter1==""&&inter2=="") {result=operator_string3_1();}
else if(inter1!=""&&inter2!="") {result=operator_string3_2();}
else if(inter1==""&&inter2!="") {result=operator_string3_3();}
else if(inter2==""&&inter1!="") {result=operator_string3_4();}}
else if(site==" ÷ "){
if(inter1==""&&inter2=="") {result=operator_string4_1();}
else if(inter1!=""&&inter2!="") {result=operator_string4_2();}
else if(inter1==""&&inter2!="") {result=operator_string4_3();}
else if(inter2==""&&inter1!="") {result=operator_string4_4();}}
}
//加法
public String[] operator_string1_1(){
int int_up1=Integer.parseInt(str_up1);
int int_up2=Integer.parseInt(str_up2);
int int_down1=Integer.parseInt(str_down1);
int int_down2=Integer.parseInt(str_down2);
int int_up3=(int_up1*int_down2+int_up2*int_down1)/gcd((int_up1*int_down2+int_up2*int_down1),int_down1*int_down2);
int int_down3=int_down1*int_down2/gcd((int_up1*int_down2+int_up2*int_down1),int_down1*int_down2);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string1_2(){
int int1=Integer.parseInt(inter1);
int int2=Integer.parseInt(inter2);
int int3=int1+int2;
String inter3=String.valueOf(int3);
String[] arr = {"","",inter3};
return arr;}
public String[] operator_string1_3(){
int int_up1=Integer.parseInt(str_up1);
int int_down1=Integer.parseInt(str_down1);
int int2=Integer.parseInt(inter2);
int int_up3=(int_up1+int2*int_down1)/gcd(int_down1,(int_up1+int2*int_down1));
int int_down3=int_down1/gcd(int_down1,(int_up1+int2*int_down1));
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string1_4(){
int int_up2=Integer.parseInt(str_up2);
int int_down2=Integer.parseInt(str_down2);
int int1=Integer.parseInt(inter1);
int int_up3=(int_up2+int1*int_down2)/gcd(int_down2,(int_up2+int1*int_down2));
int int_down3=int_down2/gcd(int_down2,(int_up2+int1*int_down2));
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
//减法
public String[] operator_string2_1(){
int int_up1=Integer.parseInt(str_up1);
int int_up2=Integer.parseInt(str_up2);
int int_down1=Integer.parseInt(str_down1);
int int_down2=Integer.parseInt(str_down2);
if(int_up1*int_down2<int_up2*int_down1) {int t1=int_up1;int_up1=int_up2;int_up2=t1;
int t2=int_down1;int_down1=int_down2;int_down2=t2;}
int int_up3=(int_up1*int_down2-int_up2*int_down1)/gcd((int_up1*int_down2-int_up2*int_down1),int_down1*int_down2);
int int_down3=int_down1*int_down2/gcd((int_up1*int_down2-int_up2*int_down1),int_down1*int_down2);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string2_2(){
int int1=Integer.parseInt(inter1);
int int2=Integer.parseInt(inter2);
if(int1<int2) {int t=int1;int1=int2;int2=t;}
int int3=int1-int2;
String inter3=String.valueOf(int3);
String[] arr = {"","",inter3};
return arr;}
public String[] operator_string2_3(){
int int_up1=Integer.parseInt(str_up1);
int int_down1=Integer.parseInt(str_down1);
int int2=Integer.parseInt(inter2);
int a_up2=int2*int_down1;
int a_down2=int_down1;
if(int_up1<int2*int_down1) {int t1=int_up1;int_up1=a_up2;a_up2=t1;
int t2=int_down1;int_down1=a_down2;a_down2=t2;}
int int_up3=(int_up1*a_down2-a_up2*int_down1)/gcd((int_up1*a_down2-a_up2*int_down1),int_down1*a_down2);
int int_down3=int_down1*a_down2/gcd((int_up1*a_down2-a_up2*int_down1),int_down1*a_down2);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string2_4(){
int int_up2=Integer.parseInt(str_up2);
int int_down2=Integer.parseInt(str_down2);
int int1=Integer.parseInt(inter1);
int a_up1=int1*int_down2;
int a_down1=int_down2;
if(int_up2<int1*int_down2) {int t1=int_up2;int_up2=a_up1;a_up1=t1;
int t2=int_down2;int_down2=a_down1;a_down1=t2;}
int int_up3=(int_up2*a_down1-a_up1*int_down2)/gcd((int_up2*a_down1-a_up1*int_down2),int_down2*a_down1);
int int_down3=int_down2*a_down1/gcd((int_up2*a_down1-a_up1*int_down2),int_down2*a_down1);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
//乘法
public String[] operator_string3_1(){
int int_up1=Integer.parseInt(str_up1);
int int_up2=Integer.parseInt(str_up2);
int int_down1=Integer.parseInt(str_down1);
int int_down2=Integer.parseInt(str_down2);
int int_up3=int_up1*int_up2/gcd(int_up1*int_up2,int_down1*int_down2);
int int_down3=int_down1*int_down2/gcd(int_up1*int_up2,int_down1*int_down2);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string3_2(){
int int1=Integer.parseInt(inter1);
int int2=Integer.parseInt(inter2);
int int3=int1*int2;
String inter3=String.valueOf(int3);
String[] arr = {"","",inter3};
return arr;}
public String[] operator_string3_3(){
int int_up1=Integer.parseInt(str_up1);
int int_down1=Integer.parseInt(str_down1);
int int2=Integer.parseInt(inter2);
int int_up3=int_up1*int2/gcd(int_down1,int_up1*int2);
int int_down3=int_down1/gcd(int_down1,int_up1*int2);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string3_4(){
int int_up2=Integer.parseInt(str_up2);
int int_down2=Integer.parseInt(str_down2);
int int1=Integer.parseInt(inter1);
int int_up3=int_up2*int1/gcd(int_down2,int_up2*int1);
int int_down3=int_down2/gcd(int_down2,int_up2*int1);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
//除法
public String[] operator_string4_1(){
int int_up1=Integer.parseInt(str_up1);
int int_up2=Integer.parseInt(str_up2);
int int_down1=Integer.parseInt(str_down1);
int int_down2=Integer.parseInt(str_down2);
int int_up3=int_up1*int_down2/gcd(int_up1*int_down2,int_down1*int_up2);
int int_down3=int_down1*int_up2/gcd(int_up1*int_down2,int_down1*int_up2);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string4_2(){
int int1=Integer.parseInt(inter1);
int int2=Integer.parseInt(inter2);
int int_up3=int1/gcd(int1,int2);
int int_down3=int2/gcd(int1,int2);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string4_3(){
int int_up1=Integer.parseInt(str_up1);
int int_down1=Integer.parseInt(str_down1);
int int2=Integer.parseInt(inter2);
int int_up3=int_up1/gcd(int_down1*int2,int_up1);
int int_down3=int_down1*int2/gcd(int_down1*int2,int_up1);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
public String[] operator_string4_4(){
int int_up2=Integer.parseInt(str_up2);
int int_down2=Integer.parseInt(str_down2);
int int1=Integer.parseInt(inter1);
int int_up3=int_down2*int1/gcd(int_up2,int_down2*int1);
int int_down3=int_up2/gcd(int_up2,int_down2*int1);
String str_up3=String.valueOf(int_up3);
String str_down3=String.valueOf(int_down3);
String[] arr =turn_esay(str_up3,str_down3);
return arr;}
//求公因子
public int gcd(int a, int b){
if(a==0&&b==0)
return 1;
else if(a==0)
return b;
else if(b==0)
return a;
else
return a%b==0 ? b : gcd(b, a%b);
}
//保证分母为1,0不存在,分子为0不存在
public String[] turn_esay(String up,String down){
int up_int=Integer.parseInt(up);
int down_int=Integer.parseInt(down);
String u;
String d;
String i;
if(down_int==1)
{ u=""; d="";i=up;}
else if(up_int==0||down_int==0)
{ u=""; d="";i="0";}
else
{u=up;d=down;i="";}
String[] arr = {u,d,i};
return arr;
}
}
- topic_structure,把题目分为//a+b+c+d//(a+b)+c+d//a+(b+c)+d//a+b+(c+d)//(a+b+c)+d//a+(b+c+d)//(a+b)+(c+d)//a+b+c//(a+b)+c//a+(b+c)//a+b 十一种结构,再随机选取结构,结构返回题目和答案,存在String[] result中,turn_two可以保证结果可以用真分数表示时必须用真分数表示,代码如下:
public class topic_structure {
public static void main(String[] args) {
}
int range;
String[] result;
public topic_structure(int range) {
this.range=range;
number_structure a=new number_structure(range);
number_structure b=new number_structure(range);
number_structure c=new number_structure(range);
number_structure d=new number_structure(range);
int a1=(int)(Math.random()*4+1);
String site1 = null;
if(a1==1){site1=" + ";}
else if(a1==2){site1=" - ";}
else if(a1==3){site1=" × ";}
else if(a1==4){site1=" ÷ ";}
int a2=(int)(Math.random()*4+1);
String site2= null;
if(a2==1){site2=" + ";}
else if(a2==2){site2=" - ";}
else if(a2==3){site2=" × ";}
else if(a2==4){site2=" ÷ ";}
int a3=(int)(Math.random()*4+1);
String site3= null;
if(a3==1){site3=" + ";}
else if(a3==2){site3=" - ";}
else if(a3==3){site3=" × ";}
else if(a3==4){site3=" ÷ ";}
int struct=(int)(Math.random()*11+1);
if(struct==1)
{if((site1==" + "||site1==" - ")&&(site2==" + "||site2==" - ")&&(site3==" × "||site3==" ÷ "))
{result=struct1_1(a.result,b.result,c.result,d.result,site1,site2,site3);}
else if((site1==" + "||site1==" - ")&&(site2==" × "||site2==" ÷ ")&&(site3==" × "||site3==" ÷ "))
{result=struct1_2(a.result,b.result,c.result,d.result,site1,site2,site3);}
else if((site1==" + "||site1==" - ")&&(site2==" × "||site2==" ÷ ")&&(site3==" + "||site3==" - "))
{result=struct1_3(a.result,b.result,c.result,d.result,site1,site2,site3);}
else if((site1==" × "||site1==" ÷ ")&&(site2==" + "||site2==" - ")&&(site3==" × "||site3==" ÷ "))
{result=struct1_4(a.result,b.result,c.result,d.result,site1,site2,site3);}
else
{result=struct1_5(a.result,b.result,c.result,d.result,site1,site2,site3);}}
else if(struct==2)
{if((site1==" + "||site1==" - ")&&(site2==" + "||site2==" - ")&&(site3==" × "||site3==" ÷ "))
{result=struct2_2(a.result,b.result,c.result,d.result,site1,site2,site3);}
else
{result=struct2_1(a.result,b.result,c.result,d.result,site1,site2,site3);}}
else if(struct==3){result=struct3(a.result,b.result,c.result,d.result,site1,site2,site3);}
else if(struct==4)
{if((site2==" × "||site2==" ÷ ")&&(site1==" + "||site1==" - ")&&(site3==" + "||site3==" - "))
{result=struct4_2(a.result,b.result,c.result,d.result,site1,site2,site3);}
else
{result=struct4_1(a.result,b.result,c.result,d.result,site1,site2,site3);}}
else if(struct==5)
{if((site1==" + "||site1==" - ")&&(site2==" × "||site2==" ÷ ")&&(site3==" + "||site3==" - "))
{result=struct5_2(a.result,b.result,c.result,d.result,site1,site2,site3);}
else
{result=struct5_1(a.result,b.result,c.result,d.result,site1,site2,site3);}}
else if(struct==6)
{if((site1==" + "||site1==" - ")&&(site2==" + "||site2==" - ")&&(site3==" × "||site3==" ÷ "))
{result=struct6_2(a.result,b.result,c.result,d.result,site1,site2,site3);}
else
{result=struct6_1(a.result,b.result,c.result,d.result,site1,site2,site3);}}
else if(struct==7){result=struct7(a.result,b.result,c.result,d.result,site1,site2,site3);}
else if(struct==8)
{if((site1==" + "||site1==" - ")&&(site2==" × "||site2==" ÷ "))
{result=struct8_2(a.result,b.result,c.result,d.result,site1,site2,site3);}
else
{result=struct8_1(a.result,b.result,c.result,d.result,site1,site2,site3);}}
else if(struct==9){result=struct9(a.result,b.result,c.result,d.result,site1,site2,site3);}
else if(struct==10){result=struct10(a.result,b.result,c.result,d.result,site1,site2,site3);}
else if(struct==11){result=struct11(a.result,b.result,c.result,d.result,site1,site2,site3);}
}
//a+b+c+d
//(a+b)+c+d
//a+(b+c)+d
//a+b+(c+d)
//(a+b+c)+d
//a+(b+c+d)
//(a+b)+(c+d)
//a+b+c
//(a+b)+c
//a+(b+c)
//a+b
public String[] struct1_1(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(c[1],c[2],c[3],d[1],d[2],d[3],site3);
operator_structure pro2=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],pro1.result[0],pro1.result[1],pro1.result[2],site2);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+c[0]+site3+d[0]+"=",re};
return arr;
}//a+b+c*d
public String[] struct1_2(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(b[1],b[2],b[3],c[1],c[2],c[3],site2);
operator_structure pro2=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],d[1],d[2],d[3],site3);
operator_structure pro3=new operator_structure(a[1],a[2],a[3],pro2.result[0],pro2.result[1],pro2.result[2],site1);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+c[0]+site3+d[0]+"=",re};
return arr;
}//a+b*c*d
public String[] struct1_3(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(b[1],b[2],b[3],c[1],c[2],c[3],site2);
operator_structure pro2=new operator_structure(a[1],a[2],a[3],pro1.result[0],pro1.result[1],pro1.result[2],site1);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],d[1],d[2],d[3],site3);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+c[0]+site3+d[0]+"=",re};
return arr;
}//a+b*c+d
public String[] struct1_4(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(c[1],c[2],c[3],d[1],d[2],d[3],site3);
operator_structure pro3=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],pro2.result[0],pro2.result[1],pro2.result[2],site2);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+c[0]+site3+d[0]+"=",re};
return arr;
}//a*b+c*d
public String[] struct1_5(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],c[1],c[2],c[3],site2);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],d[1],d[2],d[3],site2);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+c[0]+site3+d[0]+"=",re};
return arr;
}//a+b+c+d
public String[] struct2_1(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],c[1],c[2],c[3],site2);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],d[1],d[2],d[3],site3);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {"("+a[0]+site1+b[0]+")"+site2+c[0]+site3+d[0]+"=",re};
return arr;
}//(a+b)+c+d
public String[] struct2_2(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(c[1],c[2],c[3],d[1],d[2],d[3],site3);
operator_structure pro3=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],pro2.result[0],pro2.result[1],pro2.result[2],site2);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {"("+a[0]+site1+b[0]+")"+site2+c[0]+site3+d[0]+"=",re};
return arr;
}//(a+b)+c*d
public String[] struct3(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(b[1],b[2],b[3],c[1],c[2],c[3],site2);
operator_structure pro2=new operator_structure(a[1],a[2],a[3],pro1.result[0],pro1.result[1],pro1.result[2],site1);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],d[1],d[2],d[3],site3);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+"("+b[0]+site2+c[0]+")"+site3+d[0]+"=",re};
return arr;
}//a+(b+c)+d
public String[] struct4_1(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(c[1],c[2],c[3],d[1],d[2],d[3],site3);
operator_structure pro2=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],pro1.result[0],pro1.result[1],pro1.result[2],site2);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+"("+c[0]+site3+d[0]+")"+"=",re};
return arr;
}//a+b+(c+d)
public String[] struct4_2(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(c[1],c[2],c[3],d[1],d[2],d[3],site3);
operator_structure pro2=new operator_structure(b[1],b[2],b[3],pro1.result[0],pro1.result[1],pro1.result[2],site2);
operator_structure pro3=new operator_structure(a[1],a[2],a[3],pro2.result[0],pro2.result[1],pro2.result[2],site1);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+"("+c[0]+site3+d[0]+")"+"=",re};
return arr;
}//a+b*(c+d)
public String[] struct5_1(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],c[1],c[2],c[3],site2);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],d[1],d[2],d[3],site3);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {"("+a[0]+site1+b[0]+site2+c[0]+")"+site3+d[0]+"=",re};
return arr;
}//(a+b+c)+d
public String[] struct5_2(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(b[1],b[2],b[3],c[1],c[2],c[3],site2);
operator_structure pro2=new operator_structure(a[1],a[2],a[3],pro1.result[0],pro1.result[1],pro1.result[2],site1);
operator_structure pro3=new operator_structure(pro2.result[0],pro2.result[1],pro2.result[2],d[1],d[2],d[3],site3);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {"("+a[0]+site1+b[0]+site2+c[0]+")"+site3+d[0]+"=",re};
return arr;
}//(a+b*c)+d
public String[] struct6_1(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(b[1],b[2],b[3],c[1],c[2],c[3],site2);
operator_structure pro2=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],d[1],d[2],d[3],site3);
operator_structure pro3=new operator_structure(a[1],a[2],a[3],pro2.result[0],pro2.result[1],pro2.result[2],site1);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+"("+b[0]+site2+c[0]+site3+d[0]+")"+"=",re};
return arr;
}//a+(b+c+d)
public String[] struct6_2(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(c[1],c[2],c[3],d[1],d[2],d[3],site3);
operator_structure pro2=new operator_structure(b[1],b[2],b[3],pro1.result[0],pro1.result[1],pro1.result[2],site2);
operator_structure pro3=new operator_structure(a[1],a[2],a[3],pro2.result[0],pro2.result[1],pro2.result[2],site1);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {a[0]+site1+"("+b[0]+site2+c[0]+site3+d[0]+")"+"=",re};
return arr;
}//a+(b+c*d)
public String[] struct7(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(c[1],c[2],c[3],d[1],d[2],d[3],site3);
operator_structure pro3=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],pro2.result[0],pro2.result[1],pro2.result[2],site2);
String re="";
if(pro3.result[2]!="") re=pro3.result[2];
else re=turn_two(pro3.result[0],pro3.result[1]);
String[] arr = {"("+a[0]+site1+b[0]+")"+site2+"("+c[0]+site3+d[0]+")"+"=",re};
return arr;
}//(a+b)+(c+d)
public String[] struct8_1(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],c[1],c[2],c[3],site2);
String re="";
if(pro2.result[2]!="") re=pro2.result[2];
else re=turn_two(pro2.result[0],pro2.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+c[0]+"=",re};
return arr;
}//a+b+c
public String[] struct8_2(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(b[1],b[2],b[3],c[1],c[2],c[3],site2);
operator_structure pro2=new operator_structure(a[1],a[2],a[3],pro1.result[0],pro1.result[1],pro1.result[2],site1);
String re="";
if(pro2.result[2]!="") re=pro2.result[2];
else re=turn_two(pro2.result[0],pro2.result[1]);
String[] arr = {a[0]+site1+b[0]+site2+c[0]+"=",re};
return arr;
}//a+b*c
public String[] struct9(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
operator_structure pro2=new operator_structure(pro1.result[0],pro1.result[1],pro1.result[2],c[1],c[2],c[3],site2);
String re="";
if(pro2.result[2]!="") re=pro2.result[2];
else re=turn_two(pro2.result[0],pro2.result[1]);
String[] arr = {"("+a[0]+site1+b[0]+")"+site2+c[0]+"=",re};
return arr;
}//(a+b)+c
public String[] struct10(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(b[1],b[2],b[3],c[1],c[2],c[3],site2);
operator_structure pro2=new operator_structure(a[1],a[2],a[3],pro1.result[0],pro1.result[1],pro1.result[2],site1);
String re="";
if(pro2.result[2]!="") re=pro2.result[2];
else re=turn_two(pro2.result[0],pro2.result[1]);
String[] arr = {a[0]+site1+"("+b[0]+site2+c[0]+")"+"=",re};
return arr;
}//a+(b+c)
public String[] struct11(String[] a,String[] b,String[]c,String[] d,String site1,String site2,String site3) {
operator_structure pro1=new operator_structure(a[1],a[2],a[3],b[1],b[2],b[3],site1);
String re="";
if(pro1.result[2]!="") re=pro1.result[2];
else re=turn_two(pro1.result[0],pro1.result[1]);
String[] arr = {a[0]+site1+b[0]+"=",re};
return arr;
}//a+b
//保证结果可以用真分数表示
public String turn_two(String up,String down) {
String arr;
int up1=Integer.parseInt(up);
int down1=Integer.parseInt(down);
if(up1<down1)
{arr=up+"/"+down;}
else
{int a=up1/down1;int b=up1%down1;
String a1= String.valueOf(a);
String b1= String.valueOf(b);
arr=a1+"'"+b1+"/"+down;
}
return arr;
}
}
- MAIN类,通过输入args的值来控制生成题目个数,题目数值范围,输出答案和题目的文件名,文件的输出通过java.io来实现,代码如下:
import java.util.ArrayList;
import java.io.File;
import java.io.FileWriter;
public class MAIN {
@SuppressWarnings({ "unused" })
public static void main(String[] args) {
try {
System.out.println("开始运行!");
int len=args.length;
int num=Integer.parseInt(args[1]);//生成题目个数
int range=Integer.parseInt(args[3]);//题目中数值的范围
//按照题目要求,输入八个数据,不满足要求退出程序
//-n 10000 -r 10 -e "Exercises.txt" -a "Answers.txt"
if(len==8&&num>0&&range>0&&args[0].equals("-n")&&args[2].equals("-r")&&args[4].equals("-e")&&args[6].equals("-a")) {
String[] topic = new String[num];
String[] answer =new String[num];
topic_structure t_a[]=new topic_structure[num];
for (int i = 1; i < num+1; i++) {
t_a[i-1]=new topic_structure(range);
topic[i-1]=t_a[i-1].result[0];
answer[i-1]=t_a[i-1].result[1];
System.out.println("第"+i+"道题题目和答案生成!");
}
try {
File writeName = new File(args[5]); // 相对路径
if(!writeName.exists()) {
writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
}
FileWriter fw;
fw=new FileWriter(writeName);
for (int i = 1; i < topic.length+1; i++) {
fw.write(i+". "+topic[i-1]+"\n");
//此处放题目的生成
}
fw.close();
} catch (Exception e) {
System.out.println("输入文件格式不对!");
}
try {
File writeName = new File(args[7]); // 相对路径
if(!writeName.exists()) {
writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
}
FileWriter fw;
fw=new FileWriter(writeName);
for (int i = 1; i < answer.length+1; i++) {
fw.write(i+". "+answer[i-1]+"\n");
//此处放答案的生成
}
fw.close();
} catch (Exception e) {
System.out.println("输入文件格式不对!");
}
try {
File writeName = new File("Grade.txt"); // 相对路径
if(!writeName.exists()) {
writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
}
ArrayList<String> list3=new ArrayList<String>();
ArrayList<String> list4=new ArrayList<String>();
ArrayList<String> list5=new ArrayList<String>();
int sum1 = 0,sum2=0;
for (int k = 1; k < num+1; k++) {
if(true)
{sum1+=1;list4.add(String.valueOf(k));}
else
{sum2+=1;list5.add(String.valueOf(k));}
//此处放统计答案是否正确的生成
}
list3.add("Correct: "+sum1+list4.toString());
list3.add("Wrong: "+sum2+list5.toString());
FileWriter fw;
fw=new FileWriter(writeName);
for (int i = 1; i < list3.size()+1; i++) {
fw.write(i+". "+list3.get(i-1)+"\n");
}
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}else {
System.out.println("您输入的参数不合法!!!");
System.exit(0);
}
System.out.println("运行成功!");
System.out.println("题目存在于jar所在文件夹的Exercises.txt中,答案存在于jar所在文件夹的Answers.txt中,判断答案对错存在于jar所在文件夹的Grade.txt中!");
} catch (java.lang.ArrayIndexOutOfBoundsException e) {
System.out.println("这样操作是不行的,你还要输入例如( -n 20 -r 10 -e \"Exercises.txt\" -a \"Answers.txt\")括号内的内容再按ENTER!");
}
}
}
5 测试运行
-
要求1、2:使用 -n 参数控制生成题目的个数,使用 -r 参数控制题目中数值
命令行
生成的文件在jar所在目录下的exercises.txt和answers.txt文件中
生成文件在
-
要求3:生成的题目中计算过程不能产生负数,代码如下
单元测试
单元测试结果
-
要求4:生成的题目中如果存在形如e1÷ e2的子表达式,那么*其结果应是真分数*
代码中我们都是用真分数进行计算的
-
要求5:每道题目中出现的运算符个数不超过3个
式子的构造如下所示,所以不用担心产生三个运算符以上
-
要求6:不会产生重复的表达式
-
要求7:生成的题目存入执行程序的当前目录下的Exercises.txt文件,在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件
将exercises.txt和answers.txt存储在src目录下,格式满足要求
-
要求8:程序应能支持一万道题目的生成,满足。
-
要求9:程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计
6 PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时 | 实际耗时(分钟) |
---|---|---|---|
·Planning | · 计划 | 50 | 45 |
· Estimate | · 估计这个任务需要多少时间 | 50 | 45 |
·Development | 开发 | 350 | 820 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | 95 |
· Design Spec | · 生成设计文档 | 30 | 55 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
· Design | · 具体设计 | 50 | 65 |
· Coding | · 具体编码 | 150 | 505 |
· Code Review | · 代码复审 | 20 | 25 |
· Test | · 测试(自我测试,修改代码,提交修改) | 45 | 60 |
· Reporting | · 报告 | 90 | 100 |
· Test Repor | · 测试报告 | 20 | 25 |
· Size Measurement | · 计算工作量 | 15 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 55 | 60 |
· 合计 | 500 | 1000 |
7 单元测试
本次单元测试设置了十个单元测试用例,具体设置如下:
- test1:随机产生10以内的数
- test2:随机产生100以内的数
- test3:随机产生1000以内的数
- test4:随机产生10000以内的数
- test5:测试1/5-2/5的结果
- test6:测试1-6/7的结果
- test7:测试1-7的结果
- test8:随机产生范围在10以内的式子
- test9:随机产生范围在100以内的式子
- test10:随机产生范围在1000以内的式子
test1-test4:
test5-test7:
test8-test10:
8 项目小结
- 成员1:陈嘉喜小结
通过这次实验,我学会了怎么重构基本的结构,也懂得了如何在命令行上运行jar文件(在需要传入参数args的情况下),也更加深入地认识到性能分析软件的好处,更重要的是,体会到团队合作的快乐和如何去解决大家存在的误解。 - 成员2:谢晓岚小结
在这次实验中,我认识到class模块划分的作用,即可修改和方便查询,因为每一模块都是单独实现某个特定的功能,也学会了jar包在不同路径下运行产生的文件所在位置的不同,共同合作,使我认识到分工的大致流程,在此工程还可以学到自己不会的东西。