• 软件工程个人作业01(2)


    因为“软件工程作业01”的理解有误,即“软件工程作业01”中,四则运算是按照4个数字去运算,最后计算它的答案有点困难,但随机生成任意数量的题目是没有问题的。

    所以,我又重新改了一下程序,改成两个数的四则运算,这样答案可以较轻松的计算出来。以下是此程序的相关内容:

    一、程序的设计思想

    在原来的多个数进行四则运算的基础上,更改为两个数的四则运算,并成功的实现答案验算、定量出题、整数和真分数的四则运算的功能。思想还是和原来的思想差不多:用伪随机数产生随机数,用数字表示加减乘除符号;并定义两种做题难度,计算四则运算答案后,与输入的字符相比较,并记录作对题的个数和做错题的题号。

    二、源程序代码

    import java.util.Scanner;
    
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    //随机产生四则运算题目
    //李慧,2017.3.5
    //梦断代码
    /*要求:
     1.支持真分数、整数的四则运算 
     2.题目避免重复
     3.可定制数量           
    */
    //无法避免一个类型的题重复出现
    //无法避免负数(负数可以出现么?)
    public class SZYS {
    
        public static void main(String[] args) throws ScriptException {
            // TODO Auto-generated method stub
            Scanner scan=new Scanner(System.in);
            String fuhao[]=new String[4];
            fuhao[0]="+";
            fuhao[1]="-";
            fuhao[2]="*";
            fuhao[3]="/";
            
            int i,j,k,m=0;
            int M=0,N1=0;
            
        System.out.print("请选择题目的难易程度:(请输入“较简单” or “较困难”)   ");
        String chengdu=scan.next();
        if(chengdu.equals("较简单"))
            {M=100;N1=10;}
        else if(chengdu.equals("较困难"))
            {M=1000;N1=100;}
        else{
            System.out.println("输入有误!");
        }
        System.out.println();
            System.out.print("整数的四则运算题目的数量定量:");
            int N=scan.nextInt();
            System.out.print("真分数的四则运算题目的数量定量:");
            int n=scan.nextInt();
            
            //Part01
            int dui=0;//做对的题目
            String zuocuo="";//做错的题目
            String suan[]=new String[N];//算式
            int key[]=new int[N];//答案
            String K[]=new String[N];
            System.out.println();
            System.out.println("题目打印如下:
    ");
            System.out.println("一、整数的四则运算。");
            for(i=0;i<N;i++){
             int z=(int) (Math.random()*4);
             if(z==3){//z==3
                int ff=0;
                int x=(int)(Math.random()*M); 
                int shuzu[]=new int[100];//存储因子的数组
                for(int a=1;a<=x;a++){
                    if(x%a==0)//是因子
                    {shuzu[ff]=a;ff++;}//存储到数组里去
                int y=(int)(Math.random()*ff);//随机产生数组的下标
                   suan[i]=x+" / "+shuzu[y]+" =";
                   key[i]=x/shuzu[y];
                }//for
             }//if
            else{
               int x=(int)(Math.random()*M); 
               int y=(int)(Math.random()*M);
               suan[i]=x+" "+fuhao[z]+" "+y+" =";
                  if(z==0){key[i]=x+y;}
                  if(z==1){key[i]=x-y;}
                  if(z==2) {key[i]=x*y;}
            }//if z!=3
    
          }//for
            
            
            //避免重复
            for(j=0;j<N;j++){
                for(k=j+1;k<N-1;k++){
                    int F=isF(suan[j]);
                    int FF=isF(suan[k]);
                    
                    if(F==FF)
                    {    
                        int we=panduan(suan[j]);int l=suan[j].length();
                        int h=panduan(suan[k]);int ll=suan[k].length();
                        /*
                        //用于验证
                        System.out.println(suan[j]+"的符号位置:"+we+",a:"+suan[j].substring(0,we-1)+",b:"+suan[j].substring(we+2,l-1));
                        System.out.println(suan[k]+"的符号位置:"+h+",a2:"+suan[k].substring(0,h-1)+",b2:"+suan[k].substring(h+2,ll-1));
                        */
                        if(((suan[j].substring(0,we-1)).equals(suan[k].substring(0, h-1))&&
                                (suan[j].substring(we+2,l-1)).equals(suan[k].substring(h+2,ll-1)))||
                                ((suan[j].substring(0,we-1)).equals(suan[k].substring(h+2, ll-1))&&
                                        (suan[j].substring(we+2,l-1)).equals(suan[k].substring(0, h-1))))
                        {
                            int x2=(int)(Math.random()*M); 
                            int y2=(int)(Math.random()*M);
                            int z2=(int)(Math.random()*4);
                            if(z2!=3){
                            suan[k]=x2+" "+fuhao[z2]+" "+y2+" =";
                            if(z2==0){key[i]=x2+y2;}
                              else if(z2==1){key[i]=x2-y2;}
                            else if(z2==2) {key[i]=x2*y2;}
                            }//if z2!=3
                 else{
                     int ff=0;
                    int xz2=(int)(Math.random()*M);
                    int shuzu2[]=new int[10];//存储因子的数组
                    for(int a=1;a<xz2;a++){
                        if(xz2%a==0)//是因子
                            {shuzu2[ff]=a;ff++;}//存储到数组里去
                    int yz2=(int)(Math.random()*ff);//随机产生数组的下标
                    suan[k]=xz2+" / "+shuzu2[yz2]+" =";
                    key[k]=xz2/shuzu2[yz2];
                    }
                     }//else
                        }//if2
                }//if1
            }
            }//for
            
            for(m=0;m<N;m++){
                System.out.print(m+1+".  "+suan[m]);
                K[m]=scan.next();
                if(yanzheng(K[m],key[m])==1){
                    System.out.println("Bingo!");
                    dui++;
                }
                else{
                    System.out.println("Wrong! THE KEY:"+key[m]);
                    zuocuo+=" "+(m+1);
                }
                System.out.println();
            }
            System.out.println("做对了"+dui+"道题,做错了"+(N-dui)+"道题,题号"+zuocuo+"的答案错误。");
            
            
            //Part02  随机产生真分数的四则运算
            int dui2=0;//做对的题目
            String zuocuo2="";//做错的题目
            String suan2[]=new String[n];//算式
            String key2[]=new String[n];//答案
            String K2[]=new String[n];
            System.out.println();
            System.out.println("二、真分数的四则运算。");
            for(i=0;i<n;i++){
                int x0=(int) ((Math.random()*N1)+2);
                int xx=(int) ((Math.random()*(x0-1))+1);
                int a=gongyue(x0,xx);
                int y0=(int)(Math.random()*N1)+2;
                int yy=(int)(Math.random()*(y0-1)+1);
                int b=gongyue(y0,yy);
                int zz=(int)(Math.random()*4);
                
                int p=x0/a;
                int q=xx/a;
                int o=y0/b;
                int w=yy/b;
                
                String output=q+"/"+p+" "+fuhao[zz]+" "+w+"/"+o+" =";
                suan2[i]=output;
                
                if(zz==0){
                    int KK1=p*o;int KK2=q*o+w*p;
                    int G=gongyue(KK1,KK2);
                    int K1=KK1/G; int KK22=KK2/G;
                    key2[i]=KK22+"/"+K1;
                }
                 else if(zz==1){
                     int KK1=p*o;int KK2=q*o-w*p;
                    int G=gongyue(KK1,KK2);
                    int K1=KK1/G; int KK22=KK2/G;
                    key2[i]=KK22+"/"+K1;
                    }
                 else if(zz==2) {
                     int KK1=p*o;int KK2=q*w;
                    int G=gongyue(KK1,KK2);
                    int K1=KK1/G; int KK22=KK2/G;
                    key2[i]=KK22+"/"+K1;
                     }
                 else{int KK1=p*w;int KK2=q*o;
                int G=gongyue(KK1,KK2);
                int K1=KK1/G; int KK22=KK2/G;
                key2[i]=KK22+"/"+K1;}
                }//for
            
            //避免重复
            for(j=0;j<n;j++){
                for(k=j+1;k<n-1;k++){
                    int F=isF(suan2[j]);
                    int FF=isF(suan2[k]);
                    
                 if(F==FF)
                    {
                        int we=panduan2(suan2[j]);int l=suan2[j].length();
                        int h=panduan2(suan2[k]);int ll=suan2[k].length();
                    /*
                      //用于验证
                        System.out.println(suan2[j]+"的符号位置:"+we+",a:"+suan2[j].substring(0,we-1)+",b:"+suan2[j].substring(we+2,l-1));
                        System.out.println(suan2[k]+"的符号位置:"+h+",a2:"+suan2[k].substring(0,h-1)+",b2:"+suan2[k].substring(h+2,ll-1));
                    */
                        if(((suan2[j].substring(0,we-1)).equals(suan2[k].substring(0, h-1))&&
                                (suan2[j].substring(we+2,l-1)).equals(suan2[k].substring(h+2,ll-1)))||
                                ((suan2[j].substring(0,we-1)).equals(suan2[k].substring(h+2, ll-1))&&
                                        (suan2[j].substring(we+2,l-1)).equals(suan2[k].substring(0, h-1))))
                        {    
                        int x0=(int) ((Math.random()*N1)+2);
                        int xx=(int) ((Math.random()*(x0-1))+1);
                        int a=gongyue(x0,xx);
                        int y0=(int)(Math.random()*N1)+2;
                        int yy=(int)(Math.random()*(y0-1)+1);
                        int b=gongyue(y0,yy);
                        int zz=(int)(Math.random()*4);
                        
                        int p=x0/a;
                        int q=xx/a;
                        int o=y0/b;
                        int w=yy/b;
                        
                        String output=q+"/"+p+" "+fuhao[zz]+" "+w+"/"+o+" =";
                        suan2[k]=output;
                        
                        if(zz==0){
                            int KK1=p*o;int KK2=q*o+w*p;
                            int G=gongyue(KK1,KK2);
                            int K1=KK1/G; int KK22=KK2/G;
                            key2[k]=KK22+"/"+K1;
                        }
                         else if(zz==1){
                             int KK1=p*o;int KK2=q*o-w*p;
                            int G=gongyue(KK1,KK2);
                            int K1=KK1/G; int KK22=KK2/G;
                            key2[k]=KK22+"/"+K1;
                            }
                         else if(zz==2) {
                             int KK1=p*o;int KK2=q*w;
                            int G=gongyue(KK1,KK2);
                            int K1=KK1/G; int KK22=KK2/G;
                            key2[k]=KK22+"/"+K1;
                             }
                         else{
                             int KK1=p*w;int KK2=q*o;
                        int G=gongyue(KK1,KK2);
                        int K1=KK1/G; int KK22=KK2/G;
                        if(K1==KK22){key2[k]="1";}
                        else{key2[k]=KK22+"/"+K1;}//else
                            }//else
                        }//if    
                }//if
            }//for
        }//for
            
            for(m=0;m<n;m++){
                System.out.print(m+1+".  "+suan2[m]);
                K2[m]=scan.next();
                if(K2[m].equals(key2[m])){
                    System.out.println("Bingo!");
                    dui2++;
                }
                else{
                    System.out.println("Wrong! THE KEY:"+key2[m]);
                    zuocuo2+=" "+(m+1);
                }
            System.out.println();
                }//for
            System.out.println("做对了"+dui2+"道题,做错了"+(n-dui2)+"道题,题号"+zuocuo2+"的答案错误。");
            
            
            System.out.println("
    共有"+(N+n-dui-dui2)+"道错题!下次继续努力!");
            }//main
        
        //判断是哪种符号
        public static int isF(String s){
            int x=-1;
            for(int i=0;i<s.length();i++){
                if(s.charAt(i)=='+'){x=0;}
                if(s.charAt(i)=='-'){x=1;}
                if(s.charAt(i)=='*'){x=2;}
                if(s.charAt(i)=='/'){x=3;}
            }//for
            if(x==-1){System.out.println("出现错误!,没有符号!");}
            return x;
        }
        //分数的判断
        public static int panduan2(String ss){
            int x=0;int y=0;
            for(int i=0;i<ss.length();i++){
                if(ss.charAt(i)=='+' ||ss.charAt(i)=='-' || ss.charAt(i)=='*' || ss.charAt(i)=='/'){
                        y++;
                   if(y==2){x=i;break;}
                }
            }//for
            return x;
        }
        //判断符号的位置(下标)
        public static int panduan(String ss){
            int x=0;
            for(int i=0;i<ss.length();i++){
                if(ss.charAt(i)=='+' ||ss.charAt(i)=='-' || ss.charAt(i)=='*' || ss.charAt(i)=='/'){
                    x=i;
                }
            }
            return x;
        }
        //化简
        public static int gongyue(int x,int y){
            int gongyue=1;
            int min=Math.min(x, y);
            for(int i=min;i>0;i--){
                if((x%i==0) && (y%i==0))
                {
                    gongyue=i;
                   break;
                }
            }//for
            return gongyue;    
        }
        //判断输入的与答案是否相等
        public static int yanzheng(String x,int k){
            int m=0;
            String n=String.valueOf(k);
            if(x.equals(n)){
                m=1;//1为相等
            }
            else
                m=0;
            return m;
        }
    }//end

    三、运行结果截图

    题目简单时:

    题目困难时:

    四、未完成的部分

    我的程序还需要更加人性化的设计,不会重复出现同一类型的题目;题目数量虽然可以任意的设置,但是无法生成很大的数量。还需更正代码。查了资料,小学是没有学习负数的,所以,还得避免出现负数。

  • 相关阅读:
    vbscript错误代码及对应解释大全(希望还没过时)
    对象存储服务MinIO安装部署分布式及Spring Boot项目实现文件上传下载
    一道算法题,求更好的解法
    浅谈SQLite——实现与应用
    Linux网络协议栈(二)——套接字缓存(socket buffer)
    服务器开发入门——理解异步I/O
    理解MySQL——复制(Replication)
    线性时间排序算法
    Linux网络协议栈(一)——Socket入门(2)
    理解MySQL——索引与优化
  • 原文地址:https://www.cnblogs.com/xiaxiaoshu/p/6506818.html
Copyright © 2020-2023  润新知