精简实用!Java计算器完整源代码分享

作者:山西淘贝游戏开发公司 阅读:92 次 发布时间:2023-06-17 05:25:39

摘要:Java计算器是一款在Java平台上开发的计算器工具,其拥有丰富简洁的界面、完备的数学运算以及出色的用户体验,备受广大程序员的青睐。今天,本篇文章就将为大家提供一份完整的Java计算器源代码,让我们来一起学习和了解这款优秀的计算工具吧!一、Java计算器源代码Java计算器源...

Java计算器是一款在Java平台上开发的计算器工具,其拥有丰富简洁的界面、完备的数学运算以及出色的用户体验,备受广大程序员的青睐。今天,本篇文章就将为大家提供一份完整的Java计算器源代码,让我们来一起学习和了解这款优秀的计算工具吧!

精简实用!Java计算器完整源代码分享

一、Java计算器源代码

Java计算器源代码包含若干个类,其主要实现的功能包括计算器界面的设计以及各种数学运算的实现。以下是Java计算器的主要源代码:

1.计算器界面设计

import java.awt.Color;

import java.awt.GridLayout;

import javax.swing.BorderFactory;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

public class Calculator extends JFrame {

private static final long serialVersionUID = 1L;

// 定义各个组件

private JPanel[] panels;

private JButton[] buttons;

private String[] buttonLabels = {

"7", "8", "9", "÷",

"4", "5", "6", "×",

"1", "2", "3", "-",

"0", ".", "C", "+"

};

private JLabel resultLabel;

public Calculator() {

super("计算器");

// 初始化各个组件

panels = new JPanel[5];

buttons = new JButton[buttonLabels.length];

resultLabel = new JLabel("0", JLabel.RIGHT);

// 设置窗口属性

setResizable(false);

setLocationRelativeTo(null); // 在屏幕中央显示

setSize(250, 250);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 设置布局

setLayout(new GridLayout(5, 1));

// 初始化各个面板

for (int i = 0; i < panels.length; i++) {

panels[i] = new JPanel();

panels[i].setBackground(Color.WHITE);

}

// 设置标签属性

resultLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));

resultLabel.setBackground(Color.WHITE);

resultLabel.setOpaque(true);

resultLabel.setFont(resultLabel.getFont().deriveFont(24f));

// 添加组件

for (int i = 0; i < buttons.length; i++) {

buttons[i] = new JButton(buttonLabels[i]);

buttons[i].setFont(buttons[i].getFont().deriveFont(16f));

buttons[i].setForeground(Color.BLUE);

buttons[i].setBackground(Color.WHITE);

switch (i) {

case 3:

case 7:

case 11:

case 15:

buttons[i].setForeground(Color.RED);

}

panels[i / 4].add(buttons[i]); // 添加按钮

}

panels[4].setLayout(new GridLayout(1, 2));

panels[4].add(resultLabel); // 添加标签

panels[4].add(buttons[14]);

for (int i = 0; i < panels.length; i++) {

add(panels[i]);

}

setVisible(true); // 显示窗口

}

}

2.数学运算实现

import java.math.BigDecimal;

import java.util.Stack;

