zoukankan      html  css  js  c++  java
  • 个人作业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

  • 相关阅读:
    static心得
    建库注意
    Django之模板层
    Django之视图层
    Django之路由层
    Django开篇
    HTTP协议——详细版
    前端之bootstrap
    前端之Jquery
    前端之BOM和DOM
  • 原文地址:https://www.cnblogs.com/belong033/p/6512445.html
Copyright © 2011-2022 走看看