当前位置:   article > 正文

Java实现简易计算器(逆波兰表达式)_java逆波兰表达式小数点怎么处理

java逆波兰表达式小数点怎么处理

程序的运行环境为Windows10 ,编译环境为IDEA。

计算器有以下功能和要求:能够计算复杂表达式,实现对多位数和负数以及小数的多则复杂计算


已完善功能(Bug):

1,能够计算大数字,小数,负数

2,小数点,运算符等不能连续输入(例如 ..,++,**等)

3,小数点前没有数字时自动补0并在输入框显示“0.”若小数点前是数字,且前面的数字串里含有".",则不能继续输入小数点(“.”---”0.“ ,1.11后面不能继续输入小数点)

4,‘(’左边和‘)’右边输入数字时,有运算符不做操作,无运算符自动补"*",")"后跟"(',在中间加‘*’(例如“7(”--“7*(”,“)7”--“(*7)”,“(1+1)(2+2)”--“(1+1)*(2+2)”)

5,输入的")"不能多于"(",且相邻()之间不能为空(“()”--X,“((1+2)))--X)

6,能计算负数,符号前面没有数字则补0  (-6-1 -- 0-6-1)

7,运算符除"-"号外不能第一个输入,若不是第一次计算,则可以直接输入,将上一个表达式的结果作为此次表达式的第一个运算数   

8,查看历史记录,清空当前记录,清空历史记录,退格操作

运行结果如图:

实现过程:

  一,计算器界面设计

1,初始化界面

通过 this 方法设置包括界面的大小,界面的位置(可根据屏幕设置中间位置),按键北面和中间排版及其颜色和大小,采用GridLayout网格布局