public class Arithmetic {

private String expression; //待计算表达式

public Arithmetic(String expression) {

this.expression = expression;

}

/**

* 获取计算结果

*/

public BigDecimal getResult() {

Stack numStack = new Stack<>();

Stack opStack = new Stack<>();

opStack.push('#');

int index = 0;

char[] arr = expression.toCharArray();

while (index < arr.length) {

char c = arr[index];

if ('0' <= c && c <= '9') {

StringBuilder sb = new StringBuilder();

sb.append(c);

while (++index < arr.length) {

c = arr[index];

if ('0' <= c && c <= '9') {

sb.append(c);

} else {

break;

}

}

BigDecimal num = new BigDecimal(sb.toString());

numStack.push(num);

} else {

switch (c) {

case '+':

case '-':

while (opStack.peek() == '*' || opStack.peek() == '/' || opStack.peek() == '%') {

op(numStack, opStack);

}

opStack.push(c);

index++;

break ;

case '%':

opStack.push(c);

index++;

break ;

case '*':

case '/':

while (opStack.peek() == '%') {

op(numStack, opStack);

}

opStack.push(c);

index++;

break ;

case '(':

opStack.push(c);

index++;

break ;

case ')':

opStack.pop();

index++;

break ;

case '#':

while (opStack.peek() != '#') {

op(numStack, opStack);

}

break ;

default :

index++; // 跳过百分号等其他符号

break ;

}

}

}

while (!opStack.isEmpty() && opStack.peek() != '#') {

op(numStack, opStack);

}

return numStack.pop();

}

/**

* 定义运算符优先级

*/

private static int compare(char a, char b) {

if ((a == '*' || a == '/') && (b == '+' || b == '-'))

return -1;

if ((a == '+' || a == '-') && (b == '*' || b == '/'))

return 1;

return 0;

}

/**

* 根据运算符计算结果

*/

private static void op(Stack numStack, Stack opStack) {

BigDecimal num2 = numStack.pop();

BigDecimal num1 = numStack.pop();

char op = opStack.pop();

switch (op) {

case '+':

numStack.push(num1.add(num2));

break ;

case '-':

numStack.push(num1.subtract(num2));

break ;

case '*':

numStack.push(num1.multiply(num2));

break ;

case '/':

numStack.push(num1.divide(num2, 10, BigDecimal.ROUND_HALF_UP));

break ;

case '%':

numStack.push(num1.remainder(num2));

break ;

}

}

}

二、源代码详解

1.计算器界面设计

Java计算器的界面主要由若干个组件构成,包括数字按钮、运算符按钮、清空按钮以及结果显示标签。在本源代码中,我们通过JPanel面板的方式来布局各个组件,并使用GridLayout实现了网格布局的效果。具体的步骤如下:

1) 继承JFrame类,设置窗口属性,包括标题、大小、位置和关闭方式。

public class Calculator extends JFrame {

private static final long serialVersionUID = 1L;

public Calculator() {

super("计算器");

// 设置窗口属性

setResizable(false);

setLocationRelativeTo(null); // 在屏幕中央显示

setSize(250, 250);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 窗口布局

setLayout(new GridLayout(5, 1));

}

}

2) 初始化各个组件,包括数字按钮、运算符按钮、清空按钮以及结果标签,同时设置按钮颜色属性。

public Calculator() {

// 声明组件

panels = new JPanel[5];

buttons = new JButton[buttonLabels.length];

resultLabel = new JLabel("0", JLabel.RIGHT);

// 初始化面板

for (int i = 0; i < panels.length; i++) {

panels[i] = new JPanel();

panels[i].setBackground(Color.WHITE);

}

// 初始化按钮

for (int i = 0; i < buttons.length; i++) {

buttons[i] = new JButton(buttonLabels[i]);

buttons[i].setFont(buttons[i].getFont().deriveFont(16f));

buttons[i].setForeground(Color.BLUE);

buttons[i].setBackground(Color.WHITE);

switch (i) {

case 3:

case 7:

case 11:

case 15:

buttons[i].setForeground(Color.RED);

}

panels[i / 4].add(buttons[i]); // 将按钮添加到面板中

}

}

3) 将各个面板和组件添加到JFrame中,并设置显示效果。

public Calculator() {

...

// 添加面板和标签组件

panels[4].setLayout(new GridLayout(1, 2));

panels[4].add(resultLabel);

panels[4].add(buttons[14]);

for (int i = 0; i < panels.length; i++) {

add(panels[i]);

}

setVisible(true); // 显示

}

2.数学运算实现

Java计算器的数学运算主要依赖于Arithmetic类来实现。在该类中,我们定义了各种数学运算操作的具体实现方式,包括加、减、乘、除、取模等操作。同时,通过栈的数据结构,我们可以很方便地处理各种嵌套的运算表达式。

1) 定义Arithmetic类,该类包含待计算表达式和计算结果两个属性。

