当前位置:   article > 正文

java简易计算器(四则运算、三角函数、实现优先级)_java实现简单计算器四则运算,三角函数

java实现简单计算器四则运算,三角函数

本人大一新手小白一枚,今天是我开通博客的第一天,发个java计算器纪念一下。

诸位有意见可以提,有不懂的也可以问,但不保证才疏学浅的博主能回答上来闭嘴闭嘴

希望以后能和你们一起共同进步,共勉!奋斗

先放上博主的代码

下面的是界面和一部分运算代码:

  1. import java.awt.*;
  2. import javax.swing.*;
  3. import java.awt.event.*;
  4. public class Calculator extends JFrame
  5. {
  6. static JFrame frame=new JFrame("计算器");
  7. JTextField display=new JTextField("0");
  8. Font font=new Font("Consolas",Font.BOLD,40); //设置字体样式
  9. Font font1=new Font("Consolas",Font.BOLD,20);
  10. Image iconImage=(new ImageIcon("C:\\Study\\eclipse-workspace\\Calculator\\src\\计算器2.png")).getImage();
  11. ImageIcon iconImage2=new ImageIcon("C:\\Study\\eclipse-workspace\\Calculator\\src\\删除.png");
  12. actionlistener al=new actionlistener();//创建监听器action listener的对象
  13. //计算器按键
  14. JButton button_clear=new JButton("C");
  15. JButton button_delete=new JButton(iconImage2);
  16. JButton button_plus=new JButton("+");
  17. JButton button_minus=new JButton("-");
  18. JButton button_multiply=new JButton("*");
  19. JButton button_divide=new JButton("/");
  20. JButton button_spot=new JButton(".");
  21. JButton button_is=new JButton("=");
  22. JButton button_sin=new JButton("sin");
  23. JButton button_cos=new JButton("cos");
  24. JButton button_tan=new JButton("tan");
  25. JButton button_log=new JButton("log");
  26. JButton button_bracket_r=new JButton("(");
  27. JButton button_bracket_l=new JButton(")");
  28. JButton[] button=new JButton[10];
  29. public Calculator()
  30. {
  31. super();
  32. //设置按钮颜色字体和监听器
  33. for (int i = 0; i < 10; i++)
  34. {
  35. button[i] = new JButton(""+i);
  36. button[i].setBackground(Color.white);//设置按钮颜色
  37. button[i].setFont(font1); //设置按钮字体
  38. button[i].addActionListener(al); //注册监听器
  39. }
  40. //设置按钮颜色
  41. button_plus.setBackground(Color.white);
  42. button_is.setBackground(Color.pink);
  43. button_minus.setBackground(Color.white);
  44. button_multiply.setBackground(Color.white);
  45. button_divide.setBackground(Color.white);
  46. button_spot.setBackground(Color.white);
  47. button_clear.setBackground(Color.white);
  48. button_delete.setBackground(Color.white);
  49. button_sin.setBackground(Color.white);
  50. button_cos.setBackground(Color.white);
  51. button_tan.setBackground(Color.white);
  52. button_log.setBackground(Color.white);
  53. button_bracket_r.setBackground(Color.white);
  54. button_bracket_l.setBackground(Color.white);
  55. //设置按键透明
  56. button_sin.setOpaque(false);
  57. button_cos.setOpaque(false);
  58. button_log.setOpaque(false);
  59. button_tan.setOpaque(false);
  60. button_plus.setOpaque(false);
  61. button_minus.setOpaque(false);
  62. button_multiply.setOpaque(false);
  63. button_divide.setOpaque(false);
  64. button_spot.setOpaque(false);
  65. //设置按钮字体
  66. button_plus.setFont(font1);
  67. button_is.setFont(font1);
  68. button_minus.setFont(font1);
  69. button_multiply.setFont(font1);
  70. button_divide.setFont(font1);
  71. button_spot.setFont(font1);
  72. button_clear.setFont(font1);
  73. button_delete.setFont(font1);
  74. button_sin.setFont(font1);
  75. button_cos.setFont(font1);
  76. button_tan.setFont(font1);
  77. button_log.setFont(font1);
  78. button_bracket_r.setFont(font1);
  79. button_bracket_l.setFont(font1);
  80. //计算器界面布局
  81. frame.setIconImage(iconImage);
  82. display.setHorizontalAlignment(JTextField.RIGHT);
  83. display.setFont(font);
  84. display.setBackground(Color.white);
  85. display.setEditable(false); //设置文本框不可编辑
  86. JPanel pan1=new JPanel(); //设置文本框布局
  87. pan1.setLayout(new GridLayout(1,1,5,5));
  88. pan1.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));
  89. pan1.add(display);
  90. JPanel panBody=new JPanel(); //将按键加入panBody中
  91. panBody.setLayout(new GridLayout(6,4));
  92. panBody.add(button_clear);
  93. panBody.add(button_delete);
  94. panBody.add(button_bracket_r);
  95. panBody.add(button_bracket_l);
  96. panBody.add(button_sin);
  97. panBody.add(button_cos);
  98. panBody.add(button_tan);
  99. panBody.add(button_log);
  100. panBody.add(button[7]);
  101. panBody.add(button[8]);
  102. panBody.add(button[9]);
  103. panBody.add(button_plus);
  104. panBody.add(button[4]);
  105. panBody.add(button[5]);
  106. panBody.add(button[6]);
  107. panBody.add(button_minus);
  108. panBody.add(button[1]);
  109. panBody.add(button[2]);
  110. panBody.add(button[3]);
  111. panBody.add(button_multiply);
  112. panBody.add(button_divide);
  113. panBody.add(button[0]);
  114. panBody.add(button_spot);
  115. panBody.add(button_is);
  116. panBody.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
  117. //创建框架窗口
  118. frame.setLayout(new BorderLayout()); //布局
  119. frame.add(pan1,BorderLayout.NORTH);
  120. frame.add(panBody,BorderLayout.CENTER);
  121. frame.setSize(480, 380); //大小
  122. frame.setLocation(260, 150); //位置
  123. frame.setVisible(true);
  124. frame.setResizable(false);
  125. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  126. //注册监听器
  127. button_plus.addActionListener(al);
  128. button_minus.addActionListener(al);
  129. button_multiply.addActionListener(al);
  130. button_divide.addActionListener(al);
  131. button_is.addActionListener(al);
  132. button_spot.addActionListener(al);
  133. button_clear.addActionListener(al);
  134. button_delete.addActionListener(al);
  135. button_sin.addActionListener(al);
  136. button_cos.addActionListener(al);
  137. button_tan.addActionListener(al);
  138. button_log.addActionListener(al);
  139. button_bracket_r.addActionListener(al);
  140. button_bracket_l.addActionListener(al);
  141. //设置热键
  142. button[0].setMnemonic(KeyEvent.VK_0);
  143. button[1].setMnemonic(KeyEvent.VK_1);
  144. button[2].setMnemonic(KeyEvent.VK_2);
  145. button[3].setMnemonic(KeyEvent.VK_3);
  146. button[4].setMnemonic(KeyEvent.VK_4);
  147. button[5].setMnemonic(KeyEvent.VK_5);
  148. button[6].setMnemonic(KeyEvent.VK_6);
  149. button[7].setMnemonic(KeyEvent.VK_7);
  150. button[8].setMnemonic(KeyEvent.VK_8);
  151. button[9].setMnemonic(KeyEvent.VK_9);
  152. button_delete.setMnemonic(KeyEvent.VK_BACK_SPACE);
  153. button_clear.setMnemonic(KeyEvent.VK_CLEAR);
  154. button_spot.setMnemonic(KeyEvent.VK_PERIOD);
  155. button_is.setMnemonic(KeyEvent.VK_EQUALS);
  156. button_plus.setMnemonic(KeyEvent.VK_ADD);
  157. button_minus.setMnemonic(KeyEvent.VK_SUBTRACT);
  158. button_multiply.setMnemonic(KeyEvent.VK_MULTIPLY);
  159. button_divide.setMnemonic(KeyEvent.VK_SLASH);
  160. }
  161. //定义处理事件的类
  162. public class actionlistener implements ActionListener
  163. {
  164. RPN rpn;
  165. public String pre_display="";
  166. public void actionPerformed(ActionEvent e)
  167. {
  168. Object click1=e.getSource(); //获得组件名称
  169. String click2=e.getActionCommand(); //获得组件标签
  170. if(click1==button_clear) //初始化文本框
  171. {
  172. pre_display="";
  173. display.setText("0");
  174. }
  175. else if(click1==button_delete) //用handleClear()方法处理delete
  176. {
  177. if(!pre_display.equals(""))
  178. display.setText(handleDelete(pre_display));
  179. else
  180. display.setText(handleDelete(display.getText()));
  181. }
  182. else if(click2=="=")
  183. {
  184. //计算表达式
  185. rpn=new RPN(display.getText());
  186. rpn.ListPreExpressionToListExpression();
  187. if(rpn.Opera_ListExpr().equals("illegal!"))
  188. display.setText("illegal!");
  189. else if(rpn.Opera_ListExpr().equals("non-existent!"))
  190. display.setText("non-existent!");
  191. else
  192. {
  193. double result=Double.valueOf(rpn.Opera_ListExpr()).doubleValue();
  194. //数据类型转换
  195. long t1=(long)result;
  196. double t2=result-t1;
  197. if(t2==0)
  198. display.setText(String.valueOf(t1));
  199. else
  200. display.setText(String.valueOf(result));
  201. }
  202. pre_display="";
  203. }
  204. else
  205. {
  206. if(click2=="tan")
  207. click2="tan(";
  208. else if(click2=="sin")
  209. click2="sin(";
  210. else if(click2=="cos")
  211. click2="cos(";
  212. else if(click2=="log")
  213. click2="log(";
  214. pre_display+=click2;
  215. display.setText(pre_display);
  216. }
  217. }
  218. //退格键
  219. public String handleDelete(String text)
  220. {
  221. int textLength=text.length();
  222. if(textLength>0)
  223. {
  224. text=text.substring(0, textLength-1); //去掉最后一个字符
  225. if(text.length()==0) //若文本框为空,则初始化为“0”
  226. {
  227. text="0";
  228. }
  229. pre_display=text;
  230. return text;
  231. }
  232. else
  233. return "illegal!";
  234. }
  235. }
  236. public static void main(String[] args)
  237. {
  238. Calculator calculator=new Calculator();
  239. }
  240. }

