zoukankan      html  css  js  c++  java
  • 阿超超的四则运算 想啊想啊

    之前的代码修改:

    package 阿超超;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.PrintStream;
    import java.util.Random;
    import java.util.Scanner;
    import java.util.Vector;
    
    public class Achao {
            static Scanner sc=new Scanner(System.in);
            static Random ne=new Random();
            static Vector<String> vet=new Vector<String>();
            static int zfnnNum  = 0; //记录含真分数的题目数
            static String jg;
            static String str1,str2;
            int cho;
            
            /**
             * 求两个数之间的最大公约数
             */
            public static int getGCD(int max, int min) {
            int gcd = 1;
            if(min >= max) {
                int temp = max;
                max = min;
                min = temp;
            }
            for(int i = min;i>=1;i--) {
                if(max % i == 0 && min % i == 0) {
                    gcd = i;
                    break;
                }
            }
            return gcd;
        }
    
            public static void main(String[] args) throws Exception
            {  
                   try{
                        System.out.println("用户您好,请对该次出题做出要求");
                        System.out.print("出题数目N(正整数):");
                       int N=sc.nextInt();
                        System.out.print("输入运算范围fw?(1~fw,正整数?):");
                        int fw=sc.nextInt();
                        System.out.print("是否有乘除cc(有1,无0):");
                        int cc=sc.nextInt();
                        System.out.print("是否有真分数zf(有1,无0):");
                        int zf=sc.nextInt();
                        
                        //只有加减无真分数
                        if(cc==0&&zf==0)
                            cc0(N,fw);
        
                        //有乘除,无真分数
                        else if(cc==1&&zf==0)
                        zf0(N,fw);
                        
                        //无乘除有真分数
                        else if(cc==0&&zf==1)
                        {
                            System.out.print("含有真分数的题目数量zfn(0<zfn<=N):");
                            int zfn=sc.nextInt();
                            cc1(N,fw,zfn);
                        }
                        //有乘除,有真分数
                        else if(cc==1&&zf==1)
                        {
                            System.out.print("含有真分数的题目数量zfn(0<zfn<=N):");
                            int zfn=sc.nextInt();
                            zf1(N,fw,zfn);
                        }
                        //System.out.println("是否有括号(有1,无0)");
                        //有无负数
                        //打印选择
                   }//try
                    catch(Exception e)    {
                        System.out.println("输入格式有误!");
                   }    
            }//main
        
            //只有加减无真分数
            public static void cc0(int NN,int fww) throws Exception
            {
                    for(int i=0;i<NN;i++) { // i 从0开始,循环NN次,出题NN道
                            char[] fh={'+','-'};//符号数组
                            int ysfh=ne.nextInt(fh.length);
                            char h=fh[ysfh];
                            int a=ne.nextInt(fww+1);
                            int b=ne.nextInt(fww+1);
                            jg=a+" "+h+" "+b+" "+"=";
                            //----------查重操作---------
                            if(i ==0) //如果 i=0,只有一个数,不会重,则 vet 中增加一个
                                vet.add(jg);
                            else{ //如果 i 不等于 0,则有可能出题重复
                                for(int j = 0; j <i; j++) { 
                                    /* j从0开始,循环 i 次,将vet 中的元素依次与 jg 比较,如果有相同的,则说明有重复,此时i--,取消该次出题,
                                    结束本次循环;如果没有相同的元素,则执行 vet.add(jg); 并退出(break)查重的循环
                                    */
                                    if(vet.get(j).equals(jg)){
                                        i--; continue;
                                    }
                                    else{
                                        vet.add(jg);//在末尾加入字符串?而不是对象?
                                        break;
                                    }
                                }//查重完毕
                            }
                    }//for 出题    
                    System.out.print("出题完成,请选择  1打印    0预览:");
                    int cho=sc.nextInt();
                    if (cho==1)
                    {
                        for(int pt=0; pt<vet.size();pt++)
                        {
                            System.out.print(vet.get(pt)+"        ");
                            if((pt+1)%5==0)System.out.println(" ");
                        }
                    }//打印
                    else if(cho==0)
                    {
                        System.out.println("默认地址 E://阿超//a.txt");
                        FileOutputStream  fl=new FileOutputStream(new File("E://阿超//a.txt"));
                        PrintStream p= new PrintStream(fl);
                        for(int pt=0;pt<vet.size();pt++)
                        {
                            p.print(vet.get(pt)+"     ");
                            if((pt+1)%5==0)
                                p.println(" ");
                        }
                        p.close();
                    }//预览
            }            
    
            //有加减乘除,无真分数
            public static void zf0(int NN,int fww) throws Exception {
                    for(int i=0;i<NN;i++)
                    {
                            char[] fh={'+','-','×','÷'};//符号数组
                            int ysfh=ne.nextInt(fh.length);
                            char h=fh[ysfh];
                            
                            int a=ne.nextInt(fww+1);
                            int b=ne.nextInt(fww+1);
                            String jg=a+" "+h+" "+b+" "+"=";
                            if(i ==0)
                                vet.add(jg);
                            else{
                                for(int j = 0; j <i; j++) {
                                    if(vet.get(j).equals(jg))
                                        i--;
                                    else{
                                        vet.add(jg);//在末尾加入字符串?而不是对象?
                                        break;
                                    }
                                }//查重完毕
                            }
                    }//for 出题                
                    System.out.print("出题完成,请选择  1打印    0预览:");
                      int cho=sc.nextInt();
                       if (cho==1)
                       {
                           for(int pt=0;pt<vet.size();pt++)
                           {
                               System.out.print(vet.get(pt)+"        ");
                               if((pt+1)%5==0)System.out.println(" ");
                           }
                       }//打印
                       else if(cho==0)
                       {
                           System.out.println("默认地址 E://阿超//a.txt");
                           FileOutputStream  fl=new FileOutputStream(new File("E://阿超//a.txt"));
                           PrintStream p= new PrintStream(fl);
                           for(int pt=0; pt<vet.size();pt++)
                           {
                               p.print(vet.get(pt)+"     ");
                               if((pt+1)%5==0)
                                   p.println(" ");
                           }
                           p.close();
                       }//预览    
                }
                
            //有加减,无乘除,有真分数/
            public static void cc1(int NN,int fww ,int zfnn) throws Exception 
            {
                    for( int i=0;i< NN;i++)
                    {
                        char[] fh={'+','-'};//符号数组
                        int ysfh=ne.nextInt(fh.length);
                        char h=fh[ysfh];
                        int a=ne.nextInt(fww+1);
                        int b=ne.nextInt(fww+1);
                        int c=ne.nextInt(fww+1);
                        int d=ne.nextInt(fww+1);
                        int e=ne.nextInt(fww+1);
                        int f=ne.nextInt(fww+1);
                        Object[] obj = new Object[4];//混合数组        {整数,整数,真分数,真分数}
                        //先把两个整数存到混合数组中
                        obj[0]=e; 
                        obj[1]=f;        
                        /* 如果 a b c d 或者 a = b , c = d 其中任何一个为 0 则 i--,取消该次出题,并退出该次循环。
                            这是为了保证 a / b, c /d 一定是分数,不会出现等于0 或者 等于1的情况
                         */
                        if(a == 0 || b == 0 || c == 0 || d == 0 || a == b || c == d) {
                                i--;continue;
                        }else{ //满足条件后保证分子(a 和 c )小于分母( b 和 d)
                                if(b < a ) //保证b的值大于a的值
                                 {
                                     int temp=a;
                                     a=b;
                                     b=temp;   
                                 }
                                if(d < c ) //保证d的值大于c的值
                                 {
                                     int temp=c;
                                     c=d;
                                     d=temp;      
                                 }
                                int gcd1 = getGCD(b,a);  //求a b 的最大公约数
                                 a = a / gcd1; b = b / gcd1; 
                                 int gcd2 = getGCD(d,c);//求c d 的最大公约数
                                 d = d / gcd2; c = c / gcd2; 
                                 obj[2]=a+"/"+b;
                                 obj[3]=c+"/"+d;
                                int objcd1=ne.nextInt(obj.length);
                                int objcd2=ne.nextInt(obj.length);//获取混合数组的一个元素
                                //如果出现分数,则统计含真分数题目的值加一
                                if(objcd1 == 3 || objcd2 == 3 || objcd1 == 2 || objcd2 == 2){
                                    zfnnNum++;
                                }
                                if(zfnnNum > zfnn) { //如果出现分数次数大于要求值,则不在让分数参与出题
                                    objcd1=(int) (Math.random()*1); //而是在两个整数之间取值
                                     //取另外一个整数
                                    if(objcd1 == 1) { objcd2 = 0;}
                                    else if(objcd1 == 0){objcd2 =1;}
                                }
                                Object m=obj[objcd1];
                                str1=m.toString(); 
                                Object n=obj[objcd2];
                                str2=n.toString(); 
                            String jg=str2+" "+h+" "+str1+" "+"=";
                            if(i ==0)
                                vet.add(jg);
                            else{
                                for(int j = 0; j <i; j++) {
                                    if(vet.get(j).equals(jg))
                                        i--;
                                    else{
                                        vet.add(jg);//在末尾加入字符串?而不是对象?
                                        break;
                                    }
                                }//查重完毕
                            }
                    }//for 出题
                }            
                System.out.print("出题完成,请选择  1打印    0预览:");
                int cho=sc.nextInt();
                if (cho==1)
                {
                    for(int pt=0;pt<vet.size();pt++)
                    {
                        System.out.print(vet.get(pt)+"        ");
                        if((pt+1)%5==0)System.out.println(" ");
                    }
                }//打印
                else if(cho==0)
                {
                    System.out.println("默认地址 E://阿超//a.txt");
                    FileOutputStream  fl=new FileOutputStream(new File("E://阿超//a.txt"));
                    PrintStream p= new PrintStream(fl);            
                    for(int pt=0;pt<vet.size();pt++)
                    {
                        p.print(vet.get(pt)+"     ");
                        if((pt+1)%5==0)
                            p.println(" ");
                    }
                    p.close();
                }//预览        
            }//cc1       ~A.1
            
            //有乘除,有真分数
            public static void zf1(int NN,int fww ,int zfnn) throws Exception 
        {
                for( int i=0;i< NN;i++)
                {
                    char[] fh={'+','-','×','÷'};//符号数组
                    int ysfh=ne.nextInt(fh.length);
                    char h=fh[ysfh];
                    int a=ne.nextInt(fww+1);
                    int b=ne.nextInt(fww+1);
                    int c=ne.nextInt(fww+1);
                    int d=ne.nextInt(fww+1);
                    int e=ne.nextInt(fww+1);
                    int f=ne.nextInt(fww+1);
                    Object[] obj = new Object[4];//混合数组        {整数,整数,真分数,真分数}
                    obj[0]=e;
                    obj[1]=f;
                    if(a == 0 || b == 0 || c == 0 || d == 0 || a == b || c == d) {
                            i--;continue;
                    }else{
                            if(b < a ) //保证b的值大于a的值
                             {
                                 int temp=a;
                                 a=b;
                                 b=temp;   
                             }
                            if(d < c ) //保证d的值大于c的值
                             {
                                 int temp=c;
                                 c=d;
                                 d=temp;      
                             }
                            int gcd1 = getGCD(b,a);
                             a = a / gcd1; b = b / gcd1; 
                             int gcd2 = getGCD(d,c);
                             d = d / gcd2; c = c / gcd2; 
                             obj[2]=a+"/"+b;
                             obj[3]=c+"/"+d;
                            int objcd1=ne.nextInt(obj.length);
                            int objcd2=ne.nextInt(obj.length);//获取混合数组的一个元素
                            if(objcd1 == 3 || objcd2 == 3 || objcd1 == 2 || objcd2 == 2){
                                zfnnNum++;
                            }
                            if(zfnnNum > zfnn) {
                                objcd1=(int) (Math.random()*1);
                                if(objcd1 == 1) { objcd2 = 0;}
                                else if(objcd1 == 0){objcd2 =1;}
                            }
                            Object m=obj[objcd1];
                            str1=m.toString(); 
                            Object n=obj[objcd2];
                            str2=n.toString();         
                        String jg=str2+" "+h+" "+str1+" "+"=";
                        if(i ==0)
                            vet.add(jg);
                        else{
                            for(int j = 0; j <i; j++) {
                                if(vet.get(j).equals(jg))
                                    i--;
                                else{
                                    vet.add(jg);//在末尾加入字符串?而不是对象?
                                    break;
                                }
                            }//查重完毕
                        }
                }//for 出题
            }                    
            System.out.print("出题完成,请选择  1打印    0预览:");
            int cho=sc.nextInt();
            if (cho==1)
            {
                for(int pt=0;pt<vet.size();pt++)
                {
                    System.out.print(vet.get(pt)+"        ");
                    if((pt+1)%5==0)System.out.println(" ");
                }
            }//打印
            else if(cho==0)
            {
                System.out.println("默认地址 E://阿超//a.txt");
                FileOutputStream  fl=new FileOutputStream(new File("E://阿超//a.txt"));
                PrintStream p= new PrintStream(fl);
                for(int pt=0;pt<vet.size();pt++)
                {
                    p.print(vet.get(pt)+"     ");
                    if((pt+1)%5==0)
                        p.println(" ");
                }
                p.close();
            }//预览        
        }//zf1       ~A.1                
    }//class

    运行结果:

    可实现,数目要求,范围要求,对乘除真分数的要求,查重,打印方式的实现。

    学到的东西:

    1.之前的思想是,随机产生真分数的分子(c,d)分母(e,f),如果不符合分子小于分母,重新产生并用while来控制。

    经过别人帮助之后,发现其实可以通过简单的大小比较交换再来确定分子分母,避免了不断重复的过程。

    2.之前在真分数产生时候没有想过分母为0的情况,大谬!

    3.之前在查重时,如果重复知道用while重新随机出,但我想正是while用太多,出现了死循环。究竟是while里面哪里出现的错误,我,不,知,道。

    现在经过别人帮助之后,,原来可以在if里面套上 i--;哇,多机灵啊!

    目前想解决的问题是  负数/余数的处理方法;

    前提是,随机数+随机符号,每道题是以String(int+char+int)类型构成的字符串形式加入vector数组,加入之前已经进行了查重。

    此时希望能够满足:可选择减有无负数+可选择除法有无余数。

    打算将用户选择放入实参,根据实参来对每一道题做判断。

    1.再加入 是否可负数 , 是否可余数两个参数

    2.在每一道题出题完成之后,通过if 参数表示不可出现,进行String截取运算字符,算出减法/除法的每一道答案,如果有负数/余数,i--;

    if 参数表可出现,源程序不必改变。

    思考之后觉得这样代码量会增加  减法(A 无负数 B有负数) 除法(C除法无余数 D除法有余数)1.A C 2.A D 3.B C 4.B D

    嗯·····是个问题

    考虑一下是每个if检验内包括2种且包含查重,还是每个if检验包括一种且不包含查重,每次出现不符合要求时i--;continue;

    你看,

      continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。

    另外如果接下来要进行判断答案的话,是否需要vector二维数组(一个是String题目,一个是答案)了呢?

    诶,要进行答案正误判断的话,小数分数的怎么办?还要通分,oh dear

    不慌,,,,

  • 相关阅读:
    最小生成树计数
    Tree
    NOJ 成绩排名
    NOJ 成绩排名
    NOJ 成绩排名
    NOJ 成绩排名
    NOJ Physics
    NOJ Physics
    NOJ Physics
    NOJ Physics
  • 原文地址:https://www.cnblogs.com/Amyheartxy/p/6512321.html
Copyright © 2011-2022 走看看