使用JAVA图形用户界面实现计算器

利用java实现一个计算器能够实现加减乘除,并设置优先级(不带括号)

package 计算器;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.*;

public class Jisuanqi extends JFrame implements ActionListener{
	
	//设置成员变量
	JPanel jpanel1,jpanel2;
	JTextField text1,text2;

	public Jisuanqi() {
		//设置框架大小、位置、关闭方式、标题名称
		super("这是一个计算器");
		this.setSize(600, 450);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		//为按钮开辟空间并且为按钮的文字进行定义
		String[] str= {"0","1","2","3","4","5","6","7","8","9","+","-","*","/","√ ̄","AC","<-","^","=","close"};
		JButton[] button=new JButton[20];
		//实例两个面板并将其布局设置为网格布局
		jpanel1=new JPanel(new GridLayout(2,1));
		jpanel2=new JPanel(new GridLayout(5,4));
		//设置文本框内文字的字体大小
		Font font = new Font("Verdana", Font.BOLD, 15);
		//设置两个文本框长度,高度,添加监听,设置为不可编辑,并设置字体颜色
		text1=new JTextField();
		text2=new JTextField();
		text1.setPreferredSize(new Dimension (20,40)); 
		text1.setHorizontalAlignment(SwingConstants.RIGHT);
        text1.setFont(font);
        text2.setFont(font);
		text1.addActionListener(this);
		text2.addActionListener(this);
		text1.setEnabled(false);
		text1.setDisabledTextColor(Color.BLUE);
		//将各个组件添加到面板上
		jpanel1.add(text1);
		jpanel1.add(text2);
		for(int i=0;i<str.length;i++) {
			button[i]=new JButton(str[i]);
			jpanel2.add(button[i]);
			button[i].addActionListener(this);
		}
		//将框架的布局设置为边布局,防止组件乱动,并将两个面板添加到窗口上
		this.setLayout(new BorderLayout());
		this.getContentPane().add(jpanel1,BorderLayout.NORTH);
		this.getContentPane().add(jpanel2,BorderLayout.CENTER);
		//设置可见
		this.setVisible(true);
	}
	
	public static void main(String[] args) {
		// 实例对象
		new Jisuanqi();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// 按键输入
		if(e.getSource() instanceof JButton) {
			text1.setText(text1.getText()+e.getActionCommand());
		}
		//取得结果,并将其设置为4为小数
		if(e.getActionCommand().equals("=")) {
			String a=text1.getText();
			Yunsuan2 yunsuan2=new Yunsuan2(a);
			double result1=yunsuan2.result;
			if(yunsuan2.flag==0) {
				text2.setText("除数不可为0");
			}
			else {
				DecimalFormat df=new DecimalFormat("0.0000");
				text2.setText(df.format(result1));
			}	
		}
		//清除功能
		if(e.getActionCommand().equals("AC")) {
			text1.setText("");
			text2.setText("");
		}
		//删除单个字符
		if(e.getActionCommand().equals("<-")) {
			String a=text1.getText();
			a=a.substring(0, a.length()-3);
			text1.setText(a);
		}
		//关闭计算器
		if(e.getActionCommand().equals("close")) {
			System.exit(0);
		}
	}
}
class Yunsuan2{
	String zhongzhui[]=new String[100];
	String houzhui[]=new String[100];
	String fuhao[]=new String[100];
	double Stack[]=new double[100];
	
