四则运算2
1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数:
是否有乘除法;
是否有括号(最多可以支持十个数参与计算);
数值范围;
加减有无负数;
除法有无余数!
小组成员:王艺霖、李杨
设计思想:
分别用不同的函数来表示不同的功能,最后在主函数中调用所需要的数据
1、用SIZE来确定数目打印题数
2、用SecondOperation来判定是否有乘除法
3、用Negative判定加减有无负数
4、用Remainder判定除法有无余数
5、再用一个生成函数通过传递调用之前的函数所传递的数值来实现算式的随机产生
6、通过一个数组来储存算式再用for循环来排除重复的(若重复,则 i-1,退出此循环,重新再大循环一次)
源程序代码:
import java.util.*; public class Operation2 { public static int SIZE(int size)//定制数量 { int q; q=size; return q; } public static int SecondOperation(String p1)//是否有乘除法 { int q = 4; if(p1.equals("Y")) { q=4; } if(p1.equals("N")) { q=2; } return q; } public static String Negative(String p2)//加减有无负数 { String q; q=p2; return q; } public static String Remainder(String p3)//除法有无余数 { String q; q=p3; return q; } public static int Max(int max)//最大数 { int m; m=max; return m; } public static int Min(int min)//最小数 { int m; m=min; return m; } public static void Display(int SIZE,int SecondOperation,String Negative,String Remainder,int Max,int Min)//算式计算 { String Again[][]=new String[SIZE][1];//用数组装算式,用以判断是否重复 for(int i=0;i<SIZE;i++)//重复次数,用以确定算式多少 { int cha=Max-Min; int c,q1,w1,q2,w2; String s1=new String(); String s2=new String(); String equation=new String(); String symbol=new String();//符号判定 c=(int)(Math.random()*SecondOperation); if(c==0) symbol="+"; if(c==1) symbol="-"; if(c==2) symbol="*"; if(c==3) symbol="/"; for(int j=0;j<2;j++)//两次循环,第一次为第一个数字,第二次为第二个数字 { int n1 =-99999,n2=-99999;//用于后面是否为分数的判定 int s=(int)(Math.random()*2);//随机数判定整数或分数,0整数,1分数 if(s==0)//整数 { if(Negative.equals("N")) { if(c==0||c==1) { while(n1<0) { n1=(int)(Min+Math.random()*(cha+1));//随机产生从min到max之间的数 } } else { n1=(int)(Min+Math.random()*(cha+1)); } } if(Negative.equals("Y")) { n1=(int)(Min+Math.random()*(cha+1)); } } if(s==1)//分数 { n1=(int)(Min+Math.random()*(cha+1));//随机产生从min到max之间的数 n2=(int)(Min+Math.random()*(cha+1)); if(Negative.equals("N")) { if(c==0||c==1) { while(n1<=0||n2<=0) { n1=(int)(Min+Math.random()*(cha+1)); n2=(int)(Min+Math.random()*(cha+1)); } } else { while(n1==0||n2==0)//分母不能为零 { n1=(int)(Min+Math.random()*(cha+1)); n2=(int)(Min+Math.random()*(cha+1)); } } } if(Negative.equals("Y")) { while(n1==0||n2==0)//分母不能为零 { n1=(int)(Min+Math.random()*(cha+1)); n2=(int)(Min+Math.random()*(cha+1)); } } int z1=Math.abs(n1),z2=Math.abs(n2);//取n1和n2的绝对值,以便化简输出 int chushu=2; if(z1>z2)//化简 { while(z2>=chushu) { if(z1%chushu==0&&z2%chushu==0) { z1=z1/chushu;z2=z2/chushu; } else { chushu++; } } } else if(z1<z2) { while(z1>=chushu) { if(z1%chushu==0&&z2%chushu==0) { z1=z1/chushu;z2=z2/chushu; } else { chushu++; } } } else { z1=1;z2=1; }; if(n1<0)//去掉绝对值,返回原来的数 { n1=0-z1; } else { n1=z1; } if(n2<0) { n2=0-z2; } else { n2=z2; } } if(j==0)//第一个数字 { q1=n1;w1=n2; if(w1==-1&&q1<0) { q1=Math.abs(q1); } if(w1==-1&&q1>0) { q1=0-q1; } if(w1>-99999)//如果存在分母,则为分数 { if(Math.abs(w1)!=1) { if(q1<0&&w1<0) { q1=Math.abs(q1);w1=Math.abs(w1); } if(w1<0) { s1="("+q1+"/("+w1+"))"+""; } else { s1="("+q1+"/"+w1+")"+""; } } if(Math.abs(w1)==1)//为整数 { if(q1>=0) { s1=q1+""; } if(q1<0) { s1="("+q1+")"+""; } } } else//否则为整数 { if(q1>=0) { s1=q1+""; } if(q1<0) { s1="("+q1+")"+""; } } } if(j==1)//第二个数字 { q2=n1;w2=n2; if(c==3)//当为除法时,除数不能为0, { while(q2==0) { q2=(int)(Min+Math.random()*(cha+1)); }//分子或整数不能为0 } if(w2==-1&&q2<0) { q2=Math.abs(q2); } if(w2==-1&&q2>0) { q2=0-q2; } if(w2>-99999)//如果存在分母,则为分数 { if(Math.abs(w2)!=1) { if(q2<0&&w2<0) { q2=Math.abs(q2);w2=Math.abs(w2); } if(w2<0) { s2="("+q2+"/("+w2+"))"+""; } else { s2="("+q2+"/"+w2+")"+""; } } else { if(q2<0) { s2="("+q2+")"+""; } if(q2>0) { s2=q2+""; } } } else//否则为整数 { if(q2<0) { s2="("+q2+")"+""; } if(q2>0) { s2=q2+""; } } if(c==3&&Remainder.equals("N"))//除法无余数 { q1=q2*n1;w1=w2; if(w1%n1==0) { w1=w1/n1;q1=q1/n1; } if(w1>-99999)//如果存在分母,则为分数 { if(Math.abs(w1)!=1) {s1="("+q1+"/"+w1+")"+"";} else//否则为整数 { s1=q1+""; } } else//否则为整数 { s1=q1+""; } } } } equation=equation+s1+symbol+s2+"=";//表达式 Again[i][0]=equation; for(int k=0;k<(i+1);k++)//避免重复 { if(Again[i][0].equals(Again[k][0])) { k--;break; } } System.out.println(equation); } } public static void main(String args[]) { String p3="Y"; @SuppressWarnings("resource") Scanner sc=new Scanner(System.in); System.out.println("请输入定制数量:"); int size=sc.nextInt(); System.out.println("是否有乘除法,有(Y),没有(N)"); String p1=sc.next(); System.out.println("加减有无负数,有(Y),没有(N)"); String p2=sc.next(); if(p1.equals("Y")) { System.out.println("除法有无余数,有(Y),没有(N)"); p3=sc.next(); } System.out.println("请输入数值范围最大值:"); int max=sc.nextInt(); System.out.println("请输入数值范围最小值:"); int min=sc.nextInt(); int a=SIZE(size); int b=SecondOperation(p1) ; String c=Negative(p2); String d=Remainder(p3); int e=Max(max); int f=Min(min); Display(a,b,c,d,e,f);//函数的调用,实现 } }
结果截图:
周活动总结表
姓名:王艺霖 日期 2016/3/19
听课 | 编写代码 | 阅读课本 | 准备考试 | 日总计 | |||
周日 | |||||||
周一 | 100 | 57 | 30 | 187 | |||
周二 | 33 | 30 | 63 | ||||
周三 | 37 | 30 | 67 | ||||
周四 | 41 | 41 | |||||
周五 | |||||||
周六 | 158 | 158 | |||||
周总计 | 326 | 516 |
时间记录日志
学生:王艺霖 日期:2016/3/19
教师:王建民 课程:软件工程
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 | C | U |
3/14 | 8:00 | 10:00 | 20 | 100 | 上课 | 下课 | ||
19:00 | 21:00 | 10 | 110 | 编程 | 休息 | |||
3/15 | 15:00 | 17:00 | 20 | 100 | 编程 /看书 | 休息 | ||
3/16 | 15:00 | 17:30 | 20 | 130 | 编程 /看书 | 休息 | ||
3/17 | 19:00 | 20:30 | 10 | 80 | 编程/看书 | 休息 | ||
3/19 | 9:00 | 10:30 | 10 | 80 | 编程 | 休息 | ||
14:00 | 16:30 | 30 | 120 | 编程 | 休息 |
缺陷记录日志
学生:王艺霖
日期:2016/3/19
教员:王建民
程序号:四则运算2
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复阶缺陷 |
3/14 | 1 | 编码 | 编译 | 10min | ||
描述:判断字符串相等 | ||||||
3/17 | 2 | 设计 | 编译 | 30min | ||
描述:分数除法时,除数和分母都不能为零 |
个人总结:
这次在编程当中讨论的思路很清晰,但是就是实现思路很难,有好几个地方都是错了又错。首先在判断字符相等时总是用=,没想到用equals,就总是i实现不了;对于负数的实现想了很多才想出一种方法;分数除法的时候忘记如果是除法并且第二个数是分数时分子分母都不能为零;还有就是判定是否重复,用了一个数组来将表达式存储起来,然后如果有重复的话就重新循环实现函数。总体来说程序可能有一些还没发现的缺陷,经过这次的讨论、思考以及修改,自己的能力有了一定的提升。