zoukankan      html  css  js  c++  java
  • java-四则运算,自动出题(1)

    实验要求:

    花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性)、题目避免重复、可定制出题的数量。

    实验思路:

    通过分析实验的要求理清自己的实验思路,循序渐进,我一共做了三段时间,自认为走了三步,一二步建立基础,第三步进行调试,整改,添加功能。

       第一大步(实现输入数量,产生随机的整数加减乘除算式)

     本人所用时间:大约20 minutes

    1.先实现100以内的固定数量的随机加;

     r1[i]=(int)(1+Math.random()*100);

     r2[i]=(int)(1+Math.random()*100);

     r1[i]+r2[i];

    2.然后实现随机的(+”,“-”,“*”,“/”)

     建立储存运算符的charr3[]={+”,“-”,“*”,“/}

     static String[] r3={"+","-","*","/"};

     用随机的c=random(),实现4以内的数字(0123, 就能随机产生运算符。

     int a=(int)(0+Math.random()*4);

     s1=r3[a];

    4.实现可定义的数量,

     定义输入的intm,建立相应的数组r1[number],r2[number];

    System.out.print("请输入定制数量:");

    Scanner scan2=new Scanner(System.in);

    int number=scan2.nextInt();

    r1=new int[number];

    r2=new int[number];

    综上,即可实现第一步。

       第二大步(产生随机的真分数加减乘除算式)

     本人所用时间:大约40minutes

    1.建立4个随机整数组:

    分别用来存储第一个分数的分子分母和第二个分数的分子分母;

     static int[] r1;

     static int[] r2;

     static int[] n3;

     static int[] n4;

    2.用来进行运算的必须是最简分数,

    需要定义一个求两个数的最大公约数的函数,再用这两个数除以最大公约数,留下来的才是最简分数。

    //simple(int a,int b)a,b的最大公约数。

    int gy1=simple(r1[i],r2[i]);

    r1[i]=r1[i]/gy1;

    r2[i]=r2[i]/gy1;

    3用来进行计算的还需是真分数

    比较每个分数的分子分母,如果分子大于分母,就进行换位例如(5/3换成3/5

    if(r1[i]>r2[i])

    {

    c1=r2[i];

    r2[i]=r1[i];

    r1[i]=c1;

    }

    还需参考第一大步的内容,添加定义数量和随机运算符,可以轻松实现第二大步。

       第三大步(避免重复,并验证结果,以及其他功能)

     本人所用时间:大约60minutes

    1.如何避免重复(以整数为例)

    除了建立了两个随机数组储存信息外,我还建立了一个存储运算符的数组,当建立新的随机数式子时,与原随机数和匹配的运算符进行比较,若相同就再次随机产生,与原来的进行重复比对。(注意思考好循环结构,每新生成需要和原来所有的进行比较。)

    for(int j=0;j<i;j++)

    {

    if(r1[i]==r1[j]&&r1[i]==r1[j]&&s1[i].equals(s1[j]))

    {

                r1[i]=(int)(1+Math.random()*100);

    r2[i]=(int)(1+Math.random()*100);

    j=0;

    }

    }

    2.如何验证算式的结果。

         这个比较简单,通过建立一个储存结果的数组,想要验证结果是否正确可以与相对应的结果数组内的数值进行比较。

    3.得数不能为负数。

        主要是减法,当结果为负数时,减数和被减数调换位置。

    4.分母不为0

      当分母为0时重新生成分母即可。

     

    随着用户要求的改变,第三大步可以进行相应的改变,总之,这个程序可变性很强的 ~/

    下面看一下程序的源代码:

    package sum1;
    
    import java.util.Scanner;
    
    public class sum1 {
        //对于整数来书:建立两个int型的数组,储存信息,便于计算和判断
        //对于真分数来书,建立两个数组,比较数组的大小,大的赋值r1[i]
        static int[] r1;
        static int[] r2;
       //对于真分数来书,建立两个数组,比较数组的大小,大的赋值n3[i]
        static int[] n3;
        static int[] n4;
        //结果设置成double型的,因为整数相除容易出double
        static double[]S1;
        //计算真分数的计算结果,进行化简,储存信息
        static int[]S2;
        static int[]S3;
        
        static String[] r3={"+","-","*","/"};
        //将运算符储存在是s1[i]中,便于比较算式,生成不一样的数据
        static String s1[];
        //比较不同所需要用到的循环参数;
        static int j;
        /**
         * @param args
         */
        public static void main(String[] args) {
            
            while(true)
            {
                Scanner scan1=new Scanner(System.in);
                System.out.println("请输入选项:");
                System.out.println("1、整数计算  2、真分数计算 3、退出");
                
                int choose=scan1.nextInt();
                
                if(choose==1)
                {
                    System.out.print("请输入定制数量:");
                    Scanner scan2=new Scanner(System.in);
                    int number=scan2.nextInt();
                    
                    r1=new int[number];
                    r2=new int[number];
                    S1=new double[number];
                    s1=new String[number];
                    
                    for(int i=0;i<number;i++)
                    {
                        int a=(int)(0+Math.random()*4);
                        
                        s1[i]=r3[a];
                        
                        r1[i]=(int)(1+Math.random()*100);
                        
                        r2[i]=(int)(1+Math.random()*100);
    
                        
                        if(s1[i].equals("+"))
                        {
                            
                            S1[i]=(r1[i]+r2[i]);
                            
                            System.out.println(r1[i]+" + "+r2[i]+" =");
                        }
                        
                        else if(s1[i].equals("-"))
                        { 
                            
                           if(r1[i]>r2[i])
                           {
                               S1[i]=(r1[i]-r2[i]);
                               System.out.println(r1[i]+" - "+r2[i]+" =");
                           }
                              
                           else
                           {
                                int c;
                                
                                c=r2[i];
                                r2[i]=r1[i];
                                r1[i]=c;
                                
                                S1[i]=(r1[i]-r2[i]);
                                
                               System.out.println(r1[i]+" - "+r2[i]+" =");
                           }
                        }
                        else if(s1[i].equals("*"))
                        {
                            S1[i]=(r1[i]*r2[i]);
                            System.out.println(r1[i]+" x "+r2[i]+" =");
                        }
                        else if(s1[i].equals("/"))
                        {
                            S1[i]=(r1[i]/r2[i]);
                            while(true)
                            {
                                if(r2[i]!=0)
                                {
                                     System.out.println(r1[i]+" ÷ "+r2[i]+" =");
                                     break;
                                }
                                else 
                                    r2[i]=(int)(1+Math.random()*100);
                            }    
                        }
                        //for
                    }
                    
                    System.out.println("是否输出定制结果?(1.输出    其他: 不输出)");
                    Scanner scan3=new Scanner(System.in);
                    int judge1=scan3.nextInt();
                    
                    if(judge1==1)
                    {
                        for(int i=0;i<number;i++)
                        {
                            System.out.println(""+(i+1)+"个算式的结果为:"+S1[i]);
                        }
                    }
                    //choose
                }
                
                
                 if(choose==2)
                {
                    System.out.print("请输入定制数量:");
                    Scanner scan2=new Scanner(System.in);
                    int number=scan2.nextInt();
                    
                    r1=new int[number];
                    r2=new int[number];
                    n3=new int[number];
                    n4=new int[number];
                    
                    S2=new int[number];
                    S3=new int[number];
                    
                    for(int i=0;i<number;i++)
                    {
                        r1[i]=(int)(1+Math.random()*100);
                        r2[i]=(int)(1+Math.random()*100);
                        
                        n3[i]=(int)(1+Math.random()*100);
                        n4[i]=(int)(1+Math.random()*100);
                        
                        int a=(int)(0+Math.random()*4);
                        
                        s1[i]=r3[a];
                        
                        for(j=0;j<i;j++)
                        {
                            if(r1[i]==r1[j]&&r1[i]==r1[j]&&s1[i].equals(s1[j])
                                    &&n3[i]==n3[j]&&n4[i]==n4[j])
                            {
                                r1[i]=(int)(1+Math.random()*100);
                                r2[i]=(int)(1+Math.random()*100);
                                n3[i]=(int)(1+Math.random()*100);
                                n4[i]=(int)(1+Math.random()*100);
                                j=0;
                            }
                        }
                        while(r2[i]==0)
                        {
                            r2[i]=(int)(1+Math.random()*100);
                        }
                        
                        //返回最大公约数
                        int gy1=simple(r1[i],r2[i]);
                        
                        r1[i]=r1[i]/gy1;
                        r2[i]=r2[i]/gy1;
                        
                        //建立真分数
                        int c1;
                        
                        if(r1[i]>r2[i])
                        {
                            c1=r2[i];
                            r2[i]=r1[i];
                            r1[i]=c1;
                        }
                        
                        while(n4[i]==0)
                        {
                            n4[i]=(int)(1+Math.random()*100);
                        }
                        
                        //返回最大公约数
                        int gy2=simple(n3[i],n4[i]);
                        n3[i]=n3[i]/gy2;
                        n4[i]=n4[i]/gy2;
                        
                        //建立真分数
                        int c2;
                        
                        if(n3[i]>n4[i])
                        {
                            c2=n4[i];
                            n4[i]=n3[i];
                            n3[i]=c2;
                        }
                            
                        
                        if(s1[i].equals("+"))
                        {
                           S2[i]=r1[i]*n4[i]+r2[i]*n3[i];
                           S3[i]=r2[i]*n4[i];
                           //返回最大公约数
                            gy1=simple(S2[i],S3[i]);
                            
                            S2[i]=S2[i]/gy1;
                            S3[i]=S3[i]/gy1;
                           
                           System.out.println(r1[i]+"/"+r2[i]+" + "+n3[i]+"/"+n4[i]+" =");
                        }
                        else if(s1[i].equals("-"))
                        {
                            S2[i]=r1[i]*n4[i]-r2[i]*n3[i];
                            
                            //结果为负数
                            if(S2[i]<0)
                            {
                                c2=n4[i];
                                n4[i]=r2[i];
                                r2[i]=c2;
                                
                                c2=r1[i];
                                r1[i]=n3[i];
                                n3[i]=c2;
                            }
                            
                            S2[i]=r1[i]*n4[i]-r2[i]*n3[i];
                            S3[i]=r2[i]*n4[i];
                               //返回最大公约数
                            gy1=simple(S2[i],S3[i]);
                                
                            S2[i]=S2[i]/gy1;
                            S3[i]=S3[i]/gy1;
                            
                           System.out.println(r1[i]+"/"+r2[i]+" - "+n3[i]+"/"+n4[i]+" =");
                        }
                        else if(s1[i].equals("*"))
                        {
                            S2[i]=r1[i]*n3[i];
                            S3[i]=r2[i]*n4[i];
                               //返回最大公约数
                            gy1=simple(S2[i],S3[i]);
                                
                            S2[i]=S2[i]/gy1;
                            S3[i]=S3[i]/gy1;
                            
                           System.out.println(r1[i]+"/"+r2[i]+" x "+n3[i]+"/"+n4[i]+" =");
                        }
                        else if(s1[i].equals("/"))
                        {
                            S2[i]=r1[i]*n4[i];
                            S3[i]=r2[i]*n3[i];
                               //返回最大公约数
                            gy1=simple(S2[i],S3[i]);
                                
                            S2[i]=S2[i]/gy1;
                            S3[i]=S3[i]/gy1;
                            
                           System.out.println(r1[i]+"/"+r2[i]+" ÷  "+n3[i]+"/"+n4[i]+" =");
                        }
                        //for
                    }
                    
                    System.out.print("是否输出定制结果?(1.输出    其他: 不输出)");
                    Scanner scan4=new Scanner(System.in);
                    int judge2=scan4.nextInt();
                    
                    if(judge2==1)
                    {
                        for(int i=0;i<number;i++)
                        {
                            System.out.println(""+(i+1)+"个算式的结果为:"+S2[i]+"/"+S3[i]);
                        }
                    }
                    //choose
                }
                else if(choose==3)
                {
                    break;
                }
                else 
                {
                    System.out.println("输入有误,请重新输入!");
                }
                //while
            }
            //main
        }
        
        
        public static int simple(int n1,int n2)
        {
            int max = n2;
            
            if(n1>n2)
            {
                max=n1;
            }
            
            int gongyue=1;
            
            for(int i=1;i<=max;i++)
            {
                if(n1%i==0 && n2%i==0)
                {
                    gongyue=i;
                }
            }
            return gongyue;
        }
    }

    这是程序的结果截图:

             

            

    最后总结一下未能快速完成的原因:

        不能很快的清理自己的思路,需要边写边打代码,一步步进行调试,无法做到一步到位,其实我觉得这很正常,本来我就知道一口吃不下一个胖子,我的技能还需要进行培养,思路还需要进行强化。

  • 相关阅读:
    Mybatis 原始dao CRUD方法
    JQuery的焦点事件focus() 与按键事件keydown() 及js判断当前页面是否为顶级页面 子页面刷新将顶级页面刷新 window.top.location
    使用actionerror做失败登录验证
    Java项目中的下载 与 上传
    shiro框架 4种授权方式 说明
    javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式
    序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
    Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
    orcal 数据库 maven架构 ssh框架 的全注解环境模版 maven中央仓库批量删除lastupdated文件后依然是lastupdated解决方法 mirror aliyun中央仓库
    EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  • 原文地址:https://www.cnblogs.com/suifengye/p/6490968.html
Copyright © 2011-2022 走看看