一边学车一边看视频,只有晚上有空,真痛苦。。有木有同样境遇的同学。。。。
今天中午看完了毕老师的基础视频,受益匪浅啊,感觉java和C++差的真多。。比如for循环
- for(int i = 0;i < 100; i ++){
- int x = i + 1;
- //....
- }
复制代码 Java虚拟机在每次for循环开始都会在栈中开辟新变量x,每次循环结束都会销毁x。而C++只会执行一次int x,以后每次for循环只会执行x = i + 1。效率差距好大。。
进入正题,中午领了阳哥的技术分活动21期,受此激发就做了一个计算器,以前java课程设计也做过计算器,但是都是“简单版”的,最近看毕老师视频看的豪气干云,就狠心要写一个“相对高级版”的。可以处理像“(2.99-4.32)*(90.8-78.66)+78.0/3.14”这样的所有书写正确的表达式。
都是泪啊,一个 if(Stack<String>.peek() =="(")低级错误调试了一个多小时。。C++习惯改不过来。。
核心计算代码分析.
输入完成,点击"=键"的时候,会拿到一个中缀表达式字符串比如"a + b * c + ( d * e + f ) * g ",写算法的时候中缀不方便计算,要先转换成后缀表达式为"a b c * + d e * f + g * +",然后利用栈操作计算,更详细的说明在这里 http://www.cnblogs.com/ifinver/p/4017969.html
核心计算类:
先封装了一个用JFrame做的界面 MyWindow,它的init()方法把传入Listener添加在按钮和文本框上:
- public class MyWindow extends JFrame {
- private JTextField jti = new JTextField(20);// 输入文本框
- private JTextField jto = new JTextField(20);//显示结果的文本框
- private JButton[] jb = new JButton[27];
- private String[] arr = {"7", "8", "9", "/", "CE",
- "4", "5", "6", "*","(","1","2","3", "+",")","0",".","C","-","=" };
- private JPanel jp = new JPanel();// 主面板
- private JPanel m = new JPanel();// 次面板
- private GridLayout glo = new GridLayout(6, 1, 3, 3);// 主网格布局
- private GridLayout glo1 = new GridLayout(1, 5, 4, 4);// 次网格布局
- protected MyWindow(){}
- //初始化界面,传入一个键盘监听类和动作监听类
- protected void init(KeyListener kl,ActionListener al) {}
- //得到输入的表达式字符串
- protected String getInput(){}
- //在文本框里显示字符串
- protected void setAnswer(String ans){}
- //清除输入,比如点击"CE"键
- protected void clearInput(){}
- //回退一个输入,比如点击"C"键
- protected void backspace(){}
- //向输入文本框里输入字符串
- protected void type(String str){}
- }
复制代码
按钮动作监听类
- public class MyActionListener implements ActionListener{
- private MyWindow mw;
- protected MyActionListener(MyWindow my){
- this.mw = my;
- }
- /**
- * 点击按钮动作
- */
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- JButton btn = (JButton)e.getSource();
- String cmd = btn.getText();
- if("=".equals(cmd)){
- //点击=按钮时计算结果
- MyMainAlgorithm mma = new MyMainAlgorithm();
- String str = mma.getAnswer(mw.getInput());
- mw.setAnswer(str);//将结果显示在结果文本框里
- }else if("CE".equals(cmd)){
- mw.clearInput();//清空输入
- }else if("C".equals(cmd)){
- mw.backspace();//回退一个字符
- }else{
- mw.type(cmd);
- }
- }
- }
复制代码
键盘监听类,偷懒了。。
- public class MyKeyListener extends KeyAdapter {
- private MyWindow mw;
- protected MyKeyListener(MyWindow my){
- this.mw = my;
- }
- /**
- * 在输入框里按下字符处理code
- */
- @Override
- public void keyTyped(KeyEvent e) {
- // TODO Auto-generated method stub
- //懒的写了,直接截死了。
- mw.setAnswer("懒的写键盘处理code了,就用鼠标点把。");
- new Thread(new Runnable(){
- @Override
- public void run() {
- // TODO Auto-generated method stub
- try {
- Thread.sleep(900);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- mw.setAnswer("0.");
- }
- }).start();
- e.consume();
- }
- }
复制代码
主函数
- public class MyCalculator {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- MyWindow w = new MyWindow();
-
- MyActionListener mal = new MyActionListener(w);
- MyKeyListener mkl = new MyKeyListener(w);
-
- w.init(mkl, mal);
-
- w.setVisible(true);
-
- }
- }
复制代码
附上整个项目,javaSE1.7的
|