• 软件工程个人作业02


    四则运算在上周实现了两个运算符的加减乘除和真分数的运算,本周又加了一些新的内容。

    一、题目:

    二、程序设计思想

    1、生成随机数,整数的和分数的,分数的用字符串表示,单独写一个分数类,分子分母,写出分数加减乘除的方法。

    2、生成随机运算符数组,每道题最多有10个运算数,所以最多有9个运算符。

    3、生成表达式,用控制语句选择要生成的表达式。

    3、结果的处理,是分数的要化简。

    三、源代码

    import java.util.Random;
    import java.util.Scanner;
    
    public class SiZeKuo {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner in=new Scanner(System.in);
            menu(in);
        }
         public static void menu(Scanner in){
             int type,n,chengchu,kuohao,num,fushu,yushu;
             System.out.println("请选择:1、整式,2、分式");
             type=in.nextInt();
             System.out.println("请输入生成的运算式的个数:");
             n=in.nextInt();
             System.out.println("请选择是否有乘除:1、有,2、没有");
             chengchu=in.nextInt();
             System.out.println("请选择是否有括号:1、有,2、没有");
             kuohao=in.nextInt();
             System.out.println("请输入数值范围:");
             num=in.nextInt();
             System.out.println("请选择加减有无负数:1、有,2、没有");
             fushu=in.nextInt();
             System.out.println("请选择除法有无余数:1、有,2、没有");
             yushu=in.nextInt();
             
             String[] question = null;
             question=TiMu(type,n,kuohao,num,chengchu,fushu,yushu);
             for(int i=0;i<question.length;i++){
                 System.out.println(question[i]);
             }
             
         }
       /*  public static String[] chu(int type,int n,int chengchu,int kuohao,int num,int fushu,int yushu){
             String[] question = null;
                 question=TiMu(n,kuohao,num,chengchu,fushu,yushu);
             return question;
         }*/
         public static String[] TiMu(int type,int n,int kuohao,int num,int chengchu,int fushu,int yushu){
            int a[]=null;//每个运算式的运算数
            String aa[]=null;
             String question[]=new String[n];
             char[] ch=null;//运算符
             int kuohao1[]=null;
            //--------n道题,有乘除
             if(chengchu==1&&type==1)
             {
                 for(int i=0;i<n;i++){
                   ch=SuiJiFu(chengchu);//---每道题的运算符的个数//----这个运算式的所有运算符
                   int length=ch.length+1;//运算式的长度
                   a = new int[length];
                   for(int j=0;j<length;j++)
                   {
                       a[j]=SuiJi(num);//每道题的运算数//----------产生一个运算数
                                   //计算结果------单独调用方法
                   }
                    if(kuohao==1)//---------生成括号//----------需要括号
                       kuohao1=kuohao(length);//---------生成括号数值数组
                  // 运算式
                    question[i] = "";
                   for(int jj=0;jj<length;jj++){
                       //添加左括号
                       if(kuohao==1){
                           for(int k=0;k<kuohao1[jj];k++){
                               question[i]+="(";
                           }
                       }
                       question[i]+=a[jj];
                       //----添加有括号
                       if(kuohao==1){
                           for(int k=0;k>kuohao1[jj];k--)
                               question[i]+=")";
                       }
                       //----如果不是最后一个运算数要加上运算符
                       if(jj!=length-1){
                           question[i]+=ch[jj];
                       }
                   }
                 //  检验是否重复
                   for(int jj=0;jj<i;jj++){
                       if(question[i].equals(question[jj]))
                           i--;//重复则重新出题
                   }
    
                   
              }
             }
             //--------n道题,没有乘除
             if(chengchu==2&&type==1)
             {
                 for(int i=0;i<n;i++){
                   ch=SuiJiFu(chengchu);//---每道题的运算符的个数
                   int length=ch.length+1;
                  a = new int[length];
                   for(int j=0;j<length;j++)
                   {
                       a[j]=SuiJi(num);//每道题的运算数
                   }
                   if(kuohao==1)//---------生成括号
                       kuohao1=kuohao(length);
                   //运算式
                   question[i] = "";
                   for(int jj=0;jj<length;jj++){
                       //添加左括号
                       if(kuohao==1){
                           for(int k=0;k<kuohao1[jj];k++){
                               question[i]+="(";
                           }
                       }
                       question[i]+=a[jj];
                       //----添加右括号
                       if(kuohao==1){
                           for(int k=0;k>kuohao1[jj];k--)
                               question[i]+=")";
                       }
                       //----如果不是最后一个运算数要加上运算符
                       if(jj!=length-1){
                           question[i]+=ch[jj];
                       }
                   }
                   //检验是否重复
                   for(int jj=0;jj<i;jj++){
                       if(question[i].equals(question[jj]))
                           i--;//重复则重新出题
                   }  
    
                   
              }
             }
             //---------------分数
             //--------n道题,有乘除
             if(chengchu==1&&type==2)
             {
                 for(int i=0;i<n;i++){
                   ch=SuiJiFu(chengchu);//---每道题的运算符的个数
                   int length=ch.length+1;
                  aa = new String[length];
                   for(int j=0;j<length;j++)
                   {
                       aa[j]=SuiJiFen(num);//每道题的运算数
                                        //计算结果------单独调用方法
                   }
                   
                   
                  if(kuohao==1)//---------生成括号
                      kuohao1=kuohao(length);
                  //运算式
                 question[i] = "";
                  for(int jj=0;jj<length;jj++){
                      //添加左括号
                      if(kuohao==1){
                          for(int k=0;k<kuohao1[jj];k++){
                              question[i]+="(";
                          }
                      }
                      question[i]+=aa[jj];
                      //----添加右括号
                      if(kuohao==1){
                          for(int k=0;k>kuohao1[jj];k--)
                              question[i]+=")";
                      }
                      //----如果不是最后一个运算数要加上运算符
                      if(jj!=length-1){
                          question[i]+=ch[jj];
                      }
                  }
                  //检验是否重复
                  for(int jj=0;jj<i;jj++){
                      if(question[i].equals(question[jj]))
                          i--;//重复则重新出题
                  }
    
                   
              }
             }
             //--------n道题,有乘除
             if(chengchu==2&&type==2)
             {
                 for(int i=0;i<n;i++){
                   ch=SuiJiFu(chengchu);//---每道题的运算符的个数
                   int length=ch.length+1;
                  aa = new String[length];
                   for(int j=0;j<length;j++)
                   {
                       aa[j]=SuiJiFen(num);//每道题的运算数
                     
                       //计算结果------单独调用方法
                   }
                  if(kuohao==1)//---------生成括号
                      kuohao1=kuohao(length);
                  //运算式
                 question[i] = "";
                  for(int jj=0;jj<length;jj++){
                      //添加左括号
                      if(kuohao==1){
                          for(int k=0;k<kuohao1[jj];k++){
                              question[i]+="(";
                          }
                      }
                      question[i]+=aa[jj];
                      //----添加括右号
                      if(kuohao==1){
                          for(int k=0;k>kuohao1[jj];k--)
                              question[i]+=")";
                      }
                      //----如果不是最后一个运算数要加上运算符
                      if(jj!=length-1){
                          question[i]+=ch[jj];
                      }
                  }
                  
                  //检验是否重复
                  for(int jj=0;jj<i;jj++){
                      if(question[i].equals(question[jj]))
                          i--;//重复则重新出题
                  }
              }
             }
    //         for(int i = 0;i < n;i++){
    //             String answer = stack.execute(question[i]);
    //             question[i] += "=" + answer;
    //         }
            return question;
         }
         //运算数,整数
         public static int SuiJi(int n){
             Random ra=new Random();
             return ra.nextInt(n+1);
         }
         //运算数,分数
         public static String SuiJiFen(int n){
             int a=SuiJi(n);
             int b=SuiJi(n);
             FenShu c=new FenShu(a,b);
             return c.toString();
         }
         //运算符
         public static char[] SuiJiFu(int n3){
             //10个运算数最多有9个运算符,n2运算符的个数
                Random ra=new Random();
                int n2=ra.nextInt(9)+1;
                char fu[]=new char[n2];
                char a1[]={'+','-','*','/'};
                int a[]=new int[n2];
                if(n3==1)
                {
                    for(int i=0;i<n2;i++)
                  {
                    a[i]=ra.nextInt(4);
                    fu[i]=a1[a[i]];
                  }
                }
                //没有乘除
                if(n3==2)
                {
                    for(int i=0;i<n2;i++)
                  {
                    a[i]=ra.nextInt(2);
                    fu[i]=a1[a[i]];
                  }
                } 
                return fu;
         }
         //----------生成括号数组,length为运算式中运算数的长度
       //随机生成括号,参数为运算式的运算数的个数
            public static int[] kuohao(int length){
                 int[] kuohao = new int[length];
                for(int i = 0;i < kuohao.length;i++)   kuohao[i] = 0;
                Random rd = new Random();
                for(int i = 2;i < length;i++){//添加的括号长度(括号包围的运算数的个数)
                   for(int j = 0;j < length - i + 1;j++){
                       int t = rd.nextInt(2);//随机生成0或1,0代表不加括号,1代表加括号
                       if(t == 1){
                           if(kuohao[j] >= 0 && kuohao[j + i - 1] <= 0){//要加的括号的第一个运算数周围没有右括号,且 最后一个运算数周围没有左括号
                               int counteract = 0;
                                  for(int k = j;k < j + i;k++){//将要加的括号之间的所有运算数对应的brackets相加,
                                                                  //如果和为0说明这个括号之间的括号是匹配的,不会出现括号交叉现象
                                      counteract += kuohao[k];
                                  }
                                  if(counteract == 0){
                                      kuohao[j]++;
                                      kuohao[j + i - 1]--;
                                  }
                              }
                          }
                      }
                }
                return kuohao;
              }
         
    }
    
    class FenShu {
        private int fenmu,fenzi;
    
        public int getFenMu() {
            return fenmu;
        }
    
        public void setFenMu(int FenMu) {
            this.fenmu= fenmu;
        }
    
        public int getFenZi() {
            return fenzi;
        }
    
        public void setFenZi(int fenzi) {
            this.fenzi = fenzi;
        }
    
        public FenShu(int fenmu, int fenzi) {
            this.fenmu = fenmu;
            this.fenzi = fenzi;
            yueJian();
        }
        
        FenShu(){}
        
        //化简
        public void yueJian(){
            int y = 1;
            for(int i = fenzi;i > 1;i--){
                if(fenzi % i == 0 && fenmu % i == 0){
                    y = i;
                    break;
                }
            }
    
                fenzi /= y;
                fenmu /= y;
            
        }
        
        //
        public FenShu add(FenShu b){
            FenShu c = null;
            int fenzi = this.fenzi * b.getFenMu() + this.fenmu * b.getFenZi();
            int fenmu = this.fenmu* b.getFenMu();
            c = new FenShu(fenmu,fenzi);
            return c;
        }
        
        //
        public FenShu jian(FenShu b){
            FenShu c = null;
            int fenzi = this.fenzi * b.getFenMu() - this.fenmu * b.getFenZi();
            int fenmu = this.fenmu* b.getFenMu();
            c = new FenShu(fenmu,fenzi);
            return c;
        }
        
        //
        public FenShu cheng(FenShu b){
            FenShu c = null;
            int fenzi = this.fenzi *  b.getFenZi();
            int fenmu = this.fenmu* b.getFenMu();
            c = new FenShu(fenmu,fenzi);
            return c;
        }
        
        //
        public FenShu chu(FenShu b){
            FenShu c = null;
            int fenzi = this.fenzi *  b.getFenMu();
            int fenmu = this.fenmu* b.getFenZi();
            c = new FenShu(fenmu,fenzi);
            return c;
        }
        //输出分数形式
        public String toString(){
            if(fenzi != 0){
                return fenzi + "/" + fenmu;
            }
            return "0";
        }
        
    }

    四、实验结果截图

    整式有乘除有括号加减有负数

    整式没有乘除没有括号加减有负数,乘除没有余数

     分式有括号,加减有负数,除法有余数

    分式没有括号,加减没有负数,除法没有余数

    五、反思总结

    1、最大的困难就是怎么在运算式上加括号以及计算的问题。

    2、数据结构学的算法,计算表达式用后缀到栈的思想,将中缀表达式变成表达式,根据运算符的优先级来堆栈弹栈。

    3、加不加括号也用随机数决定,但是一定要匹配。

    4、作业要及时写,及时写。

    PSP0级过程文档

    时间记录日志

    缺陷记录日志

  • 相关阅读:
    ubuntu 安装redis以及phpredis
    【译】关于Rust模块的清晰解释
    【译】Ringbahn的两个内存Bug
    从背单词到写代码
    【译】Rust中的array、vector和slice
    【译】理解Rust中的闭包
    【译】Rust,无畏并发
    Linux环境下发布.net core
    负载均衡之nginx
    mysql数据库变更监控(canal)
  • 原文地址:https://www.cnblogs.com/jingxiaopu/p/6530090.html
Copyright © 2020-2023  润新知