简易计算器

您所在的位置:网站首页 计算机运算优先级 简易计算器

简易计算器

2024-07-16 17:26:02| 来源: 网络整理| 查看: 265

文章目录 一.页面布局二.栈的设计三.删除处理四.运算逻辑加减运算乘除运算 五.总结六.完整代码 本程序包含+、-、*、/的优先级运算,包含等于,清除,删除三种功能。 使用到了基础的栈的知识 完整代码在页面底部,传统手艺复制粘贴(手动狗头)可直接运行。

一.页面布局

使用的WindowBuilder对界面进行布局,简单直接。使用方法:安装WindowBuilder插件,然后在eclipse右键-----Open With-----WindowBuilder Editor-----点击底部Design即可。 没安装WindowBuilder也不影响使用。 所有的按钮都是JButton,输出框是JTextField。

二.栈的设计

分为两个栈,数字栈和符号栈。

Stack stack1 = new Stack(); // 数字栈 Stack stack2 = new Stack(); // 符号栈

数字栈: 从输入串起始位置开始读取,读取连续数字并保存为double型,若此时读取到小数点,则读取小数点后的连续数字直到遇见+、-、*、/,作为之前整数的小数部分并入栈,否则就直接入栈。

temp = inputFormula.charAt(i); // String 取其某一个元素 if ((temp >= '0' && temp //获得了这个完整的数但是它可能为负数 temp = inputFormula.charAt(j); if (temp == '.'){ // 如果下一位是小数点 flag = false; index = 1; ++j; continue; } else if (flag && (temp >= '0' && temp //如果下一位不是数字 sum += Math.pow(0.1,index) * (temp - '0'); index ++; ++j; } else break; } //到此时截止,sum为一个正确的实数

符号栈: 当字符栈为空时,运算符直接入栈;当栈外优先级大于等于栈内优先级,入栈;当栈不为空并且栈外优先级低于栈内优先级,将高优先级的运算先计算了,然后入栈。(此处只有+和*运算,因为我将“-”后面的数保存为负数,将/后的数变为倒数,详情见后面)

