当前位置:   article > 正文

JAVA简易计算器_简单计算器java例子

简单计算器java例子

一、功能描述

1.C是清除键,功能是将之前所输入的数字、计算结果等信息全部归零

2.CE,清除当前输入的数据或符号

3.单击MS存储当前显示值,可以理解为放到存储区

4.单击MC清除存储区数值

5.单击MR将存储区数据显示到屏幕上

6.M+:当前显示的数与存储区的数相加

7.M-:当前显示的数与存储区的数相减

二、整体思路

首先对于图形显示上,底层容器采用边界布局在边界的北方和中间分别加入了两个面板。一个采用流式布局的面板添加了一个文本框,一个采用了6*5网格布局的面板添加了很多按钮。

具体实现上,对于按钮,我分成了num数字键和function功能键。创建对象时,这块代码太过冗长便把这一部分整体写成一个surface()函数。函数实现了文本框、按钮、面板的创建,菜单条的创建,同时将文本框、按钮都添加到面板中,菜单添加到菜单条中等。另外,设置了一个str字符串数组,实现存储两个操作数、操作符、暂时存储计算结果、寄存器。设置了一个布尔类型变量标志第一个数是否存在。register()函数实现对文本框、按钮注册监视器。

整体代码思想使用了getActionCommand()函数读取命令。再通过字符串函数equal()函数判断是什么符号,之后对不同符号采取不同的操作。以加法为例,通过equal函数进入到加法的分支语句,首先读取文本框内容作为第一个操作数,将字符串存入str[0],再将操作符加号存入str[1],将标志位flag1设置成true,表示存在第一个数据。文本框清空,输入第二个数据,单击“=”按钮。进入等于的分支语句,“=”按钮中对操作码进行了讨论,若为单目运算(百分数、开根号等),一个操作数即可运算;若为双目运算,需要先读取文本框的内容作为第二个操作数,存入str[2],若第一个操作数存在,两个操作数做操作码的运算,将结果存入str[4]。若第一个数据不存在,文本框输出“错误输入!”

