个人作业1——四则运算题目生成程序(基于控制台)

一、需求分析

1、题目要求:

看了大家对于本课程的目标和规划,很多同学都希望能提高自己的实践能力,没有捷径可走,就是练习、练习再练习!那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序

从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:

1、除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
2、运算符为 +, −, ×, ÷
3、并且要求能处理用户的输入,并判断对错,打分统计正确率。
4、要求能处理用户输入的真分数, 如 1/2, 5/12 等
5、使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10

2、题目分析:
(1)是基于小学的四则运算题目,所以不会出现负数的结果,且只有两个数的简单四则运算;
(2)支持真分数和整数的运算;
(3)能够判断对错,若错误则输出正确答案;
(4)能够计算正确率并输出。

二、功能设计

1、自动随机生成真分数和整数;
2、随机生成一则简单的四则运算题目;
3、能够计算题目,并判断用户输入的答案正确与否,若错误则输出正确答案;
4、能够计算用户答题的正确率。

三、设计实现

java类有:createFraction、createInteger、main三类:
 (1)createFraction:是负责随机创造两个真分数并组成四则运算,有真分数的运算方法,公约数的计算方法,最小公倍数的计算方法;
 (2)createInteger:是负责随机创造两个整数并组成四则运算,有整数的运算方法,公约数的判断方法等;
 (3)main:负责调用createFraction、createInteger两类,随机选择真分数或整数的四则运算组成多个题目并输出正确率。

四、代码说明

真分数生成:

	public static int[] createFraction(){  
        int[] fraction=new int[2];
        int fraction1 = (int)(Math.random()*10+1);//避免分子出现零
        int fraction2 = (int)(Math.random()*10+1);//避免分母出现零
        if(fraction1!=fraction2){           //避免出现分母分子相同
            if(fraction1<fraction2){        //避免出现假分数
            	fraction[0]=fraction1;
            	fraction[1]=fraction2;  
            	return fraction;
            }else{
            	fraction[0]=fraction2; 
            	fraction[1]=fraction1;  
            	return fraction;
            }
        }else  
            createFraction(); 
        return fraction;
        
    }

最大公约数:

public static int GCD(int m, int n) {  //辗转相除法求最大公约数
		if (n == 0)
        {
            throw new IllegalArgumentException("Argument 'divisor' is 0");
        }
        else
        {
            if ((m = m % n) == 0)
            	return n;
            else 
            	return m;
        }
      }

最小公倍数:

	public static int LCM(int m, int n) {  //求最小公倍数
		return m*n/GCD(m,n);
        }

