⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calu.java

📁 运用JAVA语言和数据结构制作的windows界面类型的表达式计算器!
💻 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 + -