【Java】计算器

本文详细介绍了一款简易计算器的图形用户界面(GUI)设计与实现过程。使用Java Swing构建界面,实现了基本算术运算及科学计算器功能,如平方根、存储、调用等。文章深入解析了事件监听、布局管理及运算逻辑。

备份一下很久之前写的计算器的源代码。
待完善。
GUI界面

// CalculateGUI.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CalculateGUI extends JFrame implements ActionListener{	
	JButton zero, one, two, three, four, five, six, seven,eight, nine;
	JButton point, add, sub, mul, div, equalTo, sqrt;
	JButton mc, madd, msub, mr;
	JButton delete, CE, C;
	JTextField text;
	JPanel panel;
	Operation op;
	String num = "", operator = "";
	String result = "", mresult = "";
	
	public CalculateGUI(){
		super("计算器");
		zero = new JButton("0");
		one = new JButton("1");
		two = new JButton("2");
		three = new JButton("3");
		four = new JButton("4");
		five = new JButton("5");
		six = new JButton("6");
		seven = new JButton("7");
		eight = new JButton("8");
		nine = new JButton("9");
		point = new JButton(".");
		add = new JButton("+");
		sub = new JButton("-");
		mul = new JButton("*");
		div = new JButton("/");
		equalTo = new JButton("=");
		sqrt = new JButton("√");
		delete = new JButton("←");
		CE = new JButton("CE");
		C = new JButton("C");
		mc = new JButton("mc");
		madd = new JButton("m+");
		msub = new JButton("m-");
		mr = new JButton("mr");
		
				
		text = new JTextField();
		text.setFont(new Font("宋体",Font.BOLD, 25));
		text.setHorizontalAlignment(SwingConstants.RIGHT);
		text.setColumns(2);
		
		panel = new JPanel();
	    
		panel.add(mc);
		panel.add(madd);
		panel.add(msub);
		panel.add(mr);
		panel.add(delete);
		panel.add(CE);
		panel.add(C);
		panel.add(sqrt);
		panel.add(seven);
		panel.add(eight);
		panel.add(nine);
		panel.add(div);
		panel.add(four);
		panel.add(five);
		panel.add(six);
		panel.add(mul);
		panel.add(one);
		panel.add(two);
		panel.add(three);
		panel.add(sub);
		panel.add(zero);
		panel.add(point);
		panel.add(add);
		panel.add(equalTo);
		
		panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
		panel.setLayout(new GridLayout(6, 5, 5, 5));
		
		this.setLayout(new BorderLayout());
	    this.add(text, BorderLayout.NORTH);
	    this.add(panel);
	    
		zero.addActionListener(this);
		one.addActionListener(this);
		two.addActionListener(this);
		three.addActionListener(this);
		four.addActionListener(this);
		five.addActionListener(this);
		six.addActionListener(this);
		seven.addActionListener(this);
		eight.addActionListener(this);
		nine.addActionListener(this);
		point.addActionListener(this);
		add.addActionListener(this);
		sub.addActionListener(this);
		mul.addActionListener(this);
		div.addActionListener(this);
		equalTo.addActionListener(this);
		sqrt.addActionListener(this);
		delete.addActionListener(this);
		CE.addActionListener(this);
		C.addActionListener(this);
		mc.addActionListener(this);
		madd.addActionListener(this);
		msub.addActionListener(this);
		mr.addActionListener(this);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocation(100, 200);
		this.setSize(270, 300);
		this.setVisible(true);
	}
	
	public String getResult(){
		if(operator.equals("/") && num.equals("0")) 
			text.setText("错误,除数不能为0");
		else if(operator.length() != 0 && num.length() == 0) 
			text.setText("未输入第二个操作数");
		
		/*   ↑出错       求解↓      */
		
		else if(operator.length() == 0 && num.length() != 0)
			result = num;
		else if(operator.equals("√")){
			result = String.valueOf(Math.sqrt(Double.parseDouble(num)));
			if(result.length()>15) result = result.substring(0, 15);
		}
		else{
			op.setB(Double.parseDouble(num));				    
			result = String.valueOf(op.getResult());
		}
		
		num = "";
		operator = "";
		return result;
	}
	
	//←
	public void delete(){
		if(num.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-1));
				num = num.substring(0, num.length()-1);	
		}
		else if(operator.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-1));
			num = text.getText();
			operator = "";
		}
	}
	
	//CE
	public void clearEntry(){
		if(num.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-num.length()));
			num = "";
		}
		else if(operator.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-1));
		}
	}
	
	public String stringAdd(String str1, String str2){
		if(str1.length() == 0)
			str1 = "0";
		if(str2.length() == 0)
			str2 = "0";
		return String.valueOf(Double.parseDouble(str1)+Double.parseDouble(str2));
	}
	public String stringSub(String str1, String str2){
		return String.valueOf(Double.parseDouble(str1)-Double.parseDouble(str2));
	}
	
	/****************************事件响应***********************************/
	public void actionPerformed(ActionEvent e) {
		String str = ((AbstractButton) e.getSource()).getText();
		switch(str){
			case "0":
			case "1":
			case "2":
			case "3":
			case "4":
			case "5":
			case "6":
			case "7":
			case "8":
			case "9":
				text.setText(text.getText()+str);
				num = num + str;
				break;
			case ".":
				if(num.length() == 0)
					text.setText("数据格式错误");
				text.setText(text.getText()+str);
				num = num + str;
				break;
			case "+":
			case "-":
			case "*":
			case "/":
				if(num.length()==0) text.setText("错误,操作数为空");
				else if(operator.length() == 1)  text.setText("运算符格式错误");
				else{
					operator = str;
					op = OperateFactory.creatOperate(operator);
					op.setA(Double.parseDouble(num));
					num = "";
					text.setText(text.getText()+str);
				}
				break;
			case "√":
				operator = "√";
				text.setText("√("+text.getText()+")");
				break;
			case "=":
				result = this.getResult();
				text.setText(result);
				break;
			case "CE":
				if(num.length() != 0 | operator.length() != 0)
					this.clearEntry();
				break;
			case "C":
				text.setText("");
				num = "";
				break;
			case "←":
				this.delete();
				break;
			case "mc":
				mresult = "";
//				System.out.println("mc:   "+mresult);
				text.setText("");
				break;
			case "m+":
				result = this.getResult();
//				System.out.println("m+1:   "+mresult);
			    mresult = this.stringAdd(mresult, result);
//			    System.out.println("m+2:   "+mresult);
			    text.setText("");
			    break;
			case "m-":
				result = this.getResult();
//				System.out.println("m-1:   "+mresult);
			    mresult = this.stringSub(mresult, result);
//			    System.out.println("m-2:   "+mresult);
			    text.setText("");
			    break;
			case "mr":
//				System.out.println("mr:   "+mresult);
				if(mresult.length() != 0)
					text.setText(mresult);
				break;
		}
	}
}