下面是逆波兰算法实现运算的代码:

  1. import java.util.ArrayList;
  2. import java.util.Stack;
  3. import java.util.StringTokenizer;
  4. public class RPN
  5. {
  6. private Stack<String> StackOperator=new Stack<>(); //存放运算符的栈
  7. private ArrayList<String> ListPreExpression=new ArrayList<String>(); //存放原表达式
  8. private ArrayList<String> ListExpression=new ArrayList<String>(); //存放逆波兰表达式
  9. private Stack<String> StackOperation=new Stack<>(); //运算栈
  10. //分割表达式(初始化)
  11. public RPN (String PreExpression)
  12. {
  13. //以+-*/()为分割符,对原始表达式(字符串)进行分割,并返回分割符
  14. StringTokenizer stringTokenizer=new StringTokenizer(PreExpression,"\\+|\\-|\\*|\\/|\\(|\\)",true);
  15. while(stringTokenizer.hasMoreTokens())
  16. {
  17. ListPreExpression.add(stringTokenizer.nextToken());
  18. }
  19. }
  20. //判断是否为运算符
  21. public boolean isOperator(String str)
  22. {
  23. if("+-*/tancossinlog()".indexOf(str)>=0)
  24. return true;
  25. else
  26. return false;
  27. }
  28. //获取运算符的优先级
  29. public int getPriority(String str)
  30. {
  31. int a;
  32. switch(str)
  33. {
  34. case "+":
  35. case "-":a=1;break;
  36. case "*":
  37. case "/":a=2;break;
  38. case "(":a=4;break;
  39. case ")":a=0;break;
  40. case "tan":
  41. case "sin":
  42. case "cos":
  43. case "log":a=3;break;
  44. default: a=-1;break;
  45. }
  46. return a;
  47. }
  48. //比较优先级大小
  49. public boolean ComparePriority(String str1,String str2)
  50. {
  51. return getPriority(str1)>getPriority(str2);
  52. }
  53. //运算符入栈
  54. public void OperatorToStack(String str)
  55. {
  56. if(StackOperator.isEmpty()) //判断栈是否为空
  57. StackOperator.push(str);
  58. else if("(".equals(str)) //判断传入的运算符是否为"("
  59. StackOperator.push(str);
  60. else if(")".equals(str)) //判断传入的运算符是否为")"
  61. {
  62. String string;
  63. while(!"(".equals(string=StackOperator.pop())) //将"("和")"之间的操作符存放到ListExpression中
  64. ListExpression.add(string);
  65. }
  66. else if("(".equals(StackOperator.peek())) //若栈顶元素为(,运算符直接入栈
  67. StackOperator.push(str);
  68. else if(ComparePriority(str,StackOperator.peek()))//若str优先级大于栈顶元素则入栈
  69. StackOperator.push(str);
  70. else if(!ComparePriority(str,StackOperator.peek()))//若小于则将栈顶元素弹出,str与下一个元素比较
  71. {
  72. ListExpression.add(StackOperator.pop());
  73. OperatorToStack(str);
  74. }
  75. }
  76. //中缀表达式转换成后缀表达式
  77. public void ListPreExpressionToListExpression()
  78. {
  79. for(String str:ListPreExpression) //遍历ListPreExpression,运算符加入OperatorToStack,数字加入ListExpression
  80. {
  81. if(isOperator(str))
  82. OperatorToStack(str);
  83. else
  84. ListExpression.add(str);
  85. }
  86. //遍历完原始表达式后,将StackOperator栈内的运算符全部添加到ListExpression中
  87. while(!StackOperator.isEmpty())
  88. {
  89. ListExpression.add(StackOperator.pop());
  90. }
  91. }
  92. //计算方法
  93. //双目运算
  94. public int open=0;//用于判断输入是否正确
  95. public double Operation2(String str1,String str2,String str3)
  96. {
  97. double num1,num2;
  98. num2=Double.valueOf(str1).doubleValue();
  99. num1=Double.valueOf(str2).doubleValue();
  100. if(str3.equals("+"))
  101. return num1+num2;
  102. else if(str3.equals("-"))
  103. return num1-num2;
  104. else if(str3.equals("*"))
  105. return num1*num2;
  106. else
  107. {
  108. if(num2==0) //除数为零时,open=1,后面会对open=1进行输出“illegal”。
  109. open=1;
  110. return num1/num2;
  111. }
  112. }
  113. //单目运算
  114. public double Operation1(String str1,String str2)
  115. {
  116. double num1;
  117. num1=Double.valueOf(str1).doubleValue();
  118. if(str2.equals("tan"))
  119. {
  120. if(num1==90) //tan(90)不存在,open=2,其后的代码会输出“non-existent!"
  121. open=2;
  122. return 1;
  123. }
  124. else if(str2.equals("sin"))
  125. return Math.sin(num1);
  126. else if(str2.equals("cos"))
  127. return Math.cos(num1);
  128. else
  129. return Math.log(num1);
  130. }
  131. //计算逆波兰表达式
  132. public String Opera_ListExpr()
  133. {
  134. int open2=0; //用于判断输入是否正确
  135. for(String str:ListExpression)
  136. {
  137. if(str.equals("(")||str.equals(")")) //若ListExpression中含有括号,则报错
  138. open2=1;
  139. else if(!isOperator(str)) //把数字存放进运算栈中
  140. StackOperation.push(str);
  141. else if("tansincoslog".indexOf(str)>=0) //tan、sin、cos、log进行单目运算
  142. StackOperation.push(String.valueOf(Operation1(StackOperation.pop(),str)));
  143. else
  144. //其它运算符进行双目运算
  145. StackOperation.push(String.valueOf(Operation2(StackOperation.pop(),StackOperation.pop(),str)));
  146. }
  147. if(open==1||open2==1)
  148. {
  149. open=0;
  150. return "illegal!";
  151. }
  152. else if(open==2)
  153. {
  154. open=0;
  155. return "non-existent!";
  156. }
  157. else
  158. return StackOperation.pop();
  159. }
  160. public static void main(String[] args)
  161. {
  162. }
  163. }

希望能够帮到各位,也欢迎各位给我提提建议,谢谢啦~

 

源代码链接:

  • 百度网盘:

链接:https://pan.baidu.com/s/1M8Bfi1K7KhOP5ZNitK-N3g 
提取码:kbbe 

  • csdn下载:

https://download.csdn.net/download/sylvia_17/10979460

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/275738
推荐阅读
相关标签
  

闽ICP备14008679号