三、具体实现代码

  1. package sohu;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5. public class calculate extends JFrame implements ActionListener{
  6. JPanel jp1,jp2;//两个面板,一个放文本框,一个放按钮
  7. JButton num[],function[];//数字键num,功能键function
  8. JTextField jtf1;//文本框
  9. JMenuBar jm;//菜单条
  10. JMenu jmi1,jmi2,jmi3;//菜单
  11. private String[] str={"","","","","",""};
  12. //str[0]:第一个数 str[1]:运算符 str[2]:第二个数
  13. //str[3]:MS str[4]:缓存存入MS的数
  14. private boolean flag1=false;//是否写入第一个数
  15. public static void main(String[] args) {
  16. // TODO Auto-generated method stub
  17. calculate win=new calculate();
  18. }
  19. void surface(){//计算器界面
  20. num=new JButton [10];//数字键
  21. for(int i=0;i<num.length;i++){
  22. num[i]=new JButton(""+i);
  23. num[i].setFont(new Font("黑体", Font.BOLD, 30));
  24. }
  25. function=new JButton [18];//功能键
  26. function[0]=new JButton("MC");//清除存储区中的数值
  27. function[0].setFont(new Font("黑体", Font.BOLD, 30));
  28. function[1]=new JButton("MR");//将存储区的数显示到显示栏中
  29. function[1].setFont(new Font("黑体", Font.BOLD, 30));
  30. function[2]=new JButton("MS");//存储当前显示的值
  31. function[2].setFont(new Font("黑体", Font.BOLD, 30));
  32. function[3]=new JButton("M+");//当前显示的数与存储区的数相加
  33. function[3].setFont(new Font("黑体", Font.BOLD, 30));
  34. function[4]=new JButton("M-");//当前显示的数与存储区的数相减
  35. function[4].setFont(new Font("黑体", Font.BOLD, 30));
  36. function[5]=new JButton("←");//删除
  37. function[5].setFont(new Font("黑体", Font.BOLD, 30));
  38. function[6]=new JButton("CE");//清除当前输入的数据或符号 存储区内容不变
  39. function[6].setFont(new Font("黑体", Font.BOLD, 30));
  40. function[7]=new JButton("C");//将之前输入
  41. function[7].setFont(new Font("黑体", Font.BOLD, 30));
  42. function[8]=new JButton("±");//同时输出加和减
  43. function[8].setFont(new Font("黑体", Font.BOLD, 30));
  44. function[9]=new JButton("√");//求平方根
  45. function[9].setFont(new Font("黑体", Font.BOLD, 30));
  46. function[10]=new JButton("/");//除
  47. function[10].setFont(new Font("黑体", Font.BOLD, 30));
  48. function[11]=new JButton("%");//百分数
  49. function[11].setFont(new Font("黑体", Font.BOLD, 30));
  50. function[12]=new JButton("*");//乘
  51. function[12].setFont(new Font("黑体", Font.BOLD, 30));
  52. function[13]=new JButton("1/x");//取倒数
  53. function[13].setFont(new Font("黑体", Font.BOLD, 30));
  54. function[14]=new JButton("-");//减
  55. function[14].setFont(new Font("黑体", Font.BOLD, 30));
  56. function[15]=new JButton("+");//加
  57. function[15].setFont(new Font("黑体", Font.BOLD, 30));
  58. function[16]=new JButton(".");//小数点
  59. function[16].setFont(new Font("黑体", Font.BOLD, 30));
  60. function[17]=new JButton("=");//等于
  61. function[17].setFont(new Font("黑体", Font.BOLD, 30));
  62. jp1=new JPanel();
  63. jp2=new JPanel();
  64. jtf1=new JTextField(30);//文本框
  65. jtf1.setFont(new Font("黑体", Font.BOLD, 30));
  66. this.setLayout(new BorderLayout());//底层容器采用边界布局
  67. jp1.setLayout(new FlowLayout());//存放文本框的面板采用流布局
  68. jp1.add(jtf1);//文本框
  69. jp2.setLayout(new GridLayout(6,5));//存放按钮的面板采用网格布局6*5
  70. //向面板中添加按钮
  71. for(int i=0;i<10;i++){
  72. jp2.add(function[i]);
  73. }
  74. jp2.add(num[7]);
  75. jp2.add(num[8]);
  76. jp2.add(num[9]);
  77. jp2.add(function[10]);//除
  78. jp2.add(function[11]);//百分数
  79. jp2.add(num[4]);
  80. jp2.add(num[5]);
  81. jp2.add(num[6]);
  82. jp2.add(function[12]);//乘
  83. jp2.add(function[13]);//取倒数
  84. jp2.add(num[1]);
  85. jp2.add(num[2]);
  86. jp2.add(num[3]);
  87. jp2.add(function[14]);//减
  88. jp2.add(new JButton());//空
  89. jp2.add(num[0]);
  90. jp2.add(new JButton());//空
  91. jp2.add(function[16]);//小数点
  92. jp2.add(function[15]);//加
  93. jp2.add(function[17]);//等于
  94. //设置菜单条
  95. jm=new JMenuBar();
  96. jmi1=new JMenu ("查看(V)");
  97. jmi2=new JMenu ("编辑(E)");
  98. jmi3=new JMenu ("帮助(H)");
  99. //向菜单条中添加菜单
  100. jm.add(jmi1);
  101. jm.add(jmi2);
  102. jm.add(jmi3);
  103. this.setJMenuBar(jm);//将菜单条加到容器中
  104. this.add(jp1,BorderLayout.NORTH);//添加文本框面板
  105. this.add(jp2,BorderLayout.CENTER);//添加按钮面板
  106. }
  107. void register(){//注册监视器
  108. for(int i=0;i<num.length;i++){
  109. num[i].addActionListener(this);
  110. }
  111. for(int i=0;i<function.length;i++){
  112. function[i].addActionListener(this);
  113. }
  114. jtf1.addActionListener(this);
  115. }
  116. calculate(){
  117. surface();//外观设置
  118. register();//注册监视器
  119. //基本属性设置
  120. this.setTitle("计算器");
  121. this.setSize(600,600);
  122. this.setLocation(300,300);
  123. this.setVisible(true);
  124. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  125. }
  126. @Override
  127. public void actionPerformed(ActionEvent e) {
  128. // TODO Auto-generated method stub
  129. String ss=e.getActionCommand();//读命令
  130. //判断命令
  131. if(ss.equals("MC")){
  132. str[3]="0";
  133. }
  134. else if(ss.equals("MR")){
  135. jtf1.setText("");//文本框清空
  136. jtf1.setText(str[3]);//将缓冲区数值输出到文本框中
  137. }
  138. else if(ss.equals("MS")){
  139. str[3]=jtf1.getText();//将暂缓的str[4]存到寄存器中
  140. }
  141. else if(ss.equals("M+")){//数据与str[3]做加法
  142. double a=Double.parseDouble(str[3]);
  143. str[4]=jtf1.getText();
  144. double b=Double.parseDouble(str[4]);
  145. str[3]=""+(a+b);//将结果转为字符串,存入str[3]
  146. str[4]=str[3];
  147. jtf1.setText("");
  148. jtf1.setText(str[3]);
  149. }
  150. else if(ss.equals("M-")){//数据与str[3]做减法
  151. double a=Double.parseDouble(str[3]);
  152. str[4]=jtf1.getText();
  153. double b=Double.parseDouble(str[4]);
  154. str[3]=""+(b-a);//将结果转为字符串,存入str[3]
  155. str[4]=str[3];
  156. jtf1.setText("");
  157. jtf1.setText(str[3]);
  158. }
  159. else if(ss.equals("←")){//删除当先数据的一位
  160. str[4]=jtf1.getText();
  161. if(str[4].length()==0)
  162. jtf1.setText("");
  163. else{
  164. str[4]=str[4].substring(0,str[4].length()-1);
  165. jtf1.setText(str[4]);
  166. }
  167. }
  168. else if(ss.equals("CE")){//清空当前输入文本框内容
  169. jtf1.setText("");
  170. }
  171. else if(ss.equals("C")){
  172. str[0]=str[1]=str[2]=str[4]="";//清空所有数据和符号
  173. jtf1.setText("");
  174. }
  175. else if(ss.equals("±")){//同时计算加法和减法
  176. str[0]=jtf1.getText();
  177. if(str[0].length()==0) {
  178. jtf1.setText("错误输入!");
  179. }
  180. else{
  181. str[1]="±";
  182. flag1=true;
  183. jtf1.setText("");
  184. }
  185. }
  186. else if(ss.equals("√")){//开根号
  187. str[1]="√";
  188. }
  189. else if(ss.equals("/")){//除法
  190. str[0]=jtf1.getText();
  191. if(str[0].length()==0) {
  192. jtf1.setText("错误输入!");
  193. }
  194. else{
  195. str[1]="/";
  196. flag1=true;
  197. jtf1.setText("");
  198. }
  199. }
  200. else if(ss.equals("%")){//求百分数
  201. str[0]=jtf1.getText();
  202. if(str[0].length()==0) {
  203. jtf1.setText("错误输入!");
  204. }
  205. else{
  206. str[1]="%";
  207. flag1=true;
  208. jtf1.setText("");
  209. }
  210. }
  211. else if(ss.equals("*")){//乘法
  212. str[0]=jtf1.getText();
  213. if(str[0].length()==0)
  214. jtf1.setText("错误输入!");
  215. else{
  216. str[1]="*";
  217. flag1=true;
  218. jtf1.setText("");
  219. }
  220. }
  221. else if(ss.equals("1/x")){//除法
  222. str[0]=jtf1.getText();
  223. double a=Double.parseDouble(str[0]);
  224. if(a==0)
  225. jtf1.setText("0不能做除数");
  226. else{
  227. jtf1.setText(""+1/a);
  228. }
  229. }
  230. else if(ss.equals("-")){//减法
  231. str[0]=jtf1.getText();
  232. if(str[0].length()==0)
  233. jtf1.setText("错误输入!");
  234. else{
  235. str[1]="-";
  236. flag1=true;
  237. jtf1.setText("");
  238. }
  239. }
  240. else if(ss.equals("+")){//加法
  241. str[0]=jtf1.getText();
  242. if(str[0].length()==0)
  243. jtf1.setText("错误输入!");
  244. else{
  245. str[1]="+";
  246. flag1=true;
  247. jtf1.setText("");
  248. }
  249. }
  250. else if(ss.equals("=")){//输出最后结果
  251. //单目运算
  252. if(str[1]=="√"){
  253. str[0]=jtf1.getText();
  254. double a=Double.parseDouble(str[0]);
  255. if(a<0) {
  256. jtf1.setText("错误输入!");
  257. }
  258. else
  259. jtf1.setText(""+Math.sqrt(a));
  260. }
  261. else if(str[1].equals("1/x")){
  262. str[0]=jtf1.getText();
  263. double a=Double.parseDouble(str[0]);
  264. if(a==0)
  265. jtf1.setText("0不能做除数");
  266. else{
  267. jtf1.setText(""+1/a);
  268. }
  269. }
  270. else if(str[1].equals("%")){
  271. if(flag1){
  272. double a=Double.parseDouble(str[0]);
  273. a*=0.01;
  274. str[4]=str[0];
  275. jtf1.setText(""+a);
  276. }
  277. else
  278. jtf1.setText("错误输入");
  279. }
  280. //双目运算
  281. else if(str[1].equals("+")){
  282. str[2]=jtf1.getText();
  283. if(flag1==true){//第一个数据是否存在
  284. double a=Double.parseDouble(str[0]);
  285. double b=Double.parseDouble(str[2]);
  286. str[4]=""+(a+b);//暂时保留结果
  287. jtf1.setText(str[4]);
  288. }
  289. else{
  290. jtf1.setText("错误输入!");
  291. }
  292. }
  293. else if(str[1].equals("-")){
  294. str[2]=jtf1.getText();
  295. if(flag1==true){//第一个数据是否存在
  296. double a=Double.parseDouble(str[0]);
  297. double b=Double.parseDouble(str[2]);
  298. str[4]=""+(a-b);//暂时保留结果
  299. jtf1.setText(str[4]);
  300. }
  301. else{
  302. jtf1.setText("错误输入!");
  303. }
  304. }
  305. else if(str[1].equals("*")){
  306. str[2]=jtf1.getText();
  307. if(flag1==true){//第一个数据是否存在
  308. double a=Double.parseDouble(str[0]);
  309. double b=Double.parseDouble(str[2]);
  310. str[4]=""+(a*b);//暂时保留结果
  311. jtf1.setText(str[4]);
  312. }
  313. else{
  314. jtf1.setText("错误输入!");
  315. }
  316. }
  317. else if(str[1].equals("/")){
  318. str[2]=jtf1.getText();
  319. if(flag1==true){//第一个数据是否存在
  320. double a=Double.parseDouble(str[0]);
  321. double b=Double.parseDouble(str[2]);
  322. if(b==0){//0不可以作为除数
  323. jtf1.setText("0不能作为除数");
  324. }
  325. else{
  326. str[4]=""+(a/b);//暂时保留结果
  327. jtf1.setText(str[4]);
  328. }
  329. }
  330. else{
  331. jtf1.setText("错误输入!");
  332. }
  333. }
  334. else if(str[1].equals("±")){//同时输出加法和减法
  335. str[2]=jtf1.getText();
  336. if(flag1==true){//第一个数据是否存在
  337. double a=Double.parseDouble(str[0]);
  338. double b=Double.parseDouble(str[2]);
  339. str[4]=""+(a+b)+"&"+(a-b);//暂时保留结果,将结果存入str[3]无意义
  340. jtf1.setText(str[4]);
  341. flag1=false;
  342. }
  343. else{
  344. jtf1.setText("错误输入!");
  345. }
  346. }
  347. }
  348. //在文本框显示数字
  349. else if(ss.equals("0")){
  350. jtf1.setText(jtf1.getText()+"0");
  351. }
  352. else if(ss.equals("1")){
  353. jtf1.setText(jtf1.getText()+"1");
  354. }
  355. else if(ss.equals("2")){
  356. jtf1.setText(jtf1.getText()+"2");
  357. }
  358. else if(ss.equals("3")){
  359. jtf1.setText(jtf1.getText()+"3");
  360. }
  361. else if(ss.equals("4")){
  362. jtf1.setText(jtf1.getText()+"4");
  363. }
  364. else if(ss.equals("5")){
  365. jtf1.setText(jtf1.getText()+"5");
  366. }
  367. else if(ss.equals("6")){
  368. jtf1.setText(jtf1.getText()+"6");
  369. }
  370. else if(ss.equals("7")){
  371. jtf1.setText(jtf1.getText()+"7");
  372. }
  373. else if(ss.equals("8")){
  374. jtf1.setText(jtf1.getText()+"8");
  375. }
  376. else if(ss.equals("9")){
  377. jtf1.setText(jtf1.getText()+"9");
  378. }
  379. }
  380. }

四、运行截图

整体界面:

 开根号:

加减法:

 2±3

 MS将5263存入寄存器,MR显示出来

 25与寄存器中的520相加

 

 “<-”

 

 52的百分数

其余功能不在这一一展示了。 

五、代码不足

        代码仍存在很多问题,例如小数点没有实现,显示“错误输入!”后如果想要重新输入数据必须先单击一下“CE”按钮或“C”按钮,不然数据会跟到“错误输入!”字符串后面,会影响之后的功能。单击清除之后不会有问题。

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

闽ICP备14008679号