Java 简单计算器的实现

完成效果

在这里插入图片描述

代码

刚学所以也许有很多缺点,供参考,希望对你有帮助。

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.text.SimpleDateFormat;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class Calculator {
	public static void main(String[] args){
		JFrame f = new JFrame("计算器");
		f.setSize(450, 650);							//设置容器尺寸
        f.setLocation(200, 100);						//设置容器位置
        f.setLayout(null);								//设置布局。
        
        //显示框
        JTextField text = new JTextField("");
        text.setFont(new Font("宋体",Font.BOLD,30));	//设置文本框字体样式
        text.setHorizontalAlignment(JTextField.RIGHT);	//设置文本右对齐
        text.setBounds(20, 20, 390, 70);				//设置位置和大小
        text.setEditable(false);						//设置文本框不可编辑
        text.setBorder(new EmptyBorder(0,0,0,0));		//设置无边框
        text.setBackground(Color.white);				//设置文本框背景颜色
    	f.add(text);
        
        //按钮区
    	int k = 0, m = 1;
    	Color c1 = new Color(255,102,102);
    	Color c2 = new Color(108,123,139);
    	Color c3 = new Color(0,154,205);
    	Color c4 = new Color(185,211,238);
    	for(int i=1;i<=20;i++) {
    		JButton t = new JButton();					//创建按钮
    		t.setBackground(c2);						//设置按钮背景颜色
    		switch(i) {
    		case 3:	t.setText("C");
		    		t.setBackground(c1);
		    		break;
    		case 4:	t.setText("<<");
    				t.setBackground(c1);
    				break;
    		case 2:	t.setText("time");
		    		t.setBackground(c1);
		    		break;
    		case 1:	t.setText("÷");
    				t.setBackground(c4);
    				break;
    		case 6:	t.setText("7");break;
    		case 7:	t.setText("8");break;
    		case 8:	t.setText("9");break;
    		case 5:	t.setText("×");
					t.setBackground(c4);
					break;
    		case 10:t.setText("4");break;
    		case 11:t.setText("5");break;
    		case 12:t.setText("6");break;
    		case 9:t.setText("-");
					t.setBackground(c4);
					break;
    		case 14:t.setText("1");break;
    		case 15:t.setText("2");break;
    		case 16:t.setText("3");break;
    		case 13:t.setText("+");
					t.setBackground(c4);
					break;
    		case 19:t.setText("0");break;
    		case 17:t.setText("(");
					t.setBackground(c4);
					break;
    		case 18:t.setText(")");
					t.setBackground(c4);
					break;
    		case 20:t.setText("=");
    				t.setBackground(c3);
    				break;
    		}
    		
    		t.setBounds(20+100*(m-1), 110+100*k, 80, 80);					//设置按钮在容器中的位置
    		if(i%4==0) {
    			k++;
    			m=0;
    		}
    		m++;
            t.setBorderPainted(false);						//删去按钮边框
            t.setFont(new java.awt.Font("宋体", 1, 20));		//设置按钮类型、样式、大小
            t.setFocusPainted(false);						//删去按钮文字的焦点框
            t.setForeground(Color.white);					//设置按钮文字颜色
            final int[] num = new int[1];
            num[0] = i;
            t.addActionListener(new ActionListener(){		//设置按钮监听事件
        		@Override
        		public void actionPerformed(ActionEvent e) {
        			// TODO Auto-generated method stub
        			if(text.getText().length()!=0) {
        				if((text.getText().charAt(0) + "").getBytes().length != 1) {	//判断如果为中文清空
            				text.setText("");
            			}
        			}
        			if(num[0]==3) {
        				text.setText("");
        			}else if(num[0]==4) {
        				if(text.getText().length()!=0) {
        					text.setText(text.getText().substring(0, text.getText().length()-1));
            			}
        			}else if(num[0]==20) {
        				String str = text.getText();
        				if(!checkBracket(str.toCharArray(), str.length())) {
        					text.setText("括号不匹配!!");
        				}else {
        					int res;
        					try {
        						res = calculate(str.toCharArray(),str.length());
        						text.setText(String.valueOf(res));
        					}catch(Exception e1){
        						text.setText("输入格式不正确!");
        					}
        					
        				}
        			}else if(num[0]==2) {
        				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
        		        text.setText("时间:"+df.format(new Date()));// new Date()为获取当前系统时间
        			}
        			else {
        				text.setText(text.getText()+t.getText());
        			}
        		}
            		
            }); 
            f.add(t);
    	}
    	
    	
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//界面关闭后程序结束
        f.setVisible(true);//界面可视化。
	}
		
		//检查括号匹配情况,括号合理返回true,否则返回false
		public static boolean checkBracket(char exp[], int n) {
			char[] stack = new char[n];
			int top = -1;
			for(int i = 0; i<n; i++) {
				if(exp[i]=='(') {
					stack[++top] =  '(';
				}else if(exp[i]==')') {
					if(top==-1) 
						return false;
					else
						top--;
				}
			}
			if(top==-1) 
				return true;
			else
				return false;
		}
		
		//获取符号优先级
		public static int priority(char a) {
			switch (a) {
			case '(':
	        case ')':
	                return 0;
	        case '-':
	        case '+':
	                return 1;
	        case '×':
	        case '÷':
	                return 2;
	        default:
	                return -1;

	        }
		}
		
		//计算
			public static int compute(String op, int num1, int num2) {
				switch (op) {
		        case "-":
		                return num1 - num2;
		        case "+":
		                return num1 + num2;
		        case "×":
		                return num1 * num2;
		        case "÷":
		                return num1 / num2;
		        default:
		                return 0;

		        }
			}
		//转为后缀表达式后计算,网上很多就不细说了
		public static int calculate(char exp[], int n) {
			char[] stack = new char[n];
			String[] list = new String[n];
			int stop = -1, ltop = -1;
			for(int i=0; i<n; i++) {
				if(Character.isDigit(exp[i])) {
					String s = String.valueOf(exp[i]);
					while(i<n-1&&Character.isDigit(exp[i+1])) {
						s += String.valueOf(exp[i+1]);
						i++;
					}
					list[++ltop] = s;
				}else if(exp[i]=='('||stop==-1) {
					stack[++stop] = exp[i];
				}else if(exp[i]==')') {
					while(stack[stop]!='(') {
						list[++ltop] = String.valueOf(stack[stop--]);
					}
					stop--;
				}else if(priority(exp[i])>priority(stack[stop])) {
					stack[++stop] = exp[i];
				}else if(priority(exp[i])<=priority(stack[stop])) {
					while(priority(exp[i])<=priority(stack[stop])) {
						list[++ltop] = String.valueOf(stack[stop--]);
						if(stop==-1)
							break;
					}
					stack[++stop] = exp[i];
				}
			}
			while(stop!=-1) {
				list[++ltop] = String.valueOf(stack[stop--]);
			}
			//开始计算后缀表达式
			int[] data = new int[n];
			int top = -1, res = 0;
			for(int i=0; i<n&&list[i]!=null; i++) {
				if(Character.isDigit(list[i].charAt(0))) {
					data[++top] = Integer.parseInt(list[i]);
				}else {
					res = compute(list[i], data[top-1], data[top]);
					data[--top] = res;
				}
			}
			return data[0];
		}
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值