软件工程个人作业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 编写代码  
             
             
             

工作照:

 

 

posted @ 2016-03-26 16:39  mrferry  阅读(119)  评论(0编辑  收藏  举报