📄 calu.java
字号:
import java.awt.*;
import java.awt.event.*;
class calu extends WindowAdapter implements ActionListener
{
Frame f;
MenuBar mb;
Menu mf,me,mh;
CheckboxMenuItem cbm;
Panel l2,l1;
TextField t;
Button b[]=new Button[20];
String op[]={" + "," - "," * "," / "," = ",
" ( "," ) "," . ","Back","clear",
"MR","MR","MR","MR"
};
char a[]={'+','-','*','/','(',')','#'};
int il,l,r;
boolean state=true,eror[]={false,false,false};
final int PLUS=0;
final int MINUS=1;
final int POWER=2;
final int DIVIDE=3;
final int LEFTP=4;
final int RIGHP=5;
final int STARTEND=6;
final int DIGIT=7;
final int PONT=8;
final int NUM=7;
final int NO=32767;
final int STACKSIZE=20;
int PriorityTable[][]={{ 1, 1,-1,-1,-1, 1, 1},
{ 1, 1,-1,-1,-1, 1, 1},
{ 1, 1, 1, 1,-1, 1, 1},
{ 1, 1, 1, 1,-1, 1, 1},
{-1,-1,-1,-1,-1, 0, NO},
{ 1, 1, 1, 1,NO, 1, 1},
{-1,-1,-1,-1,-1,NO, 0}
};
double result;
public void display ()
{
f= new Frame("计算器");
f.setSize(250,200);
f.setLocation(400,200);
f.setBackground(Color.lightGray);
f.addWindowListener(this);
f.setVisible(true);
setMenu();
setPanel();
}
public void setPanel()
{
t=new TextField (30);
t.setEditable(false);
l1=new Panel ();
l2=new Panel ();
l2.add(t);
f.add(l2,"North");
f.add(l1,"Center");
l1.setLayout(new GridLayout(3,10));
//添加0-9数字按钮
for(il=0;il<=9;il++)
{
String l=" "+String.valueOf(il)+" ";
b[il]=new Button(l);
l1.add(b[il]);
b[il].addActionListener(this);
}
for(;il<20;il++)
{
b[il]=new Button(String.valueOf(op[il-10]));
l1.add(b[il]);
b[il].addActionListener(this);
}
}
public void setMenu()
{
mb=new MenuBar();
f.setMenuBar(mb);
mf=new Menu("文件");
me=new Menu("编辑");
mh=new Menu("帮助");
mb.add(mf);
mb.add(mh);
mf.add(new MenuItem ("保存",new MenuShortcut(KeyEvent.VK_S)));
mf.addSeparator();
mf.add(me);
cbm=new CheckboxMenuItem ("删除",true);
mf.add(cbm);
mf.add(new MenuItem("退出"));
mf.addActionListener(this);
me.add(new MenuItem("剪切"));
me.add(new MenuItem("退出"));
me.addActionListener(this);
mh.addActionListener(this);
}
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
public void actionPerformed(ActionEvent e)
{
char x;
String s=e.getActionCommand();
if(s=="退出")System.exit(0);
else
{
t.setText((t.getText()).trim());
String s1=t.getText();
if(s1.length()>0)
x=s1.charAt(s1.length()-1);
else x='0';
Object e1=e.getSource();
if(e1==b[14]&&state==true)
{
state=false;
t.setText(t.getText()+"=");
char str[]=getarray();
if(EXCUTE(str)==0)
{
if(eror[0])
t.setText("第二操作数不能为0");
else if(eror[1])
t.setText("括号不匹配");
else if(eror[2])
t.setText("l="+String.valueOf(l)+"r="+String.valueOf(r)+"第一个字符不能为操作符");
else
t.setText("表达式输入错误");
return;
}
else
t.setText(t.getText()+result);
return;
}
if(!((x=='+'||x=='-'||x=='*'||x=='/'||x=='.')&&
(e1==b[10]||e1==b[11]||e1==b[12]||e1==b[13]||e1==b[17]))&&e1!=b[14]&&state==true)
{
for(il=0;il<=17;il++)
if(e1==b[il])
{
t.setText(t.getText()+b[il].getLabel().trim());
}
}
if(e1==b[18])
{
if((t.getText()).length()>=1)
t.setText((t.getText()).substring(0,(t.getText()).length()-1));
else return;
}
if(e1==b[19])
{
t.setText("");
state=true;
return;
}
}
}
public void mousePressed(MouseEvent mep){}
public void mouseReleased(MouseEvent mer){}
public void mouseEntered(MouseEvent mee){}
public void mouseExited(MouseEvent mex){}
public void mouseDragged(MouseEvent med){}
public char[] getarray()
{
StringBuffer sb=new StringBuffer((t.getText()).trim());
sb.insert(0,'#');
sb.setCharAt(sb.length()-1,'#');
String sx=new String(sb);
char str[]=(sx.toCharArray());
return str;
}
int GetCharType(char ch)
{ int i;
for(i=0;i<NUM;i++) if(ch==a[i]) return(i);
if(ch>='0' && ch<='9') return(DIGIT);
if(ch=='.') return(PONT);
return(-1);
}
double yunsuan(int i,double j,double k)
{
double m=0;
if(i==0) m=j+k;
else if(i==1) m=j-k;
else if(i==2) m=j*k;
else if(i==3) m=j/k;
return m;
}
int EXCUTE(char str [])
{
l=r=0;
int i=1;
while(str[i]!='#')
{
if(str[i]=='(') l++;
else if(str[i]==')') r++;
i++;
}
if(l!=r)
{
eror[1]=true;return 0;
}
int pp,strlength,topTr,topNd,CharType,OPTR[]=new int [20];
double number,temp,OPND[]=new double [20];
OPTR[0]=STARTEND;
topTr=0;
topNd=0;
pp=0;
CharType=GetCharType(str[1]);
if (!(CharType==DIGIT||(CharType==LEFTP&&l==r)))
{
eror[2]=true;
return 0;
}
while(str[pp]!='\0')
{
CharType=GetCharType(str[pp]);
switch(CharType)
{
case -1:
return(0);
case DIGIT:
number=0;
while(str[pp]>='0' && str[pp]<='9')
{
number=number*10+(str[pp]-48);
pp++;
}
if(str[pp]=='.')
{
temp=10.0;
pp++;
while(str[pp]>='0' && str[pp]<='9')
{
number=number+(str[pp]-48)/temp;
temp=temp*10;
pp++;
}
}
OPND[topNd]=number;
topNd++;
break;
case PONT:
number=0;
temp=10.0;
pp++;
while(str[pp]>='0' && str[pp]<='9')
{
number=number+(str[pp]-48)/temp;
temp=temp*10;
pp++;
}
OPND[topNd]=number;
topNd++;
break;
case PLUS:
case MINUS:
case POWER:
case DIVIDE:
if(PriorityTable[OPTR[topTr-1]][GetCharType(str[pp])]==-1)
{ //栈顶运算符优先级低于当前运算符,则当前运算符入栈
OPTR[topTr]=GetCharType(str[pp]);
topTr++;
pp++;
}
else if (PriorityTable[OPTR[topTr-1]][GetCharType(str[pp])]==1)
{
/*结果返回1,则从操作数运算符堆栈中POP两个数值,
*作为操作数以当前运算符进行运算,并把运算结果存储到操作
*数堆栈中
*/
if(OPTR[topTr-1]==3&&OPND[topNd-1]==0)
/*运算时,需要检查当前栈顶运算符是否为除法符号
* 如果是:则需要检查操作数堆栈的栈顶元素是否0,如果为
*0,则返回错误信息,并结束运算,如果不为0,则进行数值运算
*/
{ eror[0]=true;
return 0;
}
OPND[topNd-2]=yunsuan(OPTR[topTr-1],OPND[topNd-2],OPND[topNd-1]);
topNd--;
topTr--;
}
break;
case LEFTP:
OPTR[topTr]=4;
topTr++;
pp++;
break;
case RIGHP:
if(OPTR[topTr-1]==4)
{
topTr--;
l--;//左括号计数器自减一
r--;//左括号计数器自减一
}
else if(OPTR[topTr-1]!=6)
{
while(OPTR[topTr-1]!=4)
{
if(OPTR[topTr-1]==3&&OPND[topNd-1]==0)
{
eror[0]=true;
return 0;
}
if(l==r)//右括号计数器值相等时,才能进行运算
{
OPND[topNd-2]=yunsuan(OPTR[topTr-1],OPND[topNd-2],OPND[topNd-1]);
topNd--;
/*
*如果操作符堆栈“次栈顶”存储的是左括号,则说明,此次数值运算的左边界
*是左括号形如(2+3),说明左右括号已经相遇一次,此时在运算完毕时,应该
*将在左右括号计数器的值都自减一
*/
if(OPTR[topTr-2]==4)
{
r--;
l--;
}
topTr--;
}
else
{
//eror[1]=true;
return 0;
}
}
topTr--;
}
else
{
System.out.println("eror");
return 0;
}
pp++;
break;
case STARTEND:
if( pp==0)
{
OPTR[topTr]=6;
topTr++;
pp++;
}
else
{
while(OPTR[topTr-1]!=6)
{
if(OPTR[topTr-1]==3&&OPND[topNd-1]==0)
{
eror[0]=true;
return 0;}
OPND[topNd-2]=yunsuan(OPTR[topTr-1],OPND[topNd-2],OPND[topNd-1]);
topNd--;
topTr--;
}
result=OPND[topNd-1];
return(1);
}
}
}
return(1);
}
public static void main(String arg[])
{
( new calu()).display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -