import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
public class calculator extends Applet implements ActionListener
{
TextField tf=new TextField(10);
Label lb=new Label("请输入算式!");
Label tst=new Label("");
SubFrm frm_btn;
String org;
Vector ins;
public void init()
{
this.setLayout(new BorderLayout(10,10));
this.setBackground(Color.gray);
this.setForeground(Color.blue);
frm_btn=new SubFrm();
frm_btn.setLayout(new GridLayout(7,3,5,2));
frm_btn.setBackground(Color.gray);
frm_btn.setForeground(Color.blue);
frm_btn.bt0.setBackground(Color.white);
frm_btn.bt1.setBackground(Color.white);
frm_btn.bt2.setBackground(Color.white);
frm_btn.bt3.setBackground(Color.white);
frm_btn.bt4.setBackground(Color.white);
frm_btn.bt5.setBackground(Color.white);
frm_btn.bt6.setBackground(Color.white);
frm_btn.bt7.setBackground(Color.white);
frm_btn.bt8.setBackground(Color.white);
frm_btn.bt9.setBackground(Color.white);
frm_btn.btpls.setBackground(Color.yellow);
frm_btn.btsub.setBackground(Color.yellow);
frm_btn.btmul.setBackground(Color.yellow);
frm_btn.btdiv.setBackground(Color.yellow);
frm_btn.btmod.setBackground(Color.yellow);
frm_btn.btpnt.setBackground(Color.orange);
frm_btn.btlef.setBackground(Color.green);
frm_btn.btrig.setBackground(Color.green);
frm_btn.btres.setBackground(Color.red);
frm_btn.btbeg.setBackground(Color.red);
frm_btn.btdel.setBackground(Color.red);
this.add("North",tf);
this.add("Center",lb);
tf.setEditable(false);
this.add("South",frm_btn);
frm_btn.add(frm_btn.bt1);
frm_btn.add(frm_btn.bt2);
frm_btn.add(frm_btn.bt3);
frm_btn.add(frm_btn.bt4);
frm_btn.add(frm_btn.bt5);
frm_btn.add(frm_btn.bt6);
frm_btn.add(frm_btn.bt7);
frm_btn.add(frm_btn.bt8);
frm_btn.add(frm_btn.bt9);
frm_btn.add(frm_btn.bt0);
frm_btn.add(frm_btn.btpls);
frm_btn.add(frm_btn.btsub);
frm_btn.add(frm_btn.btmul);
frm_btn.add(frm_btn.btdiv);
frm_btn.add(frm_btn.btmod);
frm_btn.add(frm_btn.btlef);
frm_btn.add(frm_btn.btrig);
frm_btn.add(frm_btn.btpnt);
frm_btn.add(frm_btn.btdel);
frm_btn.add(frm_btn.btres);
frm_btn.add(frm_btn.btbeg);
frm_btn.bt0.addActionListener(this);
frm_btn.bt1.addActionListener(this);
frm_btn.bt2.addActionListener(this);
frm_btn.bt3.addActionListener(this);
frm_btn.bt4.addActionListener(this);
frm_btn.bt5.addActionListener(this);
frm_btn.bt6.addActionListener(this);
frm_btn.bt7.addActionListener(this);
frm_btn.bt8.addActionListener(this);
frm_btn.bt9.addActionListener(this);
frm_btn.btpls.addActionListener(this);
frm_btn.btsub.addActionListener(this);
frm_btn.btmul.addActionListener(this);
frm_btn.btdiv.addActionListener(this);
frm_btn.btpnt.addActionListener(this);
frm_btn.btlef.addActionListener(this);
frm_btn.btrig.addActionListener(this);
frm_btn.btmod.addActionListener(this);
frm_btn.btdel.addActionListener(this);
frm_btn.btres.addActionListener(this);
frm_btn.btbeg.addActionListener(this);
resize(250,230);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==frm_btn.bt0)
tf.setText(tf.getText()+"0");
if(e.getSource()==frm_btn.bt1)
tf.setText(tf.getText()+"1");
if(e.getSource()==frm_btn.bt2)
tf.setText(tf.getText()+"2");
if(e.getSource()==frm_btn.bt3)
tf.setText(tf.getText()+"3");
if(e.getSource()==frm_btn.bt4)
tf.setText(tf.getText()+"4");
if(e.getSource()==frm_btn.bt5)
tf.setText(tf.getText()+"5");
if(e.getSource()==frm_btn.bt6)
tf.setText(tf.getText()+"6");
if(e.getSource()==frm_btn.bt7)
tf.setText(tf.getText()+"7");
if(e.getSource()==frm_btn.bt8)
tf.setText(tf.getText()+"8");
if(e.getSource()==frm_btn.bt9)
tf.setText(tf.getText()+"9");
if(e.getSource()==frm_btn.btpls)
tf.setText(tf.getText()+"+");
if(e.getSource()==frm_btn.btsub)
tf.setText(tf.getText()+"-");
if(e.getSource()==frm_btn.btmul)
tf.setText(tf.getText()+"*");
if(e.getSource()==frm_btn.btdiv)
tf.setText(tf.getText()+"/");
if(e.getSource()==frm_btn.btpnt)
tf.setText(tf.getText()+".");
if(e.getSource()==frm_btn.btlef)
tf.setText(tf.getText()+"(");
if(e.getSource()==frm_btn.btrig)
tf.setText(tf.getText()+")");
if(e.getSource()==frm_btn.btmod)
tf.setText(tf.getText()+"m");
if(e.getSource()==frm_btn.btdel)
{
if(tf.getText().length()!=0)
{
tf.setText((tf.getText()).substring(0,tf.getText().length()-1));
}
}
if(e.getSource()==frm_btn.btres)
{
tf.setText("");
lb.setText("请输入算式!");
}
if(e.getSource()==frm_btn.btbeg)
{
lb.setText("算式:"+tf.getText());
this.cal_proc();
}
}
public void cal_proc()
{
if(getAllEleAndCheck()==false)
{
tf.setText("您输入的算式有错误!");
}
else
{
if(doCalculate()==false)
{
tf.setText("计算中出现错误,请检查算式!");
}
}
}
public boolean getAllEleAndCheck()
{
int i,cnt,tag;
char curc,prec;
boolean preIsDig;
String org=new String(tf.getText());
ins=new Vector();
preIsDig=false;
tag=0;
cnt=0;;
for(i=0;i<org.length();i++)
{
curc=org.charAt(i);
if(i==0)
{
if((curc!='+')&&(curc!='-')&&
(curc!='*')&&(curc!='/')
&&(curc!='m')&&(curc!=')'))
{
if((curc!='('))
{
tag=i;
preIsDig=true;
}
else
{
preIsDig=false;
}
}
else if(curc=='-') //表达式中负数的处理
{
org="0"+org;
i--;
}
else return false;
}
else if(i==(org.length()-1))
{
prec=org.charAt(i-1);
if(curc=='.') return false;
if((curc=='+')||(curc=='-')||(curc=='*')
||(curc=='/')||(curc=='m'))
return false;
if(curc=='(') return false;
if(curc==')')
{
if(preIsDig)
{
ins.addElement(org.substring(tag,i));
ins.addElement(")");
}
else if(prec==')')
{
ins.addElement(")");
}
else return false;
}
else
{ if(preIsDig)
{
ins.addElement(org.substring(tag,i+1));
}
else ins.addElement(org.substring(i,i+1));
}
}
else
{
prec=org.charAt(i-1);
if(curc=='.')
{
if((prec=='.')||(prec==')'))
return false;
else
{
if(preIsDig==false)
{
tag=i;
}
preIsDig=true;
}
}
else if(prec=='('&&curc=='-') //负数出现
{
ins.addElement("(");
tag=i;
preIsDig=true;
}
else
{
if((curc=='+')||(curc=='-')||(curc=='*')
||(curc=='/')||(curc=='m'))
{
if((prec=='.')
||((preIsDig==false)&&(prec)!=')')
||(prec=='('))
return false;
else if(preIsDig||(prec==')'))
{
if(preIsDig)
{
ins.addElement(org.substring(tag,i));
ins.addElement(org.substring(i,i+1));
}
else
{
ins.addElement(org.substring(i,i+1));
}
preIsDig=false;
}
else return false;
}
else if(curc==')')
{
if(prec=='(') return false;
else if(preIsDig)
{
ins.addElement(org.substring(tag,i));
ins.addElement(")");
preIsDig=false;
}
else if(prec==')')
{
ins.addElement(")");
}
else return false;
}
else if((curc=='('))
{
if(preIsDig) return false;
if(prec=='.') return false;
if(prec==')') return false;
if(prec=='(')
ins.addElement("(");
preIsDig=false;
}
else
{
if(preIsDig==false)
{
if(prec==')') return false;
tag=i;
}
if(prec=='(')
ins.addElement("(");
preIsDig=true;
}
}
}
}
for(i=0;i<ins.si