public class Arithmetic {

private String expression; // 待运算表达式

public Arithmetic(String expression) {

this.expression = expression;

}

/**

* 获取计算结果

*/

public BigDecimal getResult() {

// 初始化栈、操作符号和输入字符数组

Stack numStack = new Stack<>();

Stack opStack = new Stack<>();

opStack.push('#');

int index = 0;

char[] arr = expression.toCharArray();

while (index < arr.length) {

char c = arr[index];

if ('0' <= c && c <= '9') {

// 当输入字符为数字时,提取出该数字

StringBuilder sb = new StringBuilder();

sb.append(c);

while (++index < arr.length) {

c = arr[index];

if ('0' <= c && c <= '9') {

sb.append(c);

} else {

break;

}

}

BigDecimal num = new BigDecimal(sb.toString());

numStack.push(num);

} else {

// 当输入字符为运算符时,将其插入栈中

switch (c) {

case '+':

case '-':

// 当前运算符为加减号时,弹出栈顶乘除号,计算结果后再插入栈中

while (opStack.peek() == '*' || opStack.peek() == '/' || opStack.peek() == '%') {

op(numStack, opStack);

}

opStack.push(c);

index++;

break ;

case '%':

// 当前运算符为取模号时,直接将其插入栈中

opStack.push(c);

index++;

break ;

case '*':

case '/':

// 当前运算符为乘除号时,弹出栈顶取模号,计算结果后再插入栈中

while (opStack.peek() == '%') {

op(numStack, opStack);

}

opStack.push(c);

index++;

break ;

case '(':

// 当前运算符为左括号时,直接插入栈中

opStack.push(c);

index++;

break ;

case ')':

// 当前运算符为右括号时,将其弹出栈顶,并计算对应表达式的结果

opStack.pop();

index++;

break ;

case '#':

// 计算结束,计算栈中的所有运算符及数字的结果

while (opStack.peek() != '#') {

op(numStack, opStack);

}

break ;

default :

index++; // 跳过百分号等其他符号

break ;

}

}

}

// 计算所有剩余的栈顶元素

while (!opStack.isEmpty() && opStack.peek() != '#') {

op(numStack, opStack);

}

return numStack.pop();

}

}

2) 定义运算符优先级,只有当运算符优先级正确时,才可以进行计算操作。

private static int compare(char a, char b) {

if ((a == '*' || a == '/') && (b == '+' || b == '-'))

return -1;

if ((a == '+' || a == '-') && (b == '*' || b == '/'))

return 1;

return 0;

}

3) 根据运算符计算结果。该方法根据不同的运算符号,进行不同的数学计算操作。

private static void op(Stack numStack, Stack opStack) {

BigDecimal num2 = numStack.pop();

BigDecimal num1 = numStack.pop();

char op = opStack.pop();

switch (op) {

case '+':

numStack.push(num1.add(num2));

break ;

case '-':

numStack.push(num1.subtract(num2));

break ;

case '*':

numStack.push(num1.multiply(num2));

break ;

case '/':

numStack.push(num1.divide(num2, 10, BigDecimal.ROUND_HALF_UP));

break ;

case '%':

numStack.push(num1.remainder(num2));

break ;

}

}

三、源代码优化建议

Java计算器的源代码虽然简单易懂,并且功能完善,但是其存在一些设计和实现上的问题。例如:

1.计算器的窗口大小固定,无法根据不同屏幕自适应大小。

2.计算器的数字按钮和其他运算符按钮混合在一起,不便于用户查找。

3.计算器的运算符优先级计算方式存在问题。

4.运算表达式的输入方式单一,不足以满足用户不同的输入需求。

5.异常处理机制不完整,容易导致程序崩溃或产生异常。

因此,我们针对这些问题,可以在源代码基础上进行进一步的改进和优化,以提高计算器的性能和使用体验。

四、总结

通过本篇文章的阅读,相信大家已经了解了Java计算器的完整源代码和实现方式。Java计算器不仅功能齐全,而且界面简洁,使用起来十分便利。通过对该源代码的分析和学习,我们可以更好地掌握Java语言的面向对象编程技巧,同时提高数学计算的能力。在今后的程序设计中,我们可以依据Java计算器的源代码来开发更加优秀的计算器程序,以满足用户不同的需求。

  • 原标题:精简实用!Java计算器完整源代码分享

  • 本文链接:https://qipaikaifa1.com/tb/11539.html

  • 本文由山西淘贝游戏开发公司小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与淘贝科技联系删除。
  • 微信二维码

    CTAPP999

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:189-2934-0276


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部