Java第七周学习——结对编程
四则运算
自动生成小学四则运算题目(加、减、乘、除)(完成)
支持整数以及多运算符(优先级未能完善)
支持真分数(未能实现)
统计正确率(完成)
设计思路
假如说随机生产一个随机的四则运算,那么如果说其中数字的个数为n个,那么其运算符为n-1个,其中不考虑括号(未完善)以及真分数,所以不妨假设一个符号的个数控制在100以内(所有随机题的+,-,*,/相加),那么我可以定义一个整数型的数组b[100],其中每个元素都是一个随机数,再以其元素余4+1,控制每个元素的个数都在1~4,1代表+,2代表-,3代表/,4代表*,同理,定义一个数组大小为100的整数数组,里面每个元素的大小同样为一个随机数,为了方便起见,在这里设计每个数的大小不超过10。
并定义一个数组来表示每个表达式的数字个数,定义为t[100],每个元素的大小同样为随机数。
对于衔接问题,第一个数和第二个数,可以根据b[0]的大小写出 a[0] b[0] a[1]的大小,定为s.
随后根据相应的t数组的大小来安排后面的数字,比较难于描述,所以单列出其代码
for(i=3;i<=a[i];i++){
if(b[i-2]==1)
{System.out.printf(" + %d",t[i-1]);
s=s+t[i-1];}
if(b[i-2]==2)
{System.out.printf(" - %d",t[i-1]);
s=s-t[i-1];}
if(b[i-2]==3)
{System.out.printf(" * %d",t[i-1]);
s=s*t[i-1];}
if(b[i-2]==4)
{System.out.printf(" / %d",t[i-1]);
s=s/t[i-1];}
}
因为i是从3开始循环的,所以里面比较的是b[i-2],这个代码会导致优先级有问题,以后改善。
代码
import java.util.*;
public class size {
public static void main(String args[]){
Scanner reader=new Scanner(System.in);
int a[]=new int[100];
int b[]=new int[100];
int t[]=new int[100];
int i=0,j=0;
int n=0;
int s=0,c=0;
float d=0;
System.out.printf("请问需要生成多少个题目:");
n=reader.nextInt();
for(j=0;j<n;j++){
Random rand=new Random();
for(i=0;i<100;i++)
{a[i]=rand.nextInt(6)+1;
b[i]=rand.nextInt(4)+1;
t[i]=rand.nextInt(10)+1;
}
if(b[0]==1)
{System.out.printf("%d + %d",t[0],t[1]);
s=t[0]+t[1];}
if(b[0]==2)
{System.out.printf("%d - %d",t[0],t[1]);
s=t[0]-t[1];}
if(b[0]==3)
{System.out.printf("%d * %d",t[0],t[1]);
s=t[0]*t[1];}
if(b[0]==4)
{System.out.printf("%d / %d",t[0],t[1]);
s=t[0]/t[1];}
for(i=3;i<=a[i];i++){
if(b[i-2]==1)
{System.out.printf(" + %d",t[i-1]);
s=s+t[i-1];}
if(b[i-2]==2)
{System.out.printf(" - %d",t[i-1]);
s=s-t[i-1];}
if(b[i-2]==3)
{System.out.printf(" * %d",t[i-1]);
s=s*t[i-1];}
if(b[i-2]==4)
{System.out.printf(" / %d",t[i-1]);
s=s/t[i-1];}
}
System.out.printf(" =");
c=reader.nextInt();
if(s==c)
{d=d+1;
System.out.printf("正确");}
if(s!=c)
System.out.printf("错误,正确答案为:%d",s);
System.out.printf("
");
}
System.out.printf("正确率为%f",d/n);}
}
UML类图
目前代码没有完善,而且代码只有一个主类,没有子类。
功能截图
其中出现的比较大的问题比如 4/6*8*2,因为数字没有定义为整数型,所以4/6直接为0了,不支持分数,不支持浮点型。还有2*10*4-7/7,根据优先级应为80-1=79,但代码不够完善,直接是80-7=73除7答案为10,其他的地方还好。
结队感受
这个代码从构想到实现并没有花太多时间,虽然其中具有很大的局限性,但还算是有效率的“完成”了,在构想最初我们最先想到的就是定义各种随机,其中设想了一个char a[4]={'+','-','*','/'}的随机取符,但后面行不通,原因在于这只是一个符号,系统没有当为运算符去看待,怎么替换就成了一个问题,后来我们一起设想了关于老师推荐的中缀以及后缀的问题,发现理解的不够好,最后我们又回到了一开始的设想,用数字代替,循环加入后面的数字,不过却造成了优先级的问题,所做时间有限,未能完成,或许,下次可以试试判断运算符为乘法和除法的位置,然后将他们向两边分散,直到碰见加法或者减法停止,先将表达式中所有的乘除算出来,再进行加法和除法(依然没有括号,还没想好怎么生成),下次做的更好,一起做思路会快。
结对学习照