	int x=0; //标记中缀字符串数组
	int y=0; //标记后缀字符串数组
	int z=0; //标记符号字符串数组
	int n=0;//标记计算栈字符串数组
	int flag=1;//标记输入是否合法
	double result=0;
	public Yunsuan2(String a) {
		if(a.charAt(0)=='√') {
			int i=2;
			for(;a.charAt(i)>='0'&&a.charAt(i)<='9';i++) {
			}
			//记录第一个数字的位置
			int j=i-1;
			if(a.charAt(i)=='=') {
				String first=a.substring(2, j+1);
				this.result=Math.sqrt(Double.parseDouble(first));
			}
		}
		else {
			this.Zhong(a);
			this.Hou();
			this.Suan();
		}
		
	}
	public void Zhong(String a) {
		//初始化字符串数组
		for(int i=0;i<zhongzhui.length;i++)
			zhongzhui[i]=new String();
		//将字符串存储为中缀表达式
		for(int i=0;i<a.length();i++) {
			char c=a.charAt(i);
			if(c>='0'&&c<='9') {
				int j=i;
				char c1=a.charAt(i);
				while(c1>='0'&&c1<='9') {
					j++;
					c1=a.charAt(j);
				}
				zhongzhui[x]=a.substring(i, j);
				x++;
				i=j-1;
			}
			if(c=='+'||c=='-'||c=='*'||c=='/'||c=='^') {
				zhongzhui[x]=String.valueOf(c);
				x++;
			}
		}
	}
	public void Hou() {
		//初始化字符串数组
		for(int i=0;i<houzhui.length;i++)
			houzhui[i]=new String();
		for(int i=0;i<fuhao.length;i++)
			fuhao[i]=new String();
		for(int i=0;i<this.x;i++) {
			if(zhongzhui[i].charAt(0)>='0'&&zhongzhui[i].charAt(0)<='9') {
				houzhui[y]=zhongzhui[i];
				y++;
			}
			if(zhongzhui[i].charAt(0)=='+'||zhongzhui[i].charAt(0)=='-'||zhongzhui[i].charAt(0)=='*'||zhongzhui[i].charAt(0)=='/'||zhongzhui[i].charAt(0)=='^') {
				if(z==0) {
					fuhao[z]=zhongzhui[i];
					z++;
				}
				else {
					while(true) {
						int a1,b1;//用来存储优先级别
						a1=this.Pan(zhongzhui[i].charAt(0));//存储当前符号优先级
						b1=this.Pan(fuhao[z-1].charAt(0));//存储栈顶符号优先级
						if(a1>b1) {
							fuhao[z]=zhongzhui[i];
							z++;
							break;
						}
						else {
							houzhui[y]=fuhao[z-1];
							y++;
							if(z>1) {
								z--;
								continue;
							}
							else {
								fuhao[z-1]=zhongzhui[i];
								break;
							}
						}
					}
				}
			}
		}
		z=z-1;
		while(z>=0) {
			houzhui[y]=fuhao[z];
			z--;
			y++;
		}	
	}
	public int Pan(char b) {
		switch(b) {
			case '+':
			case '-':
				return 1;
			case '*':
			case '/':
				return 2;
			case '^':
				return 3;
			default:
				return 0;
		}
	}
	public void Suan() {
		for(int i=0;i<this.y;i++) {
			if(houzhui[i].charAt(0)>='0'&&houzhui[i].charAt(0)<='9') {
				Stack[n]=Double.parseDouble(houzhui[i]);
				n++;
			}
			if(houzhui[i].charAt(0)=='+') {
				double c=Stack[n-1]+Stack[n-2];
				Stack[n-2]=c;
				n=n-1;
			}
			if(houzhui[i].charAt(0)=='-') {
				double c=Stack[n-2]-Stack[n-1];
				Stack[n-2]=c;
				n=n-1;
			}
			if(houzhui[i].charAt(0)=='*') {
				double c=Stack[n-1]*Stack[n-2];
				Stack[n-2]=c;
				n=n-1;
			}
			if(houzhui[i].charAt(0)=='/') {
				if(Stack[n-1]==0)
					flag=0;
				double c=Stack[n-2]/Stack[n-1];
				Stack[n-2]=c;
				n=n-1;
			}
			if(houzhui[i].charAt(0)=='^') {
				double c=Math.pow(Stack[n-2], Stack[n-1]);
				Stack[n-2]=c;
				n=n-1;
			}
		}
		this.result=Stack[n-1];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值