用java实现简易计算器

本篇参考了网上两篇资料尤其是栈推

Calculator类

package calframe;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Calculator extends JFrame implements Tetx{
    JPanel mianban;//面板
    JTextArea text;
    JButton j0,j1,j2,j3,j4,j5,j6,j7,j8,j9;
    JButton add,sqrt,subtract,mul,div,squ,cos,bot,deng,back,qing,sin,tan,yu;
    private Container panel;
    public Calculator()
    {
        this.setLayout(new BorderLayout());
j0=new JButton("0");j1=new JButton("1");j2=new JButton("2");j3=new JButton("3");j4=new JButton("4");
        j5=new JButton("5");
        j6=new JButton("6");
        j7=new JButton("7");
        j8=new JButton("8");
        j9=new JButton("9");
   
    bot=new JButton(".");
    bot.setForeground(Color.red);
    sqrt=new JButton("sqrt");
    sqrt.setForeground(Color.red);
    squ=new JButton("x^2");
    yu=new JButton("%");
    cos=new JButton("cos");
    cos.setForeground(Color.red);
    sin=new JButton("sin");
    sin.setForeground(Color.green);
    tan=new JButton("tan");
    tan.setForeground(Color.yellow);
    deng=new JButton("=");
   add=new JButton("+");
   subtract=new JButton("-");
   mul=new JButton("*");
   div=new JButton("/");
   qing=new JButton("c");
   qing.setForeground(Color.red);//设置按键颜色
   back=new JButton("back");
  //定义按钮
   
      text=new JTextArea(2,10);//文本域
      mianban=new JPanel();
     mianban.setLayout(new GridLayout(6,4));
     mianban.add(yu);mianban.add(cos);mianban.add(sin);mianban.add(tan);//面板上端第一行
     
     mianban.add(qing);mianban.add(div);mianban.add(mul);mianban.add(back);//面板上端第二行
     
     mianban.add(j7); mianban.add(j8); mianban.add(j9); mianban.add(subtract);
     
     mianban.add(j4);mianban.add(j5);mianban.add(j6);mianban.add(add);
     
     mianban.add(j1);mianban.add(j2);mianban.add(j3);mianban.add(sqrt);
     
     mianban.add(squ);mianban.add(j0);mianban.add(bot);mianban.add(deng);
     this.add(text,BorderLayout.NORTH);//把text放在最上方
        this.add(mianban);
     setVisible(true);//设置为可设置的
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     Event();//不同键触发的事件
    }
    
    public void Text(JButton button){
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                
                String str = button.getText();
                text.setText(text.getText()+str);
            }
        });    
    }
    private void Event() {    
      Text(j0);Text(j1);Text(j2);Text(j3); Text(j4); Text(j5); Text(j6);Text(j7);Text(j8);Text(j9);
      Text(bot);Text(add);Text(subtract);Text(mul); Text(div); Text(yu);//需要显示在文本域的按键
       
      cos.addActionListener(new ActionListener()
              {
                @Override
                public void actionPerformed(ActionEvent e) {    
                    String str=text.getText();
                    double n;
                    n=Double.parseDouble(str);
                    n=Math.cos(n*Math.PI/180);
                    text.setText(""+n);
                }
              }
              );
      sin.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e) {
            
            String str=text.getText();
            double n;
            n=Double.parseDouble(str);
            n=Math.sin(n*Math.PI/180);
            text.setText(""+n);
        }
      }
      );
      tan.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e) {    
            String str=text.getText();
            double n;
            n=Double.parseDouble(str);
            n=Math.tan(n*Math.PI/180);
            text.setText(""+n);
        }
      }
      );
      qing.addActionListener(new ActionListener()
              {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    text.setText("");
                }
              }
              );
      back.addActionListener(new ActionListener()//往后倒退一格
              {
          public void actionPerformed(ActionEvent arg0) {
                String str=text.getText(),ch;
                ch=str.substring(0, str.length()-1);//将其长度减1,即从0开始检索到-1位
              text.setText(""+ch);    
            }
              }
              );
      
      sqrt.addActionListener(new ActionListener()
              {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    
                    String str=text.getText();
                    double n;
                    n=Double.parseDouble(str);
                    n=Math.sqrt(n);//利用函数进行开方
                text.setText(""+n);
                }
              }
              );
      squ.addActionListener(new ActionListener()
              {

                //按钮事件
                public void actionPerformed(ActionEvent e) {
                    String str=text.getText();
                    double n;
                    n=Double.parseDouble(str);
                    n*=n;
                    text.setText(""+n);        
                }
              }
              );
    deng.addActionListener(new ActionListener()
            {
        public void actionPerformed(ActionEvent e)
        {
            String str=text.getText(),str0="";//利用str字符串存取text1内容
            char ch,c;
            int i=0,top1=-1,top2=-1,j=-1,flog=0,l,str1[]=new int[120];
            double  t,suz[]=new double[122],cha,cha1[]=new double[120];
            l=str.length();
            c=str.charAt(0);
            if(c=='-')
            {
                t=0;
                   suz[++top1]=t;
            }//如果第一个为负号就在前面加0
            for( i=0;i<l;i++)
            {
                ch=str.charAt(i);
                if(ch>='0'&&ch<='9'||ch=='.')//先保存一个数字
                {
                    str0=str0+ch;flog=1;//设计flog为1让接下来判断进行存数字
                }
                else
                {
                    if(flog==1)//把保存的数字字符串转成数字,并放入数字栈中
                    {
                       t=Double.parseDouble(str0);
                       suz[++top1]=t;
                       flog=0; str0="";//注意初始化
                    }
                    if(ch=='+'||ch=='-')//符号的优先级
                        cha=1;
                    else
                        cha=2;    //优先级更大
                    
                    if(top2>=0&&cha1[top2]>=cha)//满足条件时计算,满足此时的优先级大于之前的
                    {
                        if(str1[j]==1)
                            suz[top1-1]=suz[top1]+suz[top1-1];
                        if(str1[j]==2)
                            suz[top1-1]=suz[top1-1]-suz[top1];
                        if(str1[j]==3)
                            suz[top1-1]=suz[top1]*suz[top1-1];
                        if(str1[j]==4)
                            suz[top1-1]=suz[top1-1]/suz[top1];
                        top2--;top1--;
                        j--;i--;    
                    }
                    else
                    {
                    cha1[++top2]=cha;//把符号优先级大的放入符号栈中
                    if(ch=='+')
                        str1[++j]=1;// 把符号保存在符号栈中,1表示符号为+,下面同理
                    if(ch=='-')
                        str1[++j]=2;
                    if(ch=='*')
                        str1[++j]=3;
                    if(ch=='/')
                        str1[++j]=4;
                    if(ch=='%')
                        str1[++j]=5;
                     }
                    
                }
                
            }
            t=Double.parseDouble(str0);//最后一个是数字
               ++top1;suz[top1]=t;
               
               for(;j>=0;j--)//计算最后的结果
               {
                   if(str1[j]==1) 
                    suz[top1-1]=suz[top1]+suz[top1-1];
                if(str1[j]==2)
                    suz[top1-1]=suz[top1-1]-suz[top1];
                if(str1[j]==3)
                    suz[top1-1]=suz[top1]*suz[top1-1];
                if(str1[j]==4)
                    suz[top1-1]=suz[top1-1]/suz[top1];
                if(str1[j]==5)
                    suz[top1-1]=suz[top1-1]%suz[top1];
                top1--;
               }
               text.setText(""+suz[0]);
        }
            }
            );
    }
}

 

Main类可以自由定义

package calframe;

public class Demo {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Calculator Calculator = new Calculator();
        Calculator.setBounds(400, 300, 500, 400);
        Calculator.setTitle("XXX的计算器");
        
    }
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值