通过循环设置按键的位置,并将运算符加粗,并将所有按键和排版串联到界面上

  1. class Main {
  2. public static class Calculator extends JFrame implements ActionListener {
  3. // 初始化界面
  4. public void init() {
  5. this.setTitle("计算器");
  6. history.setEditable(false);
  7. history.setFont(new Font("宋体", Font.PLAIN, 30));
  8. this.setSize(477, 577); //界面大小
  9. this.setLayout(new BorderLayout());
  10. this.setResizable(false);
  11. this.setLocationRelativeTo(null); //界面位置设置居中
  12. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. }
  14. //北面的控件
  15. private final JPanel key_north = new JPanel();
  16. private final JTextField input_text = new JTextField();
  17. private final JTextArea history = new JTextArea();
  18. private final JButton c_btn = new JButton("C");
  19. private final JButton ALLc_btn = new JButton("AC");
  20. //中间的控件
  21. private final JPanel center = new JPanel();
  22. //将界面串联
  23. public Calculator() throws HeadlessException {
  24. this.init();
  25. this.addNorthCompent();
  26. this.addCenterButton();
  27. }
  28. //添加北面控键
  29. public void addNorthCompent() {
  30. this.history.setPreferredSize(new Dimension(350, 200));
  31. this.input_text.setPreferredSize(new Dimension(450, 30));//输入框的大小
  32. input_text.setBackground(new Color(127,255,212));
  33. this.key_north.setBackground(new Color(193,255,193));
  34. this.history.setBackground(new Color(193,255,120));
  35. key_north.add(input_text);
  36. key_north.add(history);
  37. this.c_btn.setForeground(new Color(0,139,139));//按键颜色
  38. this.ALLc_btn.setBackground(new Color(0,205,205));
  39. key_north.add(c_btn);
  40. key_north.add(ALLc_btn);
  41. c_btn.setBackground(Color.CYAN);
  42. c_btn.addActionListener(new ActionListener() { //为清除操作设置监听
  43. @Override
  44. public void actionPerformed(ActionEvent e) {
  45. firstint = "";
  46. input_text.setText("");
  47. }
  48. });
  49. ALLc_btn.addActionListener(new ActionListener() {
  50. @Override
  51. public void actionPerformed(ActionEvent e) {
  52. input_text.setText("");
  53. firstint = "";
  54. hitory = "";
  55. history.setText("");
  56. }
  57. });
  58. this.add(key_north, BorderLayout.NORTH);
  59. }
  60. //添加中间按键
  61. public void addCenterButton() {
  62. String key_text = "H()←123+456-789*0.=/";//中间控件排版
  63. this.center.setLayout(new GridLayout(5, 4));
  64. String regex = "[+\\-*/=H()←]";
  65. for (int i = 0; i < 20; i++) { //初始化按键
  66. String temp = key_text.substring(i, i + 1);
  67. JButton key = new JButton();
  68. key.setFont(new Font("宋体",Font.BOLD,20));
  69. key.setForeground(new Color(69,139,116));
  70. key.setBackground(new Color(193,255,193));
  71. key.setText(temp);
  72. if (temp.matches(regex)) { //将运算符加粗并更改颜色
  73. key.setFont(new Font("粗体", Font.BOLD, 30));
  74. key.setForeground(new Color(102,205,170));
  75. }
  76. key.addActionListener(this);
  77. center.add(key);
  78. }
  79. this.add(center, BorderLayout.CENTER);
  80. }

2,计算器功能设计

设置监听

设两个空字符串,一个用来保存表达式,另一个用来保存历史记录

为所有按键设置监听功能,将输入的表达式显示到文本框的右边,并实现计算结果,查看历史记录,清空历史记录,计算器表达式退格功能,判断表达式合法性.

  1. @Override
  2. public void actionPerformed(ActionEvent e) { //监听功能
  3. String strings = e.getActionCommand();//保存记录
  4. //JOptionPane.showMessageDialog(this,strings);//监听
  5. if ("0123456789".contains(strings)) {
  6. if (Objects.equals(firstint, "")) { //输入新的表达式,清除掉上一个表达式结果
  7. firstint+=strings;
  8. this.input_text.setText(strings);
  9. this.input_text.setHorizontalAlignment(JTextField.RIGHT);//显示到右边
  10. }else if(strings.equals("0")){
  11. if (Objects.equals(firstint, "0")) {
  12. this.input_text.setText(firstint);
  13. }else {
  14. int index = 0;
  15. for ( int i=firstint.length()-1;i >=0;i-- ) {
  16. if(isSymbol(firstint.substring(index))){
  17. index=i;
  18. }
  19. }
  20. if (!firstint.substring(index+1, firstint.length() - 1).equals("0")) {
  21. firstint += strings;
  22. }
  23. this.input_text.setText(firstint);
  24. }
  25. } else if(firstint.charAt(firstint.length()-1)==')'){ //)后输入数字补*号
  26. firstint+="*"+strings;
  27. this.input_text.setText(firstint);
  28. }else {this.input_text.setText(input_text.getText() + strings);//将输入的数记录并将之前的数放到前面
  29. this.input_text.setHorizontalAlignment(JTextField.RIGHT);//显示到右边
  30. firstint += strings;
  31. System.out.println(firstint);}
  32. } else if (strings.equals(".")) {
  33. if (Objects.equals(firstint, "")) {
  34. if (!Objects.equals(ans, "")) {
  35. firstint = ans + ".";
  36. this.input_text.setText(firstint);
  37. }else {this.input_text.setText(input_text.getText() + "0" + strings);
  38. this.input_text.setHorizontalAlignment(JTextField.RIGHT); //自带补0
  39. firstint = "0" + strings;}
  40. } else if(firstint.charAt(firstint.length() - 1) == ')'){ //)后输入小数点补0
  41. firstint =firstint+ "*0"+strings;
  42. this.input_text.setText(firstint);
  43. }
  44. else if (firstint.charAt(firstint.length() - 1) == '.') { //不能连续小数点
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/275785
推荐阅读
相关标签
  

闽ICP备14008679号