生成真分数的四则运算及判断对错:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);//真分数的计算
	   int op=(int)(Math.random()*4+1);
	   int[] f1 = createFraction();
       int[] f2 = createFraction();
       int j=GCD(f1[0],f1[1]);
       f1[0]=f1[0]/j;
       f1[1]=f1[1]/j;
       j=GCD(f2[0],f2[1]);
       f2[0]=f2[0]/j;
       f2[1]=f2[1]/j;
       int gbs = LCM(f1[1],f2[1]);
		   if(op==1){//加法
			 System.out.println("("+f1[0]+"/"+f1[1]+")+("+f2[0]+"/"+f2[1]+")="); 
	           int num1=f1[0]*f2[1]+f2[0]*f1[1];


	           int num2=f1[1]*f2[1];
	           int num3=GCD(num1,num2);
	            num1=num1/num3;
	            num2=num2/num3;
			 String a=new String();
			  if(num1==num2)
	            {
	                a="1";
	            }
	            else
	            {
	            	a=num1+"/"+num2;
	            }
			 String ans=in.next();
			 if(ans.equals(a))
          {
              System.out.println("true");
          }
          else
          {
              System.out.println("false");
              System.out.println("The correct answer is "+a);
              wrong=wrong+1;
          }
	           
	           
		  }
		   if(op==2){//减法
			   int num1=f1[0]*f2[1]-f2[0]*f1[1];
			   if(num1>0){  //防止出现负数 
				 System.out.println("("+f1[0]+"/"+f1[1]+")-("+f2[0]+"/"+f2[1]+")="); 
				 int num2=f1[1]*f2[1];
				 String a=new String();
				 if(num1==0)
	                {
	                    a="0";
	                }
	                else
	                {
	                int num3=Math.abs(GCD(num1,num2));
		            num1=num1/num3;
		            num2=num2/num3;
	                if(num1==num2)
	                {
	                    a="1";
	                }
	                else
	                {
	                    a=num1+"/"+num2;
	                }
	                }
				 String ans=in.next();
				 if(ans.equals(a))
	             {
	                 System.out.println("true");
	             }
	             else
	             {
	                 System.out.println("false");
	                 System.out.println("The correct answer is "+a);
	                 wrong=wrong+1;
	             }
		   }else{
			   System.out.println("("+f2[0]+"/"+f2[1]+")-("+f1[0]+"/"+f1[1]+")="); 
			     int num11=f2[0]*f1[1]-f1[0]*f2[1];
				 int num2=f1[1]*f2[1];
				 String a=new String();
				 if(num11==0)
	                {
	                    a="0";
	                }
	                else
	                {
	                int num3=Math.abs(GCD(num11,num2));
		            num11=num11/num3;
		            num2=num2/num3;
	                if(num11==num2)
	                {
	                    a="1";
	                }
	                else
	                {
	                    a=num11+"/"+num2;
	                }
	                }
				 String ans=in.next();
				 if(ans.equals(a))
	             {
	                 System.out.println("true");
	             }
	             else
	             {
	                 System.out.println("false");
	                 System.out.println("The correct answer is "+a);
	                 wrong=wrong+1;
	             }
		   }
			  }
		  if(op==3){//乘法
				 System.out.println("("+f1[0]+"/"+f1[1]+")*("+f2[0]+"/"+f2[1]+")="); 
				 int num1= f1[0]*f2[0]; 
              int num2 = f1[1]*f2[1];
				 int num3=GCD(num1,num2);
				 String a=new String();
				 num1= num1/num3; 
                 num2 = num2/num3;
              if(num1==num2)
	                {
	                    a="1";
	                }
	                else
	                {
	                    a=num1+"/"+num2;
	                }
				 String ans=in.next();
				 if(ans.equals(a))
	             {
	                 System.out.println("true");
	             }
	             else
	             {
	                 System.out.println("false");
	                 System.out.println("The correct answer is "+a);
	                 wrong=wrong+1;
	             }
				
			  }
		  if(op==4){//除法
				 System.out.println("("+f1[0]+"/"+f1[1]+")÷("+f2[0]+"/"+f2[1]+")="); 
				 int num1= f1[0]*f2[1]; 
				 int num2 = f1[1]*f2[0];
				 int num3=GCD(num1,num2);
				 String a=new String();
				 num1= num1/num3; 
              num2 = num2/num3;
              if(num1==num2)
	                {
	                    a="1";
	                }
	                else
	                {
	                    a=num1+"/"+num2;
	                }
				 String ans=in.next();
				 if(ans.equals(a))
	             {
	                 System.out.println("true");
	             }
	             else
	             {
	                 System.out.println("false");
	                 System.out.println("The correct answer is "+a);
	                 wrong=wrong+1;
	             }
			  
			  }
		  
	}

main类:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int wrong;
		createFraction f = new createFraction();
		createInteger i = new createInteger();
		System.out.println("Please enter the subject number:");
        Scanner a = new Scanner(System.in);
        int n = a.nextInt();
        int m = (int)(Math.random()*n+1);//随机整数题目和分数题目的题量
        for(int j=0;j<(n-m);j++){//整数题目
        	f.main(null);
        }
        for(int j=0;j<m;j++){//分数题目
        	i.main(null);
        }
        wrong=f.wrong+i.wrong;//计算正确率
        int sum=100-(wrong*100/n);
        System.out.println("The accuracy is:"+sum+"%");
 }

五、测试运行


六、PSP

七、小结

对java并不是很熟悉,所以写得很艰难,边百度边学边写,一开始并不知道怎么写,只能慢慢摸索,结果就是程序疯狂报错,最后好不容易才写完了_(:зゝ∠)_

因为用了很多的if嵌套语句,有的if语句还是后来添上的,大括号经常丢了,然后对个半天。。。。以及我没法把程序打包成exe文件,弄了半天还是不行,百度了也没解决_(:зゝ∠)_

我在真分数运算的createFraction类里的最大公约数那写了个异常抛出,在没写之前是经常给我报被除数为零的异常错误,我不知道错哪里了= =,而且我在整数运算里并没有写异常抛出也没报过错啊。。。。最后百度了半天才写了个异常抛出,然而并不知道到底写对了没_(:зゝ∠)_。。。

码市地址:https://git.coding.net/Belong033/java-Frist.git

posted @ 2017-03-07 21:54  belong033  阅读(273)  评论(1编辑  收藏  举报