软件工程结对作业02

要求:
1、 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 − e2的子表达式,那么e1 ≥ e2。
2、生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。
3、每道题目中出现的运算符个数不超过3个,括号不限。
4、程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。
例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。
3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。
5、把程序变成一个网页程序, 用户通过设定参数,就可以得到各种题目,并可实现在线答题并评判。

设计思路:
一:生成类:分数类、整数类、符号类。
   有函数获取值和化简分数。整数里面存在分子和分母,分子为整数值,分母默认为1
二:主类:化简函数,计算函数,判断函数,主函数(流程函数)
        判断函数用于完成条件1和2
三:主函数:
1、定制条件:输入需要的题数。根据题数,以for循环来限制循环次数。(进入for循环)
2、确定数字个数:以随机数的值(2~4的值)来确定算式的数字个数。
3、引用之前的类:分数类、整数类、符号类。
                 分数类、整数类、符号类来创建一维数组
                 创建四个二维数组,第一个用来储存分数和整数的分子[][0]和分母[][1]
                                   第二个用来储存分数和整数的分子[][0]和分母[][1](字符串型)
                                   第三个用来储存符号的随机数判断整型
                                   第四个用来储存符号(字符串型)
4、进入无限循环:
                1、进入有限循环(循环次数为 数字个数)
                   随机分配整数或分数,都引用函数,创建数值,并将其分子和分母都列入第一个和第二个二维数组
                   随机数生成符号,将其列入第三个和第四个二维数组
                2、算式运算:根据 数字个数 的不同,进入不同条件的运算
                             根据 符号位置(数组位置) 的不同,进入不同条件的运算,符号前后两数进行运算,生成分子分母,引用判定函数进行判定,未达成要求,就停止此次循环,进行新的循环
                             化简,生成分子和分母
                             (两个数字:直接运算)
                             (三个数字:1、第二个符号为乘除,先算第二个数字和第三个数字
                                         2、第二个符号不为乘除,从第一个数字算起)
                             (四个数字:1、第一个符号为乘除,①、第三个符号为乘除,但第二个符号不为乘除,先算第一个数字和第二个数字,第三个数字和第四个数字,最后两者运算
                                                              ②、第三个符号不为乘除,从第一个数字算起
                                         2、第一个符号不为乘除,①、第二个符号为乘除,但第三个符号不为乘除,先算第二个数字和第三个数字,再从第一个数字算起
                                                                ②、第二个符号为乘除,且第三个符号为乘除,先算第二个数字和第三个数字,再算第四个数字,最后第一个数字
                                                                ③、第二个符号不为乘除,但第三个符号为乘除,先算第三个数字和第四个数字,再从第一个数字算起
                                                                ④、第二个符号不为乘除,且第三个符号也不为乘除,从第一个数字算起)
   退出无限循环
                3、生成算式(字符串的形式),且将生成的算式的运算结果(字符串型),代入数组中
                4、判定重复:for循环,此次运算结果与过去所有运算结果比较,若相同,则重复进行一次当前循环,重新运算。
                5、用户输入值,进行比较,得出正确与否的答案


