帮我解决这个问题给80~~~~~~~~`至少 大家帮帮我看看这个啊!http://expert.csdn.net/Expert/topic/1183/1183465.xml?temp=.6440546 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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码,进入数学函数调用elsec=Precede2(c);}return(GetTop2(OPND));} } 我刚学JAVA,以前编的计算器移植过来就发现了解决不了的错误,由于经验尚浅,让大家见笑了。望见晾,随便来和大家学点东西 为什么先声明再定义就不会出错,我也是声明了全局变量,为什么连初始化都不可以?错在什么地方?弄清了就结贴。 dentance(登徒子) :可以交个朋友吗?希望能在其他方面也有个交流。我的QQ:48810406 在java里,是先初始化类变量,而你的len变量执行期才有值,故java让optr为null。 linux下如何查看一个类在哪个jar包里面 swing布局的问题 在jface里面,如何把action关联到button中? 什么是动态加载,什么是动态运行 出学者问题 请大家帮助 关于java程序里面大小写问题,想请教大家 [Good News]IBM WebSphere Studio Application Developer 5.1推出啦!!! 数字的四舍五入问题 那位高手能给我讲解一下各layout的区别???? JAVA多线程生产者和消费者问题的两种写法(一种出错了) 怎样设定一个JButton的大小啊? 哪位仁兄有《Think In Java》中英文版电子文档吗?
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));
}
}
dentance(登徒子) :可以交个朋友吗?希望能在其他方面也有个交流。
我的QQ:48810406