多功能计算器(算式表达式求值)

//java的人机界面计算器也做出来了,根据上次写的C++的计算器改的,超级有成就感,所以要记录一下,防止丢失,代码乱是乱了点,因为我把他们全部通通写进了main方法里面,省的函数调用来调用去的。不过能运行出来就是好的,嘿嘿,唯一美中不足的就是计算负数要加括号,这就很难受了

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class 人机界面计算器{
	public static void main(String [] args) {
		JFrame frm = new JFrame("计算器");
		JTextArea text = new JTextArea();
		text.setEditable(true);
		text.setBackground(Color.WHITE);
		frm.setLayout(null);
		frm.setBounds(800, 200, 460, 560);
		frm.setVisible(true);
		JButton btn0=new JButton("1");
		JButton btn1=new JButton("2");
		JButton btn2=new JButton("3");
		JButton btn3=new JButton("4");
		JButton btn4=new JButton("5");
		JButton btn5=new JButton("6");
		JButton btn6=new JButton("7");
		JButton btn7=new JButton("8");
		JButton btn8=new JButton("9");
		JButton btn9=new JButton("0");
		JButton btn10=new JButton(".");
		JButton btn11=new JButton("^");
		JButton btn12=new JButton("sin");
		JButton btn13=new JButton("cos");
		JButton btn14=new JButton("tan");
		JButton btn15=new JButton("log");
		JButton btn16=new JButton("+");
		JButton btn17=new JButton("-");
		JButton btn18=new JButton("×");
		JButton btn19=new JButton("÷");
		JButton btn20=new JButton("(");
		JButton btn21=new JButton(")");
		JButton btn22=new JButton("=");
		frm.add(text);
		frm.add(btn0);
		frm.add(btn1);
		frm.add(btn2);
		frm.add(btn3);
		frm.add(btn4);
		frm.add(btn5);
		frm.add(btn6);
		frm.add(btn7);
		frm.add(btn8);
		frm.add(btn9);
		frm.add(btn10);
		frm.add(btn11);
		frm.add(btn12);
		frm.add(btn13);
		frm.add(btn14);
		frm.add(btn15);
		frm.add(btn16);
		frm.add(btn17);
		frm.add(btn18);
		frm.add(btn19);
		frm.add(btn20);
		frm.add(btn21);
		frm.add(btn22);
		text.setBounds(50, 10, 340, 50);
		Font f = new Font("黑体", Font.BOLD,40);
		text.setFont(new Font("黑体",Font.BOLD,22));
		text.setEditable(false);
		text.setLineWrap(true);
		text.setWrapStyleWord(true);
		btn0.setBounds(50, 70, 60, 50);
		btn0.setFont(f);
		btn0.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("1");
			}
			
		});
		btn1.setBounds(130, 70, 60, 50);
		btn1.setFont(f);
		btn1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("2");
			}
			
		});
		btn2.setBounds(210, 70, 60, 50);
		btn2.setFont(f);
		btn2.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("3");
			}
			
		});
		btn3.setBounds(50, 140, 60, 50);
		btn3.setFont(f);
		btn3.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("4");
			}
			
		});
		btn4.setBounds(130, 140, 60, 50);
		btn4.setFont(f);
		btn4.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("5");
			}
			
		});
		btn5.setBounds(210, 140, 60, 50);
		btn5.setFont(f);
		btn5.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("6");
			}
			
		});
		btn6.setBounds(50, 210, 60, 50);
		btn6.setFont(f);
		btn6.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("7");
			}
			
		});
		btn7.setBounds(130, 210, 60, 50);
		btn7.setFont(f);
		btn7.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("8");
			}
			
		});
		btn8.setBounds(210, 210, 60, 50);
		btn8.setFont(f);
		btn8.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("9");
			}
			
		});
		btn9.setBounds(130, 280, 60, 50);
		btn9.setFont(f);
		btn9.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("0");
			}
			
		});
		btn10.setBounds(50, 280, 60, 50);
		btn10.setFont(f);
		btn10.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append(".");
			}
			
		});
		btn11.setBounds(210, 280, 60, 50);
		btn11.setFont(f);
		btn11.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("^");
			}
			
		});
		btn12.setBounds(50, 350, 100, 50);
		btn12.setFont(f);
		btn12.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("sin(");
			}
			
		});
		btn13.setBounds(170, 350, 100, 50);
		btn13.setFont(f);
		btn13.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("cos(");
			}
			
		});
		btn14.setBounds(50, 420, 100, 50);
		btn14.setFont(f);
		btn14.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("tan(");
			}
			
		});
		btn15.setBounds(170, 420, 100, 50);
		btn15.setFont(f);
		btn15.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("log");
			}
			
		});
		btn16.setBounds(290, 70, 100, 50);
		btn16.setFont(f);
		btn16.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("+");
			}
			
		});
		btn17.setBounds(290, 140, 100, 50);
		btn17.setFont(f);
		btn17.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("-");
			}
			
		});
		btn18.setBounds(290, 210, 100, 50);
		btn18.setFont(f);
		btn18.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("×");
			}
			
		});
		btn19.setBounds(290, 280, 100, 50);
		btn19.setFont(f);
		btn19.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("÷");
			}
			
		});
		btn20.setBounds(290, 350, 45, 50);
		btn20.setFont(new Font("黑体",Font.BOLD,20));
		btn20.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append("(");
			}
			
		});
		btn21.setBounds(345, 350, 45, 50);
		btn21.setFont(new Font("黑体",Font.BOLD,20));
		btn21.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				text.append(")");
			}
			
		});
		btn22.setBounds(290, 420, 50, 50);
		btn22.setFont(new Font("黑体",Font.BOLD,25));
		btn22.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				int Maxsize = 100;//定义数组大小
				char[] optr=new char[Maxsize];//定义optr数组,用来存放后缀表达式
				Stack<Character> Optr = new Stack<Character>();//产生栈对象Optr,用来存放运算符
				String a = null;
				a=text.getText().toString();
				String m = "("+a+")";
				char[] measure=m.toCharArray();//转换输入的字符串为数组
				int j = 0;
				 int i = 0;
				 //中缀表达式转后缀表达式
				while(i<measure.length) {
					switch(measure[i]) {
					case '(':
						Optr.push(measure[i]);
						i++;
						break;
					case ')':
						while(Optr.peek()!='(') {
							optr[j++]=Optr.peek();
							Optr.pop();
						}
						Optr.pop();
						i++;
						break;
					case '+':
						while(!Optr.isEmpty()) {
							if(Optr.peek()!='(') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else 
								break;
						}
						Optr.push(measure[i]);
						i++;
						break;
					case '-':
						if(measure[i-1]<'0'||measure[i-1]>'9') {//表示-前面不是数字,即此处-表示单目运算符
							while(!Optr.isEmpty()) {
								if(Optr.peek()=='*'||Optr.peek()=='/') {
									optr[j++]=Optr.peek();
									Optr.pop();
								}
								else break;
							}
							Optr.push('~');
							i++;
							break;
						}
						else {
						while(!Optr.isEmpty()) {
							if(Optr.peek()!='(') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else 
								break;
						}
						Optr.push(measure[i]);
						i++;
						break;}
					case 'l':
						while(!Optr.isEmpty()) {
							if(Optr.peek()=='l') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else break;
						}
						Optr.push(measure[i]);
						i+=3;
						break;
					case 'c':
						while(!Optr.isEmpty()) {
							if(Optr.peek()=='c') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else break;
						}
						Optr.push(measure[i]);
						i+=3;
						break;
					case 's':
						while(!Optr.isEmpty()) {
							if(Optr.peek()=='s') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else break;
						}
						Optr.push(measure[i]);
						i+=3;
						break;
					case 't':
						while(!Optr.isEmpty()) {
							if(Optr.peek()=='t') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else break;
						}
						Optr.push(measure[i]);
						i+=3;
						break;
					case '^':
						while(!Optr.isEmpty()) {
							if(Optr.peek()=='^') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else break;
						}
						Optr.push(measure[i]);
						i++;
						break;
					case '×':
					case '÷':
						while(!Optr.isEmpty()) {
							
							if(Optr.peek()=='×'||Optr.peek()=='÷') {
								optr[j++]=Optr.peek();
								Optr.pop();
							}
							else break;
						}
						Optr.push(measure[i]);
						i++;
						break;
						default:
							while(measure[i]>='0'&&measure[i]<='9'||measure[i]=='.') {
								optr[j++]=measure[i];
								i++;
							}
							optr[j++]='#';
							break;
							}
					}
				while(!Optr.isEmpty()) {
					optr[i++]=Optr.peek();
					Optr.pop();
				}

				//后缀表达式求值
				int q=1;
				Stack<Double> Opnd = new Stack<Double>();//存放操作数
				int n = 0;
				int w;
				double a1,b,c = 0;
				while(optr[n]!='\0') {
					switch(optr[n]) {
					case '+':
						a1=Opnd.peek();
						Opnd.pop();
						b=Opnd.peek();
						Opnd.pop();
						c=b+a1;
						Opnd.push(c);
						break;
					case '-':
						a1=Opnd.peek();
						Opnd.pop();
						b=Opnd.peek();
						Opnd.pop();
						c=b-a1;
						Opnd.push(c);
						break;
					case '×':
						a1=Opnd.peek();
						Opnd.pop();
						b=Opnd.peek();
						Opnd.pop();
						c=b*a1;
						Opnd.push(c);
						break;
					case '÷':
						a1=Opnd.peek();
						Opnd.pop();
						b=Opnd.peek();
						Opnd.pop();
						if(a1!=0) {
							c=b/a1;
							Opnd.push(c);
							break;
						}
						else {
							text.setFont(new Font("黑体",Font.BOLD,40));
							text.setText("除零错误");}
					case 'l':
						a1=Opnd.peek();
						Opnd.pop();
						b=Opnd.peek();
						Opnd.pop();
						c=Math.log10(b)/Math.log10(a1);
						Opnd.push(c);
						break;
					case '^':
						a1=Opnd.peek();
						Opnd.pop();
						b=Opnd.peek();
						Opnd.pop();
						c=Math.pow(b, a1);
						Opnd.push(c);
						break;
					case 'c':
						a1=Opnd.peek();
						Opnd.pop();
						c=Math.cos(a1);
						Opnd.push(c);
						break;
					case 's':
						a1=Opnd.peek();
						Opnd.pop();
						c=Math.sin(a1);
						Opnd.push(c);
						break;
					case 't':
						a1=Opnd.peek();
						Opnd.pop();
						c=Math.tan(a1);
						Opnd.push(c);
						break;
				
					case '~':
						a1=-Opnd.peek();
						Opnd.pop();
						Opnd.push(a1);
						break;
					default :
							double d = 0;
							w=0;
						while(optr[n]>='0'&&optr[n]<='9'||optr[n]=='.') {
								d=10*d+optr[n]-'0';
								n++;
								//对小数点的处理
								if(optr[n]=='.') {
									q=-1;
									n++;
									w=0;
								}
								w++;
								}
							d=d/Math.pow(10,w-1);
							if(q!=-1) {
								d=d*Math.pow(10, w-1);
							}
							q=1;
							Opnd.push(d);
							break;
							}
					n++;
					}
				text.setFont(new Font("黑体",Font.BOLD,40));
				if(Opnd.peek()%(int)c==0)text.setText("="+(int)c);
				if((Opnd.peek()%(int)c)!=0)text.setText("="+Opnd.peek());
		
			}
			
		});
		JButton btn23 = new JButton("C");
		frm.add(btn23);
		btn23.setBounds(350, 420, 40, 50);
		btn23.setFont(new Font("黑体",Font.BOLD,10));
		btn23.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				text.setFont(new Font("黑体",Font.BOLD,22));
				text.setText(null);	
			}	
		});
	}
}

//顺便附上超有成就感的运行结果,因为定义的是double类型,所以结果可想而知,就是后面跟了一连串0,哈哈
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值