import
java.util.Scanner; class Fraction//分数 { public int numerator;//分子 public int denominator;//分母 public void creatFraction() { //--生成值并化简-- boolean bool=false; while(bool==false) { int up=(int)(1+Math.random()*10); int down=(int)(1+Math.random()*10); if(down<=up) { continue; } for(int i=2;;i++) { if(up%i==0&&down%i==0) { up/=i; down/=i; i-=1; } if(i>up||i>down) { break; } } if(down==1) { continue; } else { numerator=up; denominator=down; bool=true; } } //--生成值并化简-- } public String strFraction() { String ud=new String(); ud="("+numerator+"/"+denominator+")"; return ud; } public int getNumerator() { return numerator; } public int getDenominator() { return denominator; } } class Integer//整数 { public int integer; public int downinteger=1; public void creatInteger() { integer=(int)(1+Math.random()*100); } public String strInteger() { String g; g=integer+""; return g; } public int getInteger() { int a=integer; return a; } public int getDownInteger() { int b=downinteger; return b; } } class Operator//符号 { public String operator; public int inoperator; public void creatOperator() { inoperator=(int)(1+Math.random()*4); switch(inoperator) { case 1:{operator="+";break;} case 2:{operator="-";break;} case 3:{operator="*";break;} case 4:{operator="/";break;} default:{System.out.println("运行出错,结束");break;} } } public String getOperator() { String g=operator; return g; } public int getInOperator() { int g=inoperator; return g; } } public class Operations4 { //-----------化简区---------------- static int upSimple(int sup,int sdown)//化简分子 { boolean bool=false; while(bool==false) { for(int i=2;;i++) { if(sup%i==0&&sdown%i==0) { sup/=i; sdown/=i; i-=1; } if(i>sup||i>sdown) { break; } } bool=true; } return sup; } static int downSimple(int sup,int sdown)//化简分母 { boolean bool=false; while(bool==false) { for(int i=2;;i++) { if(sup%i==0&&sdown%i==0) { sup/=i; sdown/=i; i-=1; } if(i>sup||i>sdown) { break; } } bool=true; } return sdown; } //--------计算区--------------- static int getUp(int up1,int down1,int up2,int down2,int fu)//获取计算后的分子 { int up=1,down=1; switch(fu) { case 1: { up=up1*down2+up2*down1; break; } case 2: { up=up1*down2-up2*down1; break; } case 3: { up=up1*up2; break; } case 4: { up=up1*down2; break; } default: { System.out.println("运行错误,结束"); break; } } return up; } static int getDown(int up1,int down1,int up2,int down2,int fu)//获取计算后的分母 { int up=1,down=1; switch(fu) { case 1: { down=down1*down2; break; } case 2: { down=down1*down2; break; } case 3: { down=down1*down2; break; } case 4: { down=down1*up2; break; } default: { System.out.println("运行错误,结束"); break; } } return down; } //------判断------ static int nCont(int nup,int ndown,int nfu) { int n=1;//达到要求 if((nfu==2&&nup<ndown)||(nfu==4&&nup>ndown)) { n=2;//未达要求 } return n; } //--------运算区--------------- public static void main(String args[]) { System.out.print("请输入需要的题数:"); Scanner shuzi=new Scanner(System.in); int SIZE=shuzi.nextInt(); String Ends[]=new String[SIZE]; for(int j=0;j<SIZE;j++) { String strOP=null; //-----------确定数字--------- int number=(int)(2+Math.random()*3);//随机数字个数:2~4个 //舍弃数组[0]的位置,以下都从数组[1]开始 Integer zheng[]=new Integer[number+1]; Fraction fen[]=new Fraction[number+1]; Operator fuhao[]=new Operator[number]; int Array[][]=new int[number+1][2]; String strArray[]=new String[number+1]; int inBrray[]=new int[number]; String strBrray[]=new String[number]; int aup=1,adown=1; boolean bl=false; while(bl==false) { for(int i=1;i<=number;i++)//确定数字在数组中 { int panduan=(int)(1+Math.random()*2);//随机分配整数或分数。1--整数,2--分数 //数字划入Array数组 if(panduan==1) { zheng[i]=new Integer(); zheng[i].creatInteger(); Array[i][0]=zheng[i].getInteger(); Array[i][1]=zheng[i].getDownInteger(); strArray[i]=zheng[i].strInteger(); } if(panduan==2) { fen[i]=new Fraction(); fen[i].creatFraction(); Array[i][0]=fen[i].getNumerator(); Array[i][1]=fen[i].getDenominator(); strArray[i]=fen[i].strFraction(); } //符号划入Barry数组 if(i==number){break;} fuhao[i]=new Operator(); fuhao[i].creatOperator(); inBrray[i]=fuhao[i].getInOperator(); strBrray[i]=fuhao[i].getOperator(); } //---------进行运算---------- if(number==2)//两个数字 { int a1,a2; a1=getUp(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); a2=getDown(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); int nC=nCont(a1,a2,inBrray[1]); if(nC==2) {continue;} aup=upSimple(a1,a2); adown=downSimple(a1,a2); } if(number==3) { if(inBrray[1]<=2&&inBrray[2]>2) { int b1,b2; b1=getUp(Array[2][0],Array[2][1],Array[3][0],Array[3][1],inBrray[2]); b2=getDown(Array[2][0],Array[2][1],Array[3][0],Array[3][1],inBrray[2]); int nC2=nCont(b1,b2,inBrray[2]); if(nC2==2) {continue;} //--------- int a1,a2; a1=getUp(Array[1][0],Array[1][1],b1,b2,inBrray[1]); a2=getDown(Array[1][0],Array[1][1],b1,b2,inBrray[1]); int nC1=nCont(a1,a2,inBrray[1]); if(nC1==2) {continue;} //--------- aup=upSimple(a1,a2); adown=downSimple(a1,a2); } else { int a1,a2; a1=getUp(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); a2=getDown(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); int nC1=nCont(a1,a2,inBrray[1]); if(nC1==2) {continue;} //--------- int b1,b2; b1=getUp(a1,a2,Array[3][0],Array[3][1],inBrray[2]); b2=getDown(a1,a2,Array[3][0],Array[3][1],inBrray[2]); int nC2=nCont(a1,a2,inBrray[2]); if(nC2==2) {continue;} //---------- aup=upSimple(b1,b2); adown=downSimple(b1,b2); } } if(number==4) { if(inBrray[1]>2) { int a1,a2; a1=getUp(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); a2=getDown(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); int nC1=nCont(a1,a2,inBrray[1]); if(nC1==2) {continue;} if(inBrray[2]<=2&&inBrray[3]>2) { int c1,c2; c1=getUp(Array[3][0],Array[3][1],Array[4][0],Array[4][1],inBrray[3]); c2=getDown(Array[3][0],Array[3][1],Array[4][0],Array[4][1],inBrray[3]); int nC3=nCont(c1,c2,inBrray[3]); if(nC3==2) {continue;} //--------- int b1,b2; b1=getUp(a1,a2,c1,c2,inBrray[2]); b2=getDown(a1,a2,c1,c2,inBrray[2]); int nC2=nCont(b1,b2,inBrray[1]); if(nC2==2) {continue;} //--------- aup=upSimple(b1,b2); adown=downSimple(b1,b2); } else { int b1,b2; b1=getUp(a1,a2,Array[3][0],Array[3][1],inBrray[2]); b2=getDown(a1,a2,Array[3][0],Array[3][1],inBrray[2]); int nC2=nCont(b1,b2,inBrray[2]); if(nC2==2) {continue;} //--------- int c1,c2; c1=getUp(b1,b2,Array[4][0],Array[4][1],inBrray[3]); c2=getDown(b1,b2,Array[4][0],Array[4][1],inBrray[3]); int nC3=nCont(c1,c2,inBrray[3]); if(nC3==2) {continue;} //---------- aup=upSimple(c1,c2); adown=downSimple(c1,c2); } } else { if(inBrray[2]>2&&inBrray[3]<=2) { int b1,b2; b1=getUp(Array[2][0],Array[2][1],Array[3][0],Array[3][1],inBrray[2]); b2=getDown(Array[2][0],Array[2][1],Array[3][0],Array[3][1],inBrray[2]); int nC2=nCont(b1,b2,inBrray[2]); if(nC2==2) {continue;} //--------- int a1,a2; a1=getUp(Array[1][0],Array[1][1],b1,b2,inBrray[1]); a2=getDown(Array[1][0],Array[1][1],b1,b2,inBrray[1]); int nC1=nCont(a1,a2,inBrray[1]); if(nC1==2) {continue;} //---------- int c1,c2; c1=getUp(a1,a2,Array[4][0],Array[4][1],inBrray[3]); c2=getDown(a1,a2,Array[4][0],Array[4][1],inBrray[3]); int nC3=nCont(c1,c2,inBrray[3]); if(nC3==2) {continue;} //---------- aup=upSimple(c1,c2); adown=downSimple(c1,c2); } else if(inBrray[2]>2&&inBrray[3]>2) { int b1,b2; b1=getUp(Array[2][0],Array[2][1],Array[3][0],Array[3][1],inBrray[2]); b2=getDown(Array[2][0],Array[2][1],Array[3][0],Array[3][1],inBrray[2]); int nC2=nCont(b1,b2,inBrray[2]); if(nC2==2) {continue;} //--------- int c1,c2; c1=getUp(b1,b2,Array[4][0],Array[4][1],inBrray[3]); c2=getDown(b1,b2,Array[4][0],Array[4][1],inBrray[3]); int nC3=nCont(c1,c2,inBrray[3]); if(nC3==2) {continue;} //---------- int a1,a2; a1=getUp(Array[1][0],Array[1][1],c1,c2,inBrray[1]); a2=getDown(Array[1][0],Array[1][1],c1,c2,inBrray[1]); int nC1=nCont(a1,a2,inBrray[1]); if(nC1==2) {continue;} //---------- aup=upSimple(a1,a2); adown=downSimple(a1,a2); } else if(inBrray[2]<=2&&inBrray[3]>2) { int c1,c2; c1=getUp(Array[3][0],Array[3][1],Array[4][0],Array[4][1],inBrray[3]); c2=getDown(Array[3][0],Array[3][1],Array[4][0],Array[4][1],inBrray[3]); int nC3=nCont(c1,c2,inBrray[3]); if(nC3==2) {continue;} //--------- int a1,a2; a1=getUp(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); a2=getDown(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); int nC1=nCont(a1,a2,inBrray[1]); if(nC1==2) {continue;} //---------- int b1,b2; b1=getUp(a1,a2,c1,c2,inBrray[2]); b2=getDown(a1,a2,c1,c2,inBrray[2]); int nC2=nCont(b1,b2,inBrray[2]); if(nC2==2) {continue;} //---------- aup=upSimple(b1,b2); adown=downSimple(b1,b2); } else { int a1,a2; a1=getUp(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); a2=getDown(Array[1][0],Array[1][1],Array[2][0],Array[2][1],inBrray[1]); int nC1=nCont(a1,a2,inBrray[1]); if(nC1==2) {continue;} //--------- int b1,b2; b1=getUp(a1,a2,Array[3][0],Array[3][1],inBrray[2]); b2=getDown(a1,a2,Array[3][0],Array[3][1],inBrray[2]); int nC2=nCont(b1,b2,inBrray[2]); if(nC2==2) {continue;} //---------- int c1,c2; c1=getUp(b1,b2,Array[4][0],Array[4][1],inBrray[3]); c2=getDown(b1,b2,Array[4][0],Array[4][1],inBrray[3]); int nC3=nCont(c1,c2,inBrray[3]); if(nC3==2) {continue;} //---------- aup=upSimple(c1,c2); adown=downSimple(c1,c2); } } } if(adown==1) { strOP=aup+""; } else { strOP=aup+"/"+adown; } bl=true; } String back=""; for(int i=1;i<=number;i++) { back+=strArray[i]; if(i==number){break;} back+=strBrray[i]; } System.out.print(back+"="); String shuchu=strOP; Ends[j]=shuchu; //-------判定重复-------- int chuqu=1; for(int q=0;q<j;q++) { if(Ends[j]==Ends[q]) { chuqu=2; } } if(chuqu==2) { j--; continue; } //-------- Scanner sca=new Scanner(System.in); String shuru=sca.next(); if(shuchu.equals(shuru)) { System.out.println("正确"); } else { System.out.println("错误,正确答案为:"+shuchu); } } } }

项目计划日志

计划: 花费10个小时完成任务

时间记录日志

日期 开始时间 结束时间 总计(分) 活动 备注
16-4-4

8:00

9:50 100 上课  
16-4-5          
16-4-6 13:00 16:00 180

编写程序

 
16-4-7 17:00 19:00 120 编写程序(四则运算4)  
16-4-8          
16-4-9 14:10 17:30 200

编写程序(四则运算4)

发表博客

 

缺陷记录日志

日期 错误问题
4-7 数组没有取正确,一维数组没有解决问题

总结:这次完成了基本功能条件,且远优于之前的程序(将各个部分模块化),但我没有弄到网上去,有我能力不足的原因,以后再来修改

原文地址:https://www.cnblogs.com/maplely/p/5372699.html