大家帮帮我看看这个啊!
http://expert.csdn.net/Expert/topic/1183/1183465.xml?temp=.6440546

解决方案 »

  1.   

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.lang.*;
    class a1
     {
       char[] OPTR;       //OPTR为运算符栈
       double[] OPND; 
       int len;                            //存放计算式的长度   
      public static void main(String args[]) throws Exception
       {
        new a1();
       }
     public a1()
     {
      useselect("计算器");
     }
      char comulatechar[]=new char[20];      //计算式 
      public void useselect(String select)
       {     
        if(select.equals("计算器"))
         {
           String inputValue=JOptionPane.showInputDialog(null,
          "请输入计算表达式","欢迎使用计算   器",JOptionPane.QUESTION_MESSAGE); 
           double result;
           len=inputValue.length();  
           OPTR=new char[len];
           OPND=new double[len];
           inputValue.getChars(0,len,comulatechar,0);
           comulatechar[len]='='; 
           result=operand();
           String message="计算结果为:"+result;
           Object[] endButton = {"结束程序","继续"};             //选择按钮项目
           JOptionPane end = new JOptionPane(message,JOptionPane.WARNING_MESSAGE,
           JOptionPane.DEFAULT_OPTION,null,endButton);
           //建立 JOptionPane 对象 end
           JDialog endD = end.createDialog(end,"输出结果");  //产生 endD 对话框
           endD.setVisible(true);             //显示 endD 对话框
           Object push = end.getValue();      //取得使用者按下的按钮
           if(push == endButton[0])
            {
             System.exit(0);                   //结束程序
            } 
           else if(push == endButton[1])
            {
             new a1();
            }   
         }
    }
         //OPND为运算数栈
    //   char fun[10][7];               //保存数学函数数组,以便比较
       int OPNDPop=0;                     //设置全局变量为运算数栈栈顶     
       char OPTRPop=0;                    //运算符栈
       int charlen=0;                   //当前读入字符的长度
    public  void initstack()  
    {
     for(int i=0;i<len;i++) 
      {
       System.out.println(OPTR.length+":"+len);
       OPND[i]=0;
       OPTR[i]=' ';
       String str1 =String.valueOf(OPND[i]);
          System.out.println(str1);
     } 
    }  
    public char Readchar()  //读入字符,忽略空格的输入
    {
    char ch;
    while((ch=comulatechar[charlen++])==' ');
    return(ch);
    }
    //把操作符压入栈顶     
    public void Pushchar(char x)  
    {OPTR[OPTRPop++]=x;}       //把操作符压入栈顶
    public void Pushnum(double x)        //由于0相当数字栈的NULL,因此不能象字符栈一样
    {OPND[OPNDPop++]=x;}                     //进行弹栈,否则象11-0的计算会得出-11的结果。
    public char Popchar(char OP[],char x)          //弹出栈顶操作符

      x=OP[--OPTRPop];
      OP[OPTRPop]=' ';
      return(x);
    }
    //弹出栈顶操作符
    public double Popnum(double OP[],double x)   
    {
     x=OP[--OPNDPop];
     OP[OPNDPop]=0;
     return(x);
    }
    //返回栈顶操作符
    public char GetTop(char OP[])             
    { int i=0;
     for(i=0;OP[i]>' ';i++);
     return(OP[--i]);
    }
    //返回栈顶操作数
    public double GetTop2(double OP[])       
    { int i=0;
     for(;OP[i]!=0;i++);
     return(OP[0]);
    }
    //接收两个操作数与运算符号,并返回运算值
    public double Operate(double a,char ch,double b)  
    {
    double midtotal=0;
    switch(ch)
    {
    case '+': midtotal=a+b; break;
    case '-': midtotal=a-b; break;
    case '*': midtotal=a*b; break;
    case '/': midtotal=a/b; break;
    default :System.exit(0);
    }
    return(midtotal);
    }
    //比较算符的优先级,返回比较值'<','=',或'>'
    char Precede1(char theta1,char theta2)  
    {
    char midchar=' ';
    switch(theta1)
    {
    case '+':
    case '-': switch(theta2)
    {
    case '+':
    case '-':
    case ')':
    case '=': midchar='>'; break;
    case '*':
    case '/':
    case '(': midchar='<'; break;
    default : System.exit(0);
    } break;
    case '*':
    case '/': switch(theta2)
    {
    case '+':
    case '-':
    case '*':
    case '/':
    case ')':
    case '=': midchar='>'; break;
    case '(': midchar='<'; break;
    default : System.exit(0);
    } break;
    case '(': switch(theta2)
    {
    case '+':
    case '-':
    case '*':
    case '/':
    case '(': midchar='<'; break;
    case ')': midchar='='; break;
    default : System.exit(0);
    } break;
    case ')': switch(theta2)
    {
    case '+':
    case '-':
    case '*':
    case '/':
    case ')':
    case '=': midchar='>'; break;
    default :System.exit(0);
    }
    break;
    case '=': switch(theta2)
    {
    case '+':
    case '-':
    case '*':
    case '/':
    case '(': midchar='<'; break;
    case '=': midchar='='; break;
    default :System.exit(0);
    } break;
    default :System.exit(0);
    }
    return(midchar);
    }
    //由算符比较后的返回值作相应的操作
    public char Precede2(char c) 
    {
    char theta=' ';
    double a=0,b=0;
    switch(Precede1(GetTop(OPTR),c))
    {
    case '<':
    Pushchar(c); c=Readchar();
    break;
    case '=':
    Popchar(OPTR,c); c=Readchar();
    break;
    case '>':
    theta=Popchar(OPTR,theta);
    b=Popnum(OPND,b); a=Popnum(OPND,a);
    Pushnum(Operate(a,theta,b));
    break;
    }
    return(c);
    }
    //把数字字符转化为数字
    public char Readnumber(char numchar)  
    {
    int i,scale=0;
    double numvalue=0;
    while (numchar>='0'&&numchar<='9')
    {
    numvalue=numvalue*10+(int)numchar-(int)'0';
    numchar=Readchar();
    }
    if (numchar=='.')
    {
    numchar=Readchar();
    while (numchar>='0'&&numchar<='9')
    {
    numvalue=numvalue*10+(int)numchar-(int)'0';
    numchar=Readchar();
    scale++;
    }
    }
    for(i=1;i<=scale;i++)
    numvalue=numvalue/10;
    if(numchar=='e'||numchar=='E')
    {
    int pointnum=0;
    numchar=Readchar();
    if(numchar<'0'||numchar>'9');// {exit(0);}
    while (numchar>='0'&&numchar<='9')
    {
    pointnum=pointnum*10+(int)numchar-(int)'0';
    numchar=Readchar();
    }
    for(i=1;i<=pointnum;i++) numvalue=numvalue*10;
    }
    if(numchar!='='&&numchar!='+'&&numchar!='-'&&
    numchar!='*'&&numchar!='/'&&numchar!=')'&&numchar!=',')
    {System.exit(0);}
    Pushnum(numvalue);
    return(numchar);
    }
    public double operand()   
    {
    initstack();
    char c; 
    c=Readchar();
    Pushchar('=');                  //在字符栈底压入=,既计算式的结束符
    while(c!='='||GetTop(OPTR)!='=')

    if(c>='0'&&c<='9') c=Readnumber(c);
    //else if(c>='a') c=function(c);     //字符的ASC码大于算符的ASC码,进入数学函数调用
    else
    c=Precede2(c);
    }
    return(GetTop2(OPND));
    }
        
     }
      

  2.   

    我刚学JAVA,以前编的计算器移植过来就发现了解决不了的错误,由于经验尚浅,让大家见笑了。望见晾,随便来和大家学点东西
      

  3.   

    为什么先声明再定义就不会出错,我也是声明了全局变量,为什么连初始化都不可以?错在什么地方?弄清了就结贴。
     dentance(登徒子) :可以交个朋友吗?希望能在其他方面也有个交流。
    我的QQ:48810406
      

  4.   

    在java里,是先初始化类变量,而你的len变量执行期才有值,故java让optr为null。