\\ Operation.java

abstract class Operation{
	protected double numberA = 0, numberB = 0;
	public Operation(){}
	public Operation(double numberA, double numberB) {
		this.numberA = numberA;
		this.numberB = numberB;
	}
	public void setA(double numberA) {
		this.numberA = numberA;
	}
	public void setB(double numberB) {
		this.numberB = numberB;
	}
	public abstract double getResult();
}
//加
class OperationAdd extends Operation{
	public OperationAdd(){}
	public OperationAdd(double numberA, double numberB) {
		super(numberA, numberB);
	}
	public double getResult(){
		return numberA + numberB;
	}
}
//减
class OperationSub extends Operation{
	public OperationSub(){}
	public OperationSub(double numberA, double numberB) {
		super(numberA, numberB);
	}
	public double getResult(){
		return numberA - numberB;
	}
}
//乘
class OperationMul extends Operation{
	public OperationMul(){}
	public OperationMul(double numberA, double numberB) {
		super(numberA, numberB);
	}

	public double getResult(){
		return numberA * numberB;
	}
}
//除
class OperationDiv extends Operation{
	public OperationDiv(){}
	public OperationDiv(double numberA, double numberB) {
		super(numberA, numberB);
	}
	public double getResult() {
		 String result = String.valueOf(numberA/numberB);
		 if(result.length()>15) result = result.substring(0, 15);
		 return Double.parseDouble(result);
	}
}

class OperateFactory{
	public static Operation creatOperate(String operate){
		Operation op = null;
		switch(operate.charAt(0)){
		case '+': op = new OperationAdd();
		            break;
		case '-': op = new OperationSub();  
					break;
		case '*': op = new OperationMul();  
					break;
		case '/': op = new OperationDiv(); 
		            break;
		}
		return op;
	}
}


基于模拟退火的计算器 在线运行 访问run.bcjh.xyz。 先展示下效果 https://pan.quark.cn/s/cc95c98c3760 参见此仓库。 使用方法(本地安装包) 前往Releases · hjenryin/BCJH-Metropolis下载最新 ,解压后输入游戏内校验码即可使用。 配置厨具 已在2.0.0弃用。 直接使用白菜菊花代码,保留高级厨具,新手池厨具可变。 更改迭代次数 如有需要,可以更改 中39行的数字来设置迭代次数。 本地编译 如果在windows平台,需要使用MSBuild编译,并将 改为ANSI编码。 如有条件,强烈建议这种本地运行(运行可加速、可多次重复)。 在 下运行 ,是游戏中的白菜菊花校验码。 编译、运行: - 在根目录新建 文件夹并 至build - - 使用 (linux) 或 (windows) 运行。 最后在命令行就可以得到输出结果了! (注意顺序)(得到厨师-技法,表示对应新手池厨具) 注:linux下不支持多任务选择 云端编译已在2.0.0弃用。 局限性 已知的问题: - 无法得到最优解! 只能得到一个比较好的解,有助于开阔思路。 - 无法选择菜品数量(默认拉满)。 可能有一定门槛。 (这可能有助于防止这类辅助工具的滥用导致分数膨胀? )(你问我为什么不用其他语言写? python一个晚上就写好了,结果因为有涉及json读写很多类型没法推断,jit用不了,算这个太慢了,所以就用c++写了) 工作原理 采用两层模拟退火来最大化总能量。 第一层为三个厨师,其能量用第二层模拟退火来估计。 也就是说,这套方法理论上也能算厨神(只要能够在非常快的时间内,算出一个厨神面板的得分),但是加上厨神的食材限制工作量有点大……以后再说吧。 (...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值