我是一个上了大学一年半的大二学生,所以我想以学生的角度写写一些我感受,希望不要笑话我。。。
以上是我上大学以来第一次写一个像点样子的小项目,一个计算器,可以说一个带括号的计算器,因为不带括号的,复杂度太低,算不上什么项目,只能说一些小操作。
我一直以为加了个括号不会多难,后来设计着设计着,复杂度越来越大
下面说说我这三天来写项目过程:
第一:我在想我的计算器项目要哪些功能,我要带括号的,还要带退格功能,刷新功能,小数点等等基本功能,所以我把我的构思画在了纸上,正好20个按钮。再加一个显示屏幕就OK,所以界面我一会就做好了。
第二:我要做的是实现功能,我把几个功能细分出来,一个就是退格功能,一个是刷新功能,最难的就是加上括号处理,还有一个是就小数点处理。一共就这四个功能,只要实现了,基本上就没问题了。
第三:首先我要整体构思,我要怎么样才能把输入的这么一大串数字加减号小数点什么的处理得比较好呢,所以我想在处理最难的那个问题时我想最好能够送入一个字符串,把字符串作为参数,在送入这个字符串之前,其实要先解决那个退格问题,那个退格问题其实比较简单,按了退格,就把字符串最后一个删除,屏幕刷新一下就行。
第四:现在重点来说下处理带括号的表达式问题吧,这个问题其实数据结构里面也有类似的问题,用到栈,符号优先级的判断,分别设两个栈,一个数字栈,一个符号栈。大二上学期我们学过C数据结构,严尉敏的,其实数据结构非常重要,学习数据结构的最高境界就是把里面的抽象算法全都用语言实现出来,大概要至少花半年时间吧,我由于时间问题,和能力问题,实现到了二叉树就叉那了,因为实现太抽像了,呵呵,所以买了本java版的数据结构,继续实现之。用java实现,因为个人比较喜欢java。
第五,如果把处理括号这个大功能能解决,那其它的一些小问题都是小菜了。
在实现这个项目时,我犯了一个非常低级的错误,就是 str!="" str是一个String类型,所以让我苦苦的测试了一天,其它没什么问题,还是CSDN的朋友们帮忙了,谢谢。。。。
我把代码贴上来,有兴趣的朋友可以看看,呵呵。。里面难免会有一些小BUG
- Java code
package caofeng;import java.awt.BorderLayout;import java.awt.Container;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextArea;public class Calculator implements ActionListener{ private String str = ""; private JTextArea jtf; private JFrame frame; private Container contentPane; private String []names={"1","2","3","+","退格", "4","5","6","-","刷新", "7","8","9","*",".", "0","(",")","/","=" }; private JButton []buttons=new JButton[20]; public Calculator(){ //构造方法 frame=new JFrame("Calculator"); //定义一个框架 contentPane=frame.getContentPane(); //获取内容格 JPanel jp1=new JPanel(); //定义一个面板 jtf=new JTextArea("",7,43); jtf.setEditable(false); jp1.add(jtf); JPanel jp2=new JPanel(); jp2.setLayout(new GridLayout(4,5,5,5)); //设置布局管理器 this.fillJP2(jp2); contentPane.add(jp1,BorderLayout.NORTH); contentPane.add(jp2,BorderLayout.SOUTH); frame.setSize(500,300); frame.setVisible(true); } private void fillJP2(JPanel j){ //添加组件 for(int i=0;i<names.length;i++){ buttons[i]=new JButton(names[i]); j.add(buttons[i]); buttons[i].addActionListener(this); } } private boolean isQiTa(String str) { if (str.equals("刷新") || str.equals("退格")) return true; return false; } public void actionPerformed(ActionEvent e){ //事件处理 String strCommand = e.getActionCommand(); if (!isQiTa(strCommand)&&!strCommand.equals("=")) { str += strCommand; jtf.setText(str); } if (strCommand == "退格") { if (str == "") jtf.setText("到头了,你还退什么退啊"); else { if (str.length() == 1){ str =""; jtf.setText(str); } else { str = str.substring(0, str.length() - 1); jtf.setText(str); } } } else if (strCommand == "刷新") { str=""; jtf.setText(str); }else if(strCommand.equals("=")){ str+="="; ///////////////////////////////// float f=new DealwithString().dealwithString(str); //调用 ///////////////////////////////// str+=f; jtf.setText(str); } } public static void main(String args[]){ new Calculator(); }}