题目要求:
像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”。
要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性)、
题目避免重复、可定制出题的数量。
(有能力者改编成网页版)
程序设计思想:
首先我建了一个包含主函数的类,用来执行功能,比如说,根据用户需求进行出题、
控制出的题目不重复、控制分数题里出的是真分数等。
然后我又写了另一个类,在这个类里,只有各种各样执行功能的方法,比如说,求两个数的最大公约数、
求两个数的最小公倍数、对一个分数进行约分、对两个分数进行运算等。
源程序:
(下面是包含主函数的类)
package math_package; import java.util.Random; import java.util.Scanner; import mathMethod.*; public class Math { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int a;//用来产生存储一个随机数 int b;//用来产生一个1~4以内的随机数,分别代表加减乘除 int c;//用来产生第二个参与运算的数 int d;//用来随机出是产生整数式还是真分数式 int e;//第一个数的分母 int f;//第二个数的分母 Random ran=new Random(); System.out.println("请输入你要定制的数量:"); Scanner scan=new Scanner(System.in); int number=scan.nextInt(); System.out.println("开始答题"); //这个数组是用来存放已经出好的题 String nihao[]=new String [number]; int number1=0;//这个是用来对已经出的题进行计数 String result=""; //用来接受分数答案 int result1; //用来整数接收 int i,j; for(i=0;i<number;i++){ d=ran.nextInt(2)+1; if(d==1){ //如果d是1,那么就产生整数式 a=ran.nextInt(10)+1; b=ran.nextInt(4)+1; c=ran.nextInt(10)+1; if(b==1){ String bian1=a+"+"+c+"="; String bian2=c+"+"+a+"="; for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.print(a+"+"+c+"="); result1=scan.nextInt(); //接收答案 while(result1!=(a+c)) { System.out.print("答案不正确,请重新输入:"); result1=scan.nextInt(); } } else i=i-1; } else if(b==2){ String bian1=a+"-"+c+"="; String bian2=c+"-"+a+"="; for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.println(a+"-"+c+"="); result1=scan.nextInt(); //接收答案 while(result1!=(a-c)) { System.out.print("答案不正确,请重新输入:"); result1=scan.nextInt(); } } else i=i-1; } else if(b==3){ String bian1=a+"*"+c+"="; String bian2=c+"*"+a+"="; for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.println(a+"*"+c+"="); result1=scan.nextInt(); //接收答案 while(result1!=(a*c)) { System.out.print("答案不正确,请重新输入:"); result1=scan.nextInt(); } } else i=i-1; } else if(b==4){ String bian1=a+"/"+c+"="; String bian2=c+"/"+a+"="; for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.println(a+"/"+c+"="); result1=scan.nextInt(); //接收答案 while(result1!=(a/c)) { System.out.print("答案不正确,请重新输入:"); result1=scan.nextInt(); } } else i=i-1; } } else if(d==2){ //如果d是2,那么就产生真分数式 a=ran.nextInt(10)+1; b=ran.nextInt(4)+1; c=ran.nextInt(10)+1; e=ran.nextInt(10)+1; f=ran.nextInt(10)+1; //对两个分数进行约分 String g=Method.reduce(a,e); String h=Method.reduce(c, f); if(b==1){ String bian1=g+"+"+h+"="; String bian2=h+"+"+g+"="; if(a/e<1&&c/f<1){ for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.println(g+"+"+h+"="); result=scan.next();//接收结果 while(!(result.equals(Method.calculate(g, h,"+")))) { System.out.print(Method.calculate(g, h,"+")+"答案不正确,请重新输入:"); result=scan.next(); } } else i=i-1; } else i=i-1; } else if(b==2){ String bian1=g+"-"+h+"="; String bian2=h+"-"+g+"="; if(a/e<1&&c/f<1){ for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.println(g+"-"+h+"="); result=scan.next();//接收结果 while(!(result.equals(Method.calculate(g, h,"-")))) { System.out.print(Method.calculate(g, h,"-")+"答案不正确,请重新输入:"); result=scan.next(); } } else i=i-1; } else i=i-1; } else if(b==3){ String bian1=g+"*"+h+"="; String bian2=h+"*"+g+"="; if(a/e<1&&c/f<1){ for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.println(g+"*"+h+"="); result=scan.next();//接收结果 while(!(result.equals(Method.calculate(g, h,"*")))) { System.out.print(Method.calculate(g, h,"*")+"答案不正确,请重新输入:"); result=scan.next(); } } else i=i-1; } else i=i-1; } else if(b==4){ String bian1=g+"/"+h+"="; String bian2=h+"/"+g+"="; if(a/e<1&&c/f<1){ for(j=0;j<number1;j++){ if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){ break; } } if(j==number1) { nihao[number1]=new String(bian1); number1++; System.out.println(g+"/"+h+"="); result=scan.next();//接收结果 while(!(result.equals(Method.calculate(g, h,"/")))) { System.out.print(Method.calculate(g, h,"/")+"答案不正确,请重新输入:"); result=scan.next(); } } else i=i-1; } else i=i-1; } } } System.out.println("答题结束"); } }
(下面是只包含方法的类)
package mathMethod; //采用分而治之的思想 public class Method { public static int maxCommon(int a ,int b) { //循环法求两个数的最大公约数 //保证第一个参数大于第二个参数 if(a<b) { int temp; temp=a; a=b; b=temp; } while(a%b!=0) //在余数不为零时循环 { int temp=a%b; a=b; b=temp; } return b; //返回最大公约数 } public static int minCommon(int a,int b) { //求最小公倍数 return a*b/maxCommon(a,b); } public static String reduce(int a ,int b) { //对于a/b组成的分数进行约分 //第一步就是找出两者的最大公约数 int c=maxCommon(a,b); //分子分母约分 a=a/c; b=b/c; //把a,b转换成分数返回 String temp=a+"/"+b; return temp; } public static String calculate(String a,String b,String c) //参数分别代表第一个分数,第二个分数,以及运算符 { int a1=Integer.parseInt(a.substring(0,1));//代表a的分子 int a2=Integer.parseInt(a.substring(2));//代表a的分母 int b1=Integer.parseInt(b.substring(0,1));//代表b的分子 int b2=Integer.parseInt(b.substring(2));//代表b的分母 if(c.equals("+")) { //首先求两个分母的最小公倍数,进行通分 int temp=minCommon(a2,b2); a1=temp/a2*a1; b1=temp/b2*b1; //求合并后的分子 int temp1=a1+b1; String temp2=reduce(temp1,temp); return temp2; } else if(c.equals("-")) { //首先求两个分母的最小公倍数,进行通分 int temp=minCommon(a2,b2); a1=temp/a2*a1; b1=temp/b2*b1; //求合并后的分子 int temp1=a1-b1; return reduce(temp1,temp); } else if(c.equals("*")) { //直接把分母相乘得到合并后的分母 int temp=a2*b2; //求合并后的分子 int temp1=a1*b1; return reduce(temp1,temp); } else if(c.equals("/")) { //分数相除就是第一个分数乘以第二个分数的倒数 int temp=a2*b1; //求合并后的分子 int temp1=a1*b2; return reduce(temp1,temp); } String xuhaojun="成功了"; return xuhaojun; } }
程序结果截图:
未能及时完成的原因:
感觉自己写程序的方法不对,以至于到了最后因为一些小问题而耽误很长时间。
如果我能采用分而治之的思想,把一个大问题分解为一个一个的小问题,然后依次解决这些小问题。
那么,我感觉效率可能会提高些。