JavaFX、计算器
本程序实现了简单的加减乘除运算,可对小数、整数、负数实现运算。
本程序的算数运算使用栈实现,一个操作符栈和一个操作数栈。
本程序允许的操作符为+、-、*、/、英文左括号(“(”),英文右括号(“)”)。
JavaFX界面程序如下:
package collection;import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;import java.util.Stack;public class EvaluateExpression extends Application {private TextField expression = new TextField(); //表达式private TextField result = new TextField(); //结果值private Button evaluate = new Button("Evaluate"); //计算按钮private Button clear = new Button("Clear"); //清除public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {GridPane gridPane = new GridPane(); //网格面板添加文本域对象gridPane.setStyle("-fx-hgap: 5px; -fx-vgap: 5px; -fx-padding: 5px;");gridPane.addRow(0, new Label("Enter an expression:"), expression);gridPane.addRow(1, new Label("Result:"), result);expression.setAlignment(Pos.BOTTOM_RIGHT); //文本域设置对齐result.setAlignment(Pos.BOTTOM_RIGHT);result.setEditable(false);EventHandler<ActionEvent> eventHandler = event -> { //计算表达式处理器try {result.setText(format(evaluateExpression(expression.getText().trim())));} catch (Exception ex) {}};expression.setOnAction(eventHandler); //文本域、按钮注册处理器evaluate.setOnAction(eventHandler);clear.setOnAction(event -> {expression.setText(""); result.setText("");});HBox hBox = new HBox(10, evaluate, clear); //水平面板添加按钮hBox.setAlignment(Pos.CENTER);BorderPane pane = new BorderPane(gridPane);pane.setBottom(hBox);Scene scene = new Scene(pane);primaryStage.setScene(scene);primaryStage.setTitle("EvaluateExpression");primaryStage.show();}/** 计算表达式 */public static double evaluateExpression(String expression) {Stack<Double> operandStack = new Stack<>(); //操作数栈Stack<Character> operatorStack = new Stack<>(); //操作符栈expression = formatExpression(expression);String[] tokens = expression.split(" "); //返回空格分隔数组for (String token : tokens) { //遍历数组switch (token) {case "+":case "-": //符号为+-while (!operatorStack.isEmpty() &&(operatorStack.peek() == '+' || operatorStack.peek() == '-' ||operatorStack.peek() == '*' || operatorStack.peek() == '/'))processAnOperator(operandStack, operatorStack);operatorStack.push(token.charAt(0)); break;case "*":case "/": //符号为*/while (!operatorStack.isEmpty() &&(operatorStack.peek() == '*' ||operatorStack.peek() == '/'))processAnOperator(operandStack, operatorStack);operatorStack.push(token.charAt(0)); break;case "(": operatorStack.push('('); break;case ")": //括号while (operatorStack.peek() != '(')processAnOperator(operandStack, operatorStack);operatorStack.pop(); break;default: operandStack.push(Double.parseDouble(token));}}while (!operatorStack.isEmpty()) //处理剩余的操作符processAnOperator(operandStack, operatorStack);return operandStack.pop();}/** 处理一个操作符 */public static void processAnOperator(Stack<Double> operandStack, Stack<Character> operatorStack) {char op = operatorStack.pop();double op1 = operandStack.pop();double op2 = operandStack.pop();switch (op) { //比较操作符,执行相应操作并入操作数栈case '+': operandStack.push(op2 + op1); break;case '-': operandStack.push(op2 - op1); break;case '*': operandStack.push(op2 * op1); break;case '/': operandStack.push(op2 / op1); break;default:}}/** 格式化表达式 */public static String formatExpression(String s) {StringBuilder stringBuilder = new StringBuilder();s = s.replaceAll(" ", ""); //去除所有空格for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '(' || c == ')' || c == '+' || c == '*' || c == '/') //判断()+*/stringBuilder.append(" ").append(c).append(" ");else if (c == '.' || Character.isDigit(c)) //判断.和数字stringBuilder.append(c);else if (c == '-') { //判断-号if (i == 0) stringBuilder.append(c); //负号else if (s.charAt(i-1) == '+' || s.charAt(i-1) == '-' ||s.charAt(i-1)== '*' || s.charAt(i-1) == '/' ||s.charAt(i-1) == '(')stringBuilder.append(c); //负号elsestringBuilder.append(" ").append(c).append(" "); //减号}}s = stringBuilder.toString().trim().replaceAll(" {2}", " ");return s;}/** 格式化值 */public static String format(double value) {String v = String.valueOf(value);return v.endsWith("0") ? String.valueOf((int)value) : v;}}
JavaFX、计算器相关推荐
- javafx 制作 24点游戏 24点计算器 24点算法
24点我也没想到太好的办法 主要思路如下(以四个数举例): 1.先生成3个符号,数量是4* 4* 4也就是64个不同的符号数组,类似这样[+,-,*] 2.将输入的四个数与64组不同符号对应运算保留可 ...
- Java实战之亲戚关系计算器(JavaFX版)(1)——项目简述
项目简述: 该项目是一个通过JavaFX实现的计算亲戚关系的小程序,该小程序具有通过亲戚关系链计算称呼的功能.将介绍如何如何通过JavaFX来实现该项目的全部过程. 使用软件: IntelliJ ID ...
- JavaFX --- BMI计算器
JavaFX -> BMI计算器 适合java入门练习 涉及控件.面板.布局简单知识点 简单的按钮事件 简单的为程序添加图标 不仅计算BMI,根据BMI值的大小提出建议 package BM ...
- Java实战之亲戚关系计算器(JavaFX版)(6)——实现计算功能
本节概要:实现亲属关系计算 功能一:实现计算功能 在data文件夹下创建RelationShipData.java文件,其中的内容主要是一个二维数组,即关系链数据. 内容如下: package kin ...
- Java实战之亲戚关系计算器(JavaFX版)(2)——功能介绍
功能一:计算亲属关系称谓 比如说:爸爸的爸爸的爸爸是曾祖父,在上面的文本域中显示关系链,而在下面的文本域中显示称谓,这就是计算亲属关系称谓的功能. 点击"父"按钮,在最上面的文本域 ...
- 简易计算器 java_用Java做一个简易计算器,要用到哪些知识?
分析问题关键词:Java.计算器 深夜无聊,暂且一答. 计算器分两个步骤:计算 + 器 篇一 ·「器」 在编程中,我们可以把「器」理解为「GUI(图形界面)」,Java 语言描绘的图形界面有很多种类, ...
- Java实现能完成 加减乘除幂与阶乘 组合运算的计算器
题目叙述: 有一组小学生要开始学习算术运算,需要使用计算机辅助他们检查计算结果,请帮助小同学设计一个能够完成+.-.*.\.幂运算和阶乘的计算器程序 具体要求: 由于是面向小同学的软件工具,请设计一个 ...
- 基于Java实现的一元稀疏多项式计算器
资源下载地址:https://download.csdn.net/download/sheziqiong/85896976 资源下载地址:https://download.csdn.net/downl ...
- 基于Java语言实现一元稀疏多项式计算器【100010608】
1.实验内容 一元稀疏多项式计算器 使用语言:Java 语言 编译环境:openJDk-1.8 2.问题描述 设计一个简易的一元稀疏多项式计算器. 3.需求分析 经过分析,本系统需完成的主要功能如下: ...
最新文章
- python的requests模块功能_python中requests模块的使用方法
- 移通好闹钟微信小程序全套源码
- 《Dotnet9》系列-Google ProtoBuf在C#中的简单应用
- 程序猿学习中华古诗词路径
- 下单点餐小程序解决方案
- KMSpico 无后门下载
- DDD 实战 (3):整体工作框架和全局需求分析
- 【回波损耗(dB)和电压驻波比(VSWR)之间的关系】
- C++ 打印机状态查询之SNMP协议
- 网站死链接检测与完美处理方法
- 15个网站失效死链接检查工具
- 最详细虚拟机VMware安装CDLinux(12)
- MIMO系列之分集与复用
- leaflet 加载高德地图
- ubuntu服务器pdf文件大小,Ubuntu下的PDF阅读器okular安装使用介绍
- 陪你云sdk用户指南
- 计算机领域中的CAE,CAE
- 【观察】不断打破手机行业创新边界,三个维度解读vivo NEX双屏版
- python分层抽样_基于列的sklearn分层抽样
- 三相LCL型并网逆变器电流闭环虚拟阻尼控制Simulink仿真
热门文章
- 华为路由器BGP联邦综合实验
- 乐鑫esp8266学习rtos3.0笔记第3篇: 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。(附带demo)
- 原生javascript实现星级评价功能
- 0667-6.2.0-什么是Cloudera虚拟私有集群和SDX
- UE4加载Excel表格CSV数据及解决中文乱码问题
- 鸿蒙适配机型小米,科技晚报|华为鸿蒙适配机型公布 P50首发/小米10S才是真正至尊版...
- 在uniapp中如何使用icon图标
- 不去摄影棚,不用PS三步快速证件照换底色最简单方式
- PHP hypot,hypot - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
- 9.7 方向导数与梯度