• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
X_yyds
博客园    首页    新随笔    联系   管理    订阅  订阅

结对作业

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包在不同路径下运行产生的文件所在位置的不同,共同合作,使我认识到分工的大致流程,在此工程还可以学到自己不会的东西。
posted @ 2021-10-26 00:17  X_yyds  阅读(49)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3