这学期java课的一个小作业,用java编一个小计算器。
个人认为要点在于:
1.计算机的布局,即按钮和输出框的布局需要知道怎么操作,按钮的大小和字体的大小颜色、不同布局中按钮的改变大小等等
2.用栈将中缀表达式转换为后缀表达式
3.用栈将后缀表达式计算出来
其他问题应该不大,因为只是涉及到简单的加减乘除运算。
我的这个计算器有以下功能:
1.支持加减乘除运算,支持括号功能,小数点功能。
2.支持删除一位的操作。
3.支持计算结果继续进行计算的功能。
4.点击=后原表达式消失,只出现结果,一般保留一位小数。
目前发现的缺陷:
1.负数开头无法实现
2.输入错误表达式后,必须要再输入一次正确表达式后,才能正常开始运算,找不着bug,挺奇怪的,希望老师看不到
等等
但是我都通过try{}catch{}将异常捕获,统一在界面输出操作“非法输入,请按两次AC后重新操作”。
以下是界面展示:


下面直接上代码了

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;public class Computerhomework extends JFrame implements ActionListener{JTextField textField = new JTextField("");String input = "";JButton b[] = new JButton[20];JPanel panel = new JPanel();JPanel panel1 = new JPanel();String name [] = {"9","8","7","D","AC","6","5","4","-","(","3","2","1","*",")","0",".","=","/","+"};Stack<String> houzhui = new Stack<>();public Computerhomework() {this.setTitle("Computer");this.setSize(600, 700);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void board() {textField.setPreferredSize(new Dimension(600,80));textField.setFont(new Font("宋体",Font.PLAIN,30));textField.setEditable(false);   panel1.add(textField);panel.setLayout(new GridLayout(4,4,5,5));panel1.setLayout(new FlowLayout(3));this.add(panel, BorderLayout.CENTER);this.add(panel1, BorderLayout.NORTH);for(int i=0;i<name.length;i++)//添加按钮{b[i] = new JButton(name[i]);b[i].setBackground(new Color(162,192,142));b[i].setForeground(Color.BLACK);  //设置按键颜色b[i].setFont(new Font("宋体",Font.PLAIN,50));//设置字体格式panel.add(b[i]);//将按键添加到界面b[i].addActionListener(this);}}@Overridepublic void actionPerformed(ActionEvent e){int flag_feifa = 0;try {for(int i = 0; i<name.length; i++) {if(e.getSource() == b[i] && name[i] == "AC") {textField.setText("");input = "";}else if(e.getSource() == b[i] && name[i] == "D") {String t =  textField.getText();String flag = t.substring(t.length()-1);if(flag.equals("+") || flag.equals("-") || flag.equals("*") || flag.equals("/") || flag.equals("(") || flag.equals(")")) {textField.setText(t.substring(0, t.length()-1));input = input.substring(0,input.length() - 3);}else {textField.setText(t.substring(0, t.length()-1));input = input.substring(0,input.length() - 1);}}else if(e.getSource() == b[i] && name[i] =="(") {textField.setText(textField.getText() + e.getActionCommand() );input +=e.getActionCommand() + " ";}else if(e.getSource() == b[i] && name[i] == ")") {textField.setText(textField.getText() + e.getActionCommand() );input += " "+e.getActionCommand();}else if(e.getSource() == b[i] && name[i] == "=") {System.out.println(input);String r = result(to_houzhui(input));input = r;textField.setText(r);}else if(e.getSource() == b[i] && (name[i] == "+" || name[i] == "-" || name[i]=="*" || name[i] =="/")) {textField.setText(textField.getText() + e.getActionCommand() );input += " " + e.getActionCommand() + " ";}else if(e.getSource() == b[i]) {textField.setText(textField.getText() + e.getActionCommand() );input += e.getActionCommand();}}}catch(Exception x) {textField.setText("非法输入,请按两次AC后重新操作");input = "";flag_feifa = 1;}}public String to_houzhui(String in) {String hou = "";String s[] = in.split(" ");
//      System.out.println(s.length);
//      for(String t:s) {//          System.out.println(t);
//      }for(int i=0; i<s.length; i++) {//          .getClass().toString()获取数据类型 1*1*1*(11+1-44*21/11)char flag = s[i].charAt(0); //取出字符串的第一个字符作为判断if(flag >= '0' && flag <= '9' && i==0) {hou += s[i]; //数字加入后缀表达式}else if(flag >= '0' && flag <= '9') {hou += " "+s[i]; //数字加入后缀表达式}else if(houzhui.empty() == true) {houzhui.push(s[i]); //栈为空直接入栈}else if(flag == '(') houzhui.push(s[i]);else if(houzhui.peek().equals("(")) {houzhui.push(s[i]); //栈顶为左括号,入栈}else if(flag == ')') {while(houzhui.peek().equals("(") != true) {hou += " "+houzhui.peek();houzhui.pop();}houzhui.pop(); //将(也pop掉}else if((flag == '+' || flag == '-') && (houzhui.peek().equals("*") || houzhui.peek().equals("/") || houzhui.peek().equals("+") || houzhui.peek().equals("-"))) {//低优先级遇到高优先级,高优先级出栈,低优先级入栈,平级也是先出再入String f = houzhui.peek();while((f.equals("+") || f.equals("-")||f.equals("*")||f.equals("/"))&&!houzhui.empty()) {hou += " " + f;houzhui.pop();if(!houzhui.empty())f = houzhui.peek();}houzhui.push(s[i]);}else if((flag == '*' || flag == '/' )&& (houzhui.peek().equals("+")|| houzhui.peek().equals("-"))) {//*/为这里最高阶的运算符,遇到低级压入栈12*(12+12-14*13)houzhui.push(s[i]);}else{//最高级遇到同级,先出后进String f = houzhui.peek();while((f.equals("*") || f.equals("/"))&&!houzhui.empty() ) {hou += " " + f;houzhui.pop();if(!houzhui.empty())f = houzhui.peek();}houzhui.push(s[i]);}}while(!houzhui.empty()) {hou += " "+houzhui.peek();houzhui.pop();}return hou;}public String result(String s) {double sum = 0;String item[] = s.split(" ");Stack<String> res = new Stack<>();for(int i=0; i<item.length; i++) {if(item[i].charAt(0)>'0' && item[i].charAt(0)<'9') {res.push(item[i]);}else if(item[i].equals("+")) {double x = Double.parseDouble(res.peek());res.pop();double y = Double.parseDouble(res.peek());res.pop();String z = String.valueOf(y+x);res.push(z);}else if(item[i].equals("-")) {double x = Double.parseDouble(res.peek());res.pop();double y = Double.parseDouble(res.peek());res.pop();String z = String.valueOf(y-x);res.push(z);}else if(item[i].equals("*")) {double x = Double.parseDouble(res.peek());res.pop();double y = Double.parseDouble(res.peek());res.pop();String z = String.valueOf(y*x);res.push(z);}else if(item[i].equals("/")) {double x = Double.parseDouble(res.peek());res.pop();double y = Double.parseDouble(res.peek());res.pop();String z = String.valueOf(y/x);res.push(z);}}return res.peek();   }public static void main(String[] args) {new Computerhomework().board();}}

java简易计算机(用栈实现中缀转后缀,计算后缀表达式)相关推荐

  1. Java简易计算机实训心得,(计算机java实训心得体会.doc

    (计算机java实训心得体会 计算机java实训心得体会 计算机java实训心得体会 计算机java实训心得体会 计算机java实训心得体会 此次只实训了短短的三周.虽说时间很短,但其中的每一天都使我 ...

  2. 基于JAVA简易在线教学系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA简易在线教学系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA简易在线教学系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目架构 ...

  3. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  4. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  5. JAVA毕业设计计算机类专业考研交流学习平台计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计计算机类专业考研交流学习平台计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计计算机类专业考研交流学习平台计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  6. JAVA简易网页浏览器

    JAVA简易网页浏览器 2021-09-13 代码: package WebBrowser;import javax.swing.*;//提供按钮类// import java.awt.*;//提供用 ...

  7. JAVA毕业设计计算机专业招聘网站计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计计算机专业招聘网站计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计计算机专业招聘网站计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开 ...

  8. Java应用开发全栈工程师

    Java应用开发全栈工程师 1.全栈工程师 全栈工程师大家可能都知道,就是包括web前端,web后端,手机应用开发都有了解,而且都可以上手做的工程师. 2.Java全栈工程师 Java全栈工程师一般情 ...

  9. Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略

    Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...

最新文章

  1. 如何确定敏捷是否适合你的团队?
  2. tomcat源码_从源码角度讲Tomcat在SpringBoot 中是如何启动的?
  3. c char转int_C指针精华知识大汇总
  4. 使用Python重命名MP3标签
  5. yaml文件解析:golang篇
  6. micropython入门教程-【ESP8266】MicroPython的快速入门教程
  7. [.NET] : 使用自定义对象当作报表数据源
  8. 使用PickerView
  9. 一百多个Zbrush实用笔刷和Alpah大合集
  10. 数字信号处理笔记02:离散时间傅里叶变换(DTFT)
  11. 中科院阿里云联合发布11比特云接入超导量子计算服务
  12. 清理outlook缓存
  13. 神临的 Unity shader 学习之多Pass渲染 (九)
  14. Android EditText 只能输入数字
  15. Redis集群cluster:增加删除(伸缩)节点操作步骤
  16. Steaming技术初体验
  17. IE6-IE11兼容性问题列表及解决办法总结
  18. 连续词袋模型(Continous bag of words, CBOW)
  19. 实体店数字化线上线下一体化经营转型
  20. basler相机的调试与配置以及多相机同时运行(完整版)

热门文章

  1. 三星java3倍拍照手机_最强拍照手机 三星GALAXY K zoom评测
  2. item在C语言中是什么意思中文,item的中文翻译是什么意思
  3. oracle12c asmfd,老菜鸟苦战oracle asm
  4. Codeforces 77A Heroes
  5. CentOS宝塔搭建(超详细)
  6. android安卓导航栏高度是多少,Android--状态栏高度,导航栏高度,Window高度,DecorView高度,heightPixels...
  7. win10系统磁盘清理,临时文件删不掉 的解决方案
  8. Swap市值管理机器人/量化交易实现方式与开发
  9. 不做工程等于纸上谈兵——对话OceanBase创始人阳振坤
  10. 全球首款异构融合类脑芯片,登上了 Nature 封面