zoukankan      html  css  js  c++  java
  • 软件工程个人作业03

    设计思想:

    将随机出的题目看成字符串

     ①对字符串进行解析

     ②数字进入操作数栈

     ③运算符进入操作符栈

     ④使用栈可以解决两个及以上的减号和除号同时出现的歧义,因为用栈就遵循左结合。

     ⑤将算的结果与输入的进行比较,正确统计就比较简单了。

    代码:

    import java.util.*;
    //该处引用字符串处理方法
    class Operate{   
          private Stack<Character> priStack = new Stack<Character>();// 操作符栈   
          private Stack<Integer> numStack = new Stack<Integer>();;// 操作数栈   
            
          public int caculate(String str) {   
            // 1.判断string当中有没有非法字符   
            String temp;// 用来临时存放读取的字符   
            // 2.循环开始解析字符串,当字符串解析完,且符号栈为空时,则计算完成   
            StringBuffer tempNum = new StringBuffer();// 用来临时存放数字字符串(当为多位数时)   
            StringBuffer string = new StringBuffer().append(str);// 用来保存,提高效率   
            
            while (string.length() != 0) {   
              temp = string.substring(0, 1);   
              string.delete(0, 1);   
              // 判断temp,当temp为操作符时   
              if (!isNum(temp)) {   
                // 1.此时的tempNum内即为需要操作的数,取出数,压栈,并且清空tempNum   
                if (!"".equals(tempNum.toString())) {   
                  // 当表达式的第一个符号为括号   
                  int num = Integer.parseInt(tempNum.toString());   
                  numStack.push(num); 
                  tempNum.delete(0, tempNum.length());   
                }   
                // 用当前取得的运算符与栈顶运算符比较优先级:若高于,则因为会先运算,放入栈顶;若等于,因为出现在后面,所以会后计算,所以栈顶元素出栈,取出操作数运算;   
                // 若小于,则同理,取出栈顶元素运算,将结果入操作数栈。   
                // 判断当前运算符与栈顶元素优先级,取出元素,进行计算(因为优先级可能小于栈顶元素,还小于第二个元素等等,需要用循环判断)   
                while (!compare(temp.charAt(0)) && (!priStack.empty())) {  
                  int a = (int) numStack.pop();// 第二个运算数   
                  int b = (int) numStack.pop();// 第一个运算数   
                  char ope = priStack.pop();   
                  int result = 0;// 运算结果   
                  switch (ope) {   
                  // 如果是加号或者减号,则   
                  case '+':   
                    result = b + a;   
                    // 将操作结果放入操作数栈   
                    numStack.push(result);   
                    break;   
                  case '-':   
                    result = b - a;   
                    // 将操作结果放入操作数栈   
                    numStack.push(result);   
                    break;   
                  case '*':   
                    result = b * a;   
                    // 将操作结果放入操作数栈   
                    numStack.push(result);   
                    break;   
                  case '/':   
                    result = b / a;// 将操作结果放入操作数栈   
                    numStack.push(result);   
                    break;   
                  }   
            
                }   
                // 判断当前运算符与栈顶元素优先级, 如果高,或者低于平,计算完后,将当前操作符号,放入操作符栈   
                if (temp.charAt(0) != '#') {   
                  priStack.push(new Character(temp.charAt(0)));   
                  if (temp.charAt(0) == ')') {// 当栈顶为'(',而当前元素为')'时,则是括号内以算完,去掉括号   
                    priStack.pop();   
                    priStack.pop();   
                  }   
                }   
              } else  
                // 当为非操作符时(数字)   
                tempNum = tempNum.append(temp);// 将读到的这一位数接到以读出的数后(当不是个位数的时候)   
            }   
            return numStack.pop();   
          }   
            
          private boolean isNum(String temp) {   
            return temp.matches("[0-9]");   
          }   
            
          //比较当前操作符与栈顶元素操作符优先级,如果比栈顶元素优先级高,则返回true,否则返回false    
          private boolean compare(char str) {   
            if (priStack.empty()) {   
              // 当为空时,显然 当前优先级最低,返回高   
              return true;   
            }   
            char last = (char) priStack.lastElement();   
            // 如果栈顶为'('显然,优先级最低,')'不可能为栈顶。   
            if (last == '(') {   
              return true;   
            }   
            switch (str) {   
            case '#':   
              return false;// 结束符   
            case '(':   
              // '('优先级最高,显然返回true   
              return true;   
            case ')':   
              // ')'优先级最低,   
              return false;   
            case '*': {   
              // '*/'优先级只比'+-'高   
              if (last == '+' || last == '-')   
                return true;   
              else  
                return false;   
            }   
            case '/': {   
              if (last == '+' || last == '-')   
                return true;   
              else  
                return false;   
            }   
              // '+-'为最低,一直返回false   
            case '+':   
              return false;   
            case '-':   
              return false;   
            }   
            return true;   
          }
    }
    
    public class Aritmetic2 {
        
        static Operate oper = new Operate();
    
        public static void main(String[] args) {
            
            Scanner input = new Scanner(System.in);
            System.out.println("请输入要生成多少道四则运算题目?");
            int h = input.nextInt();
            String [] arr1 = new String[h];
            System.out.println("请输入随机数可产生的最大值:");
            int g = input.nextInt();
            System.out.println("请选择要求:");
            System.out.println("1加减法运算");
            System.out.println("2四则运算");
            Random random = new Random();
            char arr[] = {'+','-','*','/','('};
            
            int a=input.nextInt();
            switch(a){
               case 1:{
                  System.out.println("请选择数字类型:");
                  System.out.println("1整数");
                  System.out.println("2分数");
                  int m = input.nextInt();
                  switch(m)
                  {
                  case 1:
                  {
                      System.out.println("有无负数?");
                      System.out.println("1没有负数");
                      System.out.println("2有负数");
                      int f = input.nextInt(); 
                      int i;
                      switch(f)
                      {
                         case 1:
                         {
                             int n=0;
                             for(i=0;i<h;i++)
                             {
                                 String str1=random.nextInt(g)+""+arr[random.nextInt(2)]+""+random.nextInt(g);
                                 
                                 int t1 = oper.caculate(str1+'#');
                                 System.out.println(str1+'=');
                                 System.out.println("请输入答案:");
                                 int c = input.nextInt();
                                 if(c==t1)
                                 {
                                     System.out.println("正确!");
                                     n++;
                                 }
                                 else
                                 {
                                     System.out.println("错误!");
                                     System.out.println("答案是:"+t1);
                                 }
                             }
                                 System.out.println("一共答对"+n+"道题!");
                             break;
                         }
                         
                         case 2:
                         {
                             int n=0;
                             for(i=0;i<h;i++)
                             {
                                 int c1=random.nextInt(g);
                                 int c2=random.nextInt(g);
                                 char w1=arr[random.nextInt(2)];
                                 if(c1>c2){
                                     c1=random.nextInt(g);
                                     c2=random.nextInt(g);
                                 }
                                 String str2 = c1+""+w1+""+c2;
                                 System.out.println(str2+"=");
                                 int t2 = oper.caculate(str2+'#');
                                 System.out.println("请输入答案:");
                                 int c = input.nextInt();
                                 if(c==t2)
                                 {
                                     System.out.println("正确!");
                                     n++;
                                 }
                                 else
                                 {
                                     System.out.println("错误!");
                                     System.out.println("答案是:"+t2); 
                                 }
                             }
                             System.out.println("一共答对"+n+"道题!");
                             break;
                         }
                         
                         default:
                         {
                             System.out.println("输入错误,请输入1或2");
                         }
                         break;
                      }//switch(f)
                      break;
                  }//case1内
                  
                  case 2:
                  {
                      System.out.println("有无负数?");
                      System.out.println("1没有负数");
                      System.out.println("2有负数");
                         int f=input.nextInt();
                         switch(f)
                         {
                         case 1:
                         {
                             int n=0;
                             for(int i=0;i<h;i++)
                             {
                                 int c1 =random.nextInt(g);
                                 int c2 =random.nextInt(g)+1;
                                 int c3 =random.nextInt(g);
                                 int c4 =random.nextInt(g)+1;
                                 char w =arr[random.nextInt(2)];
                                 System.out.println(c1+"/"+c2+" "+w+" "+c3+"/"+c4+"=");
                                 System.out.println("请输入答案:");
                                 int t2,t3;
                                 String t1=new String();
                                 if(w=='+')
                                 {
                                      t2 = c2*c4;
                                       t3 = c1*c4+c3*c2;
                                       t1 = t3+"/"+t2;
                                 }
                                 else
                                 {
                                     t2 = c2*c4;
                                      t3 = c1*c4-c3*c2;
                                      t1 = t3+"/"+t2;
                                 }
                                 String c = input.next();
                                if(!c.equals(t1))
                                 {
                                     System.out.println("答案错误!");
                                     System.out.println("正确答案是:"+t1);
                                 }
                                 else
                                 {
                                     System.out.println("答案正确!");
                                     n++;
                                 }
                             }
                             System.out.println("一共答对"+n+"道题!");
                             break;
                         }
                         case 2:
                         {
                             int n=0;
                             for(int i=0;i<h;i++)
                             {
                                 int c1 =random.nextInt()%g;
                                 int c2 =random.nextInt(g)+1;
                                 int c3 =random.nextInt()%g;
                                 int c4 =random.nextInt(g)+1;
                                 char w =arr[random.nextInt(2)];
                                 System.out.println(c1+"/"+c2+" "+w+" "+c3+"/"+c4+"=");
                                 System.out.println("请输入答案:");
                                 int t2,t3;
                                 String t1=new String();
                                 if(w=='+')
                                 {
                                      t2 = c2*c4;
                                       t3 = c1*c4+c3*c2;
                                       t1 = t3+"/"+t2;
                                 }
                                 else
                                 {
                                     t2 = c2*c4;
                                      t3 = c1*c4-c3*c2;
                                      t1 = t3+"/"+t2;
                                 }
                                 String c = input.next();
                                if(!c.equals(t1))
                                 {
                                     System.out.println("错误!");
                                     System.out.println("正确答案是:"+t1);
                                 }
                                 else
                                 {
                                     System.out.println("正确!");
                                     n++;
                                 }
                             }
                             System.out.println("一共答对"+n+"道题!");
                             break;
                         }
                         default:
                             System.out.println("输入错误,请输入1或2");
                             break;
                         }
                        break;
                  }//case2内
                  }//switch(m)
                break;
               }//case1外
               
               case 2:
               {
                  System.out.println("请选择数字类型:");
                  System.out.println("1整数");
                  System.out.println("2分数");
                  int m = input.nextInt();
                  switch(m)
                  {
                  case 1:
                  {
                      System.out.println("请选择要求:");
                      System.out.println("1整数无余数四则运算");
                      System.out.println("2整数可有余数四则运算");
                      System.out.println("3多数带括号运算");
                      int f =input.nextInt();
                      switch(f)
                      {
                      case 1:
                      {
                           int n=0;
                             for(int i=0;i<h;i++)
                             {
                               String str3;
                             int u=random.nextInt(g);
                             int v=random.nextInt(g)+1;
                             char w=arr[random.nextInt(4)];
                             if(u%v==0 && w=='/')
                             {
                                 str3 =u+""+w+""+v;
                             }
                            else
                                str3 =u-(u%v)+""+w+""+v;
                             int t1 = oper.caculate(str3+'#');
                             System.out.println(str3+'=');
                             System.out.println("请输入答案:");
                             int c = input.nextInt();
                             if(c!=t1)
                             {
                                 System.out.println("错误!");
                                 System.out.println("答案是:"+t1);
                             }
                             else
                             {
                                 System.out.println("正确!");
                                 n++;
                             }
                             }
                           System.out.println("一共答对"+n+"道题!");
                             break;
                      }
                      
                      case 2:
                         {
                             int n=0;
                             for(int i=0;i<h;i++)
                             {
                                 int u=random.nextInt(g);
                                 int v=random.nextInt(g)+1;
                                 char w=arr[random.nextInt(4)];
                                 String str3 =u+" "+w+" "+v;
                                 int t1 = oper.caculate(str3+'#');
                                 System.out.println(str3+'=');
                                 System.out.println("请输入答案:");
                                 int c = input.nextInt();
                                 if(c!=t1)
                                 {
                                     System.out.println("答案错误!");
                                     System.out.println("正确答案是:"+t1);
                                 }
                                 else
                                 {
                                     System.out.println("答案正确!");
                                     n++;
                                 }
                             }
                             System.out.println("一共答对"+n+"道题!");
                             break;
                         }
                         
                      case 3:
                      {
                          int v=0;
                          for(int i=0;i<h;i++)
                          {
                              String str=new String();
                                int n =random.nextInt(9)+1;
                                Stack<Integer> S1 = new Stack<Integer>();
                                Stack<Character> S2 = new Stack<Character>();
                                for(int j=0;j<n+1;j++)
                                {    
                                    char w=' ';
                                    
                                    int e= random.nextInt(g)+1;
                                    if( w=='/'&&e==0)
                                    {
                                        e = random.nextInt(g)+1;
                                    }
                                    w = arr[random.nextInt(5)];
                                    S1.push(e);
                                    S2.push(w);
                                }
                                int k=0;
                                for(int j=0;j<n;j++)
                                {
                                    char s =  S2.pop();
                                    if(s=='(')
                                    {
                                        if(j>n-2)
                                            str =str+S1.pop()+""+arr[random.nextInt(4)];
                                        else
                                        {
                                            str =str+S1.pop()+""+arr[random.nextInt(4)]+""+s;
                                            k=k+1;
                                        }
                                    }
                                    else
                                        str =str+S1.pop()+""+ s;
                                }
                                if(k==0)
                                {
                                    str =str+(random.nextInt(g)+1);
                                }
                                else if(k==1)
                                    str=str+(random.nextInt(g)+1+")");
                                else if(k==2)
                                    str=str+(random.nextInt(g)+1+"))");
                                else if(k==3)
                                    str=str+(random.nextInt(g)+1+")))");
                                else
                                    str=str+(random.nextInt(g)+1+"))))");
                                 int t1 = oper.caculate(str+'#');
                                 System.out.println(str+'=');
                                 System.out.println("请输入答案:");
                                 int c = input.nextInt();
                                 if(c!=t1)
                                 {
                                     System.out.println("错误!");
                                     System.out.println("答案是:"+t1);
                                 }
                                 else
                                 {
                                     System.out.println("正确!");
                                     v++;
                                 }
                          }
                          System.out.println("共答对"+v+"道!");
                          break;
                      }
                         default:
                         {
                             System.out.println("输入错误,请输入1-3");
                         }
                         break;
                      }//switch(f)
                      break;
                  }//case1内
                  
                  case 2:
                  {
                        System.out.println("请选择要求:");
                        System.out.println("1正分数四则运算!");
                        System.out.println("2可负分数四则运算!");
                        int f=input.nextInt();
                         switch(f)
                         {
                         case 1:
                         {
                             int n=0;
                             for(int i=0;i<h;i++)
                             {
                                 int c1=random.nextInt(g);
                                 int c2=random.nextInt(g)+1;
                                 int c3=random.nextInt(g)+1;
                                 int c4=random.nextInt(g)+1;
                                 char w=arr[random.nextInt(4)];
                                 System.out.println(c1+"/"+c2+" "+w+" "+c3+"/"+c4+"=");
                                 System.out.println("请输入答案:");
                                 int t2,t3;
                                 String t1=new String();
                                 if(w=='+')
                                 {
                                      t2 = c2*c4;
                                       t3 = c1*c4+c3*c2;
                                       t1 = t3+"/"+t2;
                                 }
                                 else if(w=='-')
                                 {
                                     t2 = c2*c4;
                                      t3 = c1*c4-c3*c2;
                                      t1 = t3+"/"+t2;
                                 }
                                 else if(w=='*')
                                 {
                                     t2 = c2*c4;
                                      t3 = c1*c3;
                                      t1 = t3+"/"+t2;
                                 }
                                 else
                                 {
                                     t2 = c2*c3;
                                      t3 = c1*c4;
                                      t1 = t3+"/"+t2;
                                 }
                                 String c = input.next();
                                if(!c.equals(t1))
                                 {
                                     System.out.println("错误!");
                                     System.out.println("答案是:"+t1);
                                 }
                                 else
                                 {
                                     System.out.println("正确!");
                                     n++;
                                 }
                             }
                             System.out.println("一共答对"+n+"道题!");
                             break;
                         }
                         case 2:
                         {
                             int n=0;
                             for(int i=0;i<h;i++)
                             {
                                 int c1=-random.nextInt()%g;
                                 int c2=random.nextInt(g)+1;
                                 int c3=-random.nextInt()%g+1;
                                 int c4=random.nextInt(g)+1;
                                 char w=arr[random.nextInt(4)];
                                 System.out.println(c1+"/"+c2+" "+w+" "+c3+"/"+c4+"=");
                                 System.out.println("请输入答案:");
                                 int t2,t3;
                                 String t1=new String();
                                 if(w=='+')
                                 {
                                      t2 = c2*c4;
                                       t3 = c1*c4+c3*c2;
                                       t1 = t3+"/"+t2;
                                 }
                                 else if(w=='-')
                                 {
                                     t2 = c2*c4;
                                      t3 = c1*c4-c3*c2;
                                      t1 = t3+"/"+t2;
                                 }
                                 else if(w=='*')
                                 {
                                     t2 = c2*c4;
                                      t3 = c1*c3;
                                      t1 = t3+"/"+t2;
                                 }
                                 else
                                 {
                                     t2 = c2*c3;
                                      t3 = c1*c4;
                                      t1 = t3+"/"+t2;
                                 }
                                 String c = input.next();
                                if(!c.equals(t1))
                                 {
                                     System.out.println("错误!");
                                     System.out.println("答案是:"+t1);
                                 }
                                 else
                                 {
                                     System.out.println("正确!");
                                     n++;
                                 }
                             }
                             System.out.println("一共答对"+n+"道题!");
                             break;
                         }
                         default:
                             System.out.print("输入的数有误,请输入1或2");
                         }
                         break;
                    }//case2内
                  }
                  }//switch(m)
               }//case2外
            }//switch(a)
    
        }//起始

    运行截图:

     

     

     编程总结分析:

        对于这次代码的编写,不太好实现的就是对字符串的处理这一部分,把随机出来的运算题看作一个字符串,数字与运算符分别进入操作数栈和操作符栈,然后按照优先级高低进行计算,首次去括号,再将没有括号的算是进行计算,对于这个程序,代码里还是感觉比较繁琐,要输入的要求觉得还可以再精进一点。

    PSP0级记录表:

    • 项目计划日志:

    周活动总结表:

    日期:16/3/26        姓名:赵东睿

    日期任务 听课 编写程序 阅读书籍     日总计
    周日            
    周一 100 120       220
    周二   180       180
    周三     30     30
    周四            
    周五            
    周六   180+240       420
    周总计 100 720 30     850

    周数:第4周           阶段时间和效率

    总计 100 720 30     850
    平均 100 240 30      
    最大 100 420 30      
    最小 100 0 0      

    以前各周的累计时间

    总计 200 1220 150     1570
    平均 100 610 75     785
    最大 100 720 120     850
    最小 100 500 30     720

    事件记录日志:

    日期:16/3/26      学生:赵东睿

    课程:软件工程概论      教师:王建民

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/21 8:00 9:50 10 100 上课 课间休息
      14:00 16:00   120 编写代码  
    3/22 14:00 17:00   180 编写代码  
    3/23 19:00 19:30   30 阅读书籍  
    3/26 9:00 12:00   180 编写代码  
      13:00 17:00   240 编写代码  
                 
                 
                 

    工作照:

  • 相关阅读:
    KALI LINUX 工具大全---jd-gui(爪哇反编译器-图形界面)
    KAL1 LINUX 官方文档之政策---Kali Linux更新政策
    KAL1 LINUX 官方文档之政策---Kali Linux用户政策
    KAL1 LINUX 官方文档之社区---Kali Linux官方网站
    KAL1 LINUX 官方文档之社区---为kali做贡献
    KAL1 LINUX 官方文档之社区---官方Kali Linux镜像
    KAL1 LINUX 官方文档之kali开发---自定义 Beaglebone Black 镜像
    KAL1 LINUX 官方文档之kali开发---ARM交叉编译
    KAL1 LINUX 官方文档之kali开发---实时构建自定义的Kali ISO
    KAL1 LINUX 官方文档之kali开发---生成 更新的Kali ISO
  • 原文地址:https://www.cnblogs.com/lk0823/p/5323271.html
Copyright © 2011-2022 走看看