软件工程个人作业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级过程文档

时间记录日志

 

 

缺陷记录日志

 

posted on 2017-03-10 12:48  王甜甜的小摩托  阅读(164)  评论(0编辑  收藏  举报

导航