else if (temp == '+' || temp == '-' || temp == '*' || temp == '/' ){ // 处理字符 // 当栈中为空时 或者 栈外优先级大于等于栈内优先级,入栈 if (stack2.empty() || getPriority(temp) >= getPriority(stack2.peek().charValue())) // 有优先级的 { if(temp == '+' || temp == '-') { stack2.push('+'); } else if(temp == '*' ||temp == '/') { stack2.push('*'); } } else{ // 当栈不为空 并且 栈外优先级低于栈内优先级,将高优先级的运算先计算了,然后入栈。 while(!stack2.empty() && (getPriority(temp) if(getInput.contains(".")||getInput.contains("+")||getInput.contains("-") ||getInput.contains("*")||getInput.contains("/")) return 1; return 0; }

点击事件:

btnDelete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { inputFormula = textField.getText(); if(returnToZero(textField.getText()) == 1) // 可以删的情况(含加减乘除小数点) { textField.setText(textField.getText().substring(0,inputFormula.length()-1)); } // 此时只剩下整数部分,在范围内则设置为0 else if(Integer.parseInt(textField.getText()) -10) { textField.setText("0"); } else // 如123 -123 { textField.setText(textField.getText().substring(0,inputFormula.length()-1)); } } }); 四.运算逻辑 加减运算

因为是用栈进行保存数据,遵行后进先出的原则,进行减法运算时,取一个运算符“-”和两个数,若为连续的减法运算,倒数第二个数字被当做正数,故此运算逻辑有误。 直接将“-”后的数字保存为负数,所以运算时使用的只是加法规则且运算逻辑正确。 标记负号

if (inputFormula.charAt(i) == '-' ) // 将后一个数负数保存 { if(i == 0) // 如果第一位是“-”,则传一个0进去,不然数不够用 stack1.push(0.0); isNegative = 1; }

存为负数

if (isNegative == 1) // 当标志为1说明sum是一个负数 { sum = sum * -1; isNegative = 0; }

只入栈加号

if(temp == '+' || temp == '-') { stack2.push('+'); }

运算

while(!stack2.empty()){ char c = stack2.peek().charValue(); stack2.pop(); double num2 = stack1.peek().doubleValue(); stack1.pop(); double num1 = stack1.peek().doubleValue(); stack1.pop(); if (c == '+') stack1.push(num1 + num2); if (c == '-') stack1.push(num1 + num2); if (c == '*') stack1.push(num1 * num2); if (c == '/') stack1.push(num1 * num2); } 乘除运算

因为是用栈进行保存数据,遵行后进先出的原则,进行除法运算时,取一个运算符“/”和两个数,若为连续的除法运算,倒数第二个数字被当做被除数,故此运算逻辑有误。 直接将“/”后的数字保存为本身的倒数,所以运算时使用的只是乘法规则且运算逻辑正确。 标记除号-----存为倒数-----只入栈乘号-----运算 代码与加减运算类似,就不上代码了。

五.总结

1.功能的正常使用上完全没有问题,根据用户正确的输入按照运算优先级顺序输出正确结果。 2.用户输入不规范时,由于符号太多,数字栈中的数字出栈完了无法进行运算,所以会报空栈错误,此处有待改进。(如2----3)

六.完整代码

点个赞吧!大哥

package calculator; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.JButton; import java.awt.Font; import javax.swing.SwingConstants; import java.awt.event.ActionListener; import java.util.Stack; import java.awt.event.ActionEvent; public class Calculator { //减法运算有问题 private JFrame frame; private static JTextField textField; private static int isNegative = 0; //如果为0则为首字母为负号而不是运算符 private static String inputFormula ; private static boolean isDivision = false; Stack stack1 = new Stack(); // 数字栈 Stack stack2 = new Stack(); // 符号栈 /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Calculator window = new Calculator(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public Calculator() { initialize(); } private void initialize() { frame = new JFrame(); frame.setTitle("计算器"); frame.setBounds(100, 100, 345, 342); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 默认退出模式 frame.getContentPane().setLayout(null); textField = new JTextField(); // 文本框 textField.setHorizontalAlignment(SwingConstants.RIGHT); textField.setFont(new Font("宋体", Font.PLAIN, 27)); textField.setText("0"); textField.setBounds(14, 0, 296, 45); frame.getContentPane().add(textField); textField.setColumns(10); //为了方便看,将Button的初始化放在一起 JButton btn7 = new JButton("7"); btn7.setBounds(14, 62, 45, 47); frame.getContentPane().add(btn7); JButton btn8 = new JButton("8"); btn8.setBounds(73, 62, 45, 47); frame.getContentPane().add(btn8); JButton btn9 = new JButton("9"); btn9.setBounds(132, 62, 45, 47); frame.getContentPane().add(btn9); JButton btn4 = new JButton("4"); btn4.setBounds(14, 122, 45, 47); frame.getContentPane().add(btn4); JButton btn5 = new JButton("5"); btn5.setBounds(73, 122, 45, 47); frame.getContentPane().add(btn5); JButton btn6 = new JButton("6"); btn6.setBounds(132, 122, 45, 47); frame.getContentPane().add(btn6); JButton btn1 = new JButton("1"); btn1.setBounds(14, 182, 45, 47); frame.getContentPane().add(btn1); JButton btn2 = new JButton("2"); btn2.setBounds(73, 182, 45, 47); frame.getContentPane().add(btn2); JButton btn3 = new JButton("3"); btn3.setBounds(132, 182, 45, 47); frame.getContentPane().add(btn3); JButton btnpoint = new JButton("."); btnpoint.setBounds(14, 240, 45, 47); frame.getContentPane().add(btnpoint); JButton btn0 = new JButton("0"); btn0.setBounds(73, 240, 45, 47); frame.getContentPane().add(btn0); JButton btnc = new JButton("C"); btnc.setBounds(132, 240, 45, 47); frame.getContentPane().add(btnc); JButton btndivision = new JButton("/"); btndivision.setBounds(194, 240, 45, 47); frame.getContentPane().add(btndivision); JButton btnadd = new JButton("+"); btnadd.setBounds(194, 62, 45, 47); frame.getContentPane().add(btnadd); JButton btnminus = new JButton("-"); btnminus.setBounds(194, 122, 45, 47); frame.getContentPane().add(btnminus); JButton btnmultiply = new JButton("*"); btnmultiply.setBounds(194, 182, 45, 47); frame.getContentPane().add(btnmultiply); JButton btnequals = new JButton("="); btnequals.setBounds(253, 182, 57, 105); frame.getContentPane().add(btnequals); JButton btnDelete = new JButton("


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