阿超超的四则运算 想啊想啊

之前的代码修改:

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

不慌,,,,

 

posted @ 2017-03-06 22:17  陶雨洁  阅读(402)  评论(0编辑  收藏  举报