<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wangflood

    精心維護一個技術blog,為了工作,也是愛好。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      14 Posts :: 19 Stories :: 8 Comments :: 0 Trackbacks
    這是我在java課程設計上的一個作品。老師要求很簡單,我盡量做得完善,在要求之外,做了不少。
    在小數點,一些windows計算器怪異的地方(3+=+9++4=),參考網上的算法完成。

    算法簡介:
    [=]的功能:

    1.如果前次為一次有效的右數輸入則將當前數賦給右數變量。

    2.檢查符變量是否存在運算符,若存在則計算表達式左數 運算符 右數,并將結果賦給左數變量,同時顯示。若不存在,則不作操作。

    3.清空串變量。

    [四則運算符]的功能:

    1.若前次為一次運算數輸入,則執行[=]

    2.將當前數賦給左右數變量,將運算符賦給符變量。

    3.清空串變量。



    算法具體鏈接:http://blog.csdn.net/haochen_net/archive/2008/10/25/3143290.aspx
    Cal類的實現:


    import java.awt.BorderLayout;
    import java.awt.CheckboxMenuItem;
    import java.awt.Container;
    import java.awt.GridLayout;
    import java.awt.Menu;
    import java.awt.MenuBar;
    import java.awt.MenuItem;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction;

    public class Cal extends JFrame implements ActionListener {
        
    // 菜單
        MenuBar myMenuBar = new MenuBar();
        
    // JPanel
        JPanel pdisplay = new JPanel();
        JPanel pm 
    = new JPanel(new GridLayout(5105));
        JPanel pc 
    = new JPanel(new GridLayout(1350));
        JPanel pb 
    = new JPanel(new GridLayout(4555));
        JPanel pbc 
    = new JPanel(new BorderLayout(55));
        JPanel pbcm 
    = new JPanel();

        
    static// 顯示
        JTextField tftext = new JTextField(25);
        JTextField tfm 
    = new JTextField(5);
        
    // 按鈕字符定義及按鈕
        String strB[] = { "MC""MR""MS""M+""Backspace""CE""C""7""8",
                
    "9""/""sqrt""4""5""6""*""%""1""2""3""-",
                
    "1/x""0""+/-"".""+""=" };
        JButton[] jb 
    = new JButton[27];

        
    public Cal() {

            
    super("計算機-蕎葉制作");
            addMenu();
            initDisplay();
            initPbcm();

            Container pane 
    = this.getContentPane();
            pane.setLayout(
    new BorderLayout(105));
            pane.add(pdisplay, BorderLayout.NORTH);
            pane.add(pbcm, BorderLayout.CENTER);

            
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
    this.setBounds(300200400260);
            
    this.setResizable(false);
            
    this.setVisible(true);

        }

        
    // 一些類變量
        static StringBuilder text = new StringBuilder("0");// 顯示符
        StringBuilder number = new StringBuilder("0");// 當前數.
        double rightOper;// 右數
        double leftOper;// 左數
        double result;// 結果
        int operator;// 操作符,默認為0,沒有操作符
        int isFloat = 0;// 0不是浮點型,1輸入了一個.2真正的浮點
        boolean isZero = true;// 0顯示清空狀態,不能輸入0.輸入1-9進入1狀態.可以輸入0-9進入2;
        boolean isNeg;// 默認為正數
        boolean isExcp;// 默認沒有異常.
        StringBuilder m = new StringBuilder("0");// 存儲數串變量
        int isRightInput = 0;// 一次有效右輸入,輸入運算符后=1;再輸入數字后=2;

        
    // //////////////////////////////////////////////////////////////////////////////////////
        /**
         * number是用于給leftOper和rightOper賦值的.純純的能夠轉化為Double類型的StringBuilder.
         * 當然text,number,m考慮到大量的String連接和轉換,StringBuilder效率更高.
         * 
    */
        
    public void actionPerformed(ActionEvent e) {
            String cmd 
    = e.getActionCommand();
            
    if (cmd == "0" || cmd == "1" || cmd == "2" || cmd == "3" || cmd == "4"
                    
    || cmd == "5" || cmd == "6" || cmd == "7" || cmd == "8"
                    
    || cmd == "9") {
                
    if (isExcp)// 如果是三種錯誤之一,就不響應了.只有CE和C能夠響應
                    return;
                
    if (isRightInput == 1)// 如果是待一次有效右輸入.也就是前一次輸入的是運算符.
                    isRightInput = 2;// 進階真正的右輸入
                if (isZero) {// 處于清空狀態
                    number = new StringBuilder(cmd);// number直接為一個數字串
                    isZero = false;// 有一位數字后,不在處于清空.后面就可以輸入運算符,單目,.,+/-
                } else {
                    
    if (isFloat == 1) {// 待浮點狀態,前一次輸入的是.
                        number.append('.');// number這時加入.
                        isFloat = 2;// 真正的浮點.
                    }
                    number.append(cmd);
    // 數字后連接數字.
                    if (number.charAt(0== '0' && isFloat != 2)// 如果不是浮點,
                        number.deleteCharAt(0);// 但以0開頭就刪去.這種方法不優雅,但想不出更好的.
                }
                text 
    = number;// 只要輸入數字,無條件地顯示.
            } else if (cmd == ".") {
                
    if (isExcp)
                    
    return;
                
    if (isFloat == 0)// 如果不是浮點型
                    isFloat = 1;// 待浮點型.
            } else if (cmd == "+/-") {
                
    if (isZero || isExcp)// 清空狀態或異常.
                    return;
                
    if (isNeg) {// 如果是負數就變為正數,如果是正數就變為負數.
                    isNeg = false;
                    number.deleteCharAt(
    0);// delete和insert操作可以推遲到完成數字輸入狀態后,根據isNeg來判斷更好.
                } else {
                    isNeg 
    = true;
                    number.insert(
    0'-');
                }
                text 
    = number;
            }
            
    // 雙目運算功能
            else if (cmd == "+" || cmd == "-" || cmd == "*" || cmd == "/") {
                
    if (isExcp)
                    
    return;
                
    if (isRightInput == 0)
                    isRightInput 
    = 1;// 變為待一次有效右輸入狀態.
                if (isRightInput == 2) {// 如果已經是一次有效右輸入了.就相當于'='.比如1+2+的時候.
                    rightOper = Double.parseDouble(number.toString());// 當前的number給右數.
                    try {
                        result 
    = Util.calculate(leftOper, rightOper, operator);// 根據三個變量計算。如果/時右數為0,就拋異常.
                    } catch (ArithmeticException ae) {
                        isExcp 
    = true;
                        
    if (leftOper == 0)// 左數,右數同時為0時.
                            text = new StringBuilder("函數結果未定義。");
                        
    else
                            text 
    = new StringBuilder("除數不能為零。");
                    }
                    rightOper 
    = leftOper = result;// 把得到的結果給左數,同時也給右數.
                    text = new StringBuilder(String.valueOf(result));
                    isZero 
    = true;
                    isRightInput 
    = 1;// 直接就是1狀態.不經過0
                }
                
    if (operator == 0)// 如果運算符沒有.如:1+
                    rightOper = leftOper = Double.parseDouble(number.toString());// 左數和右數均賦值.
                
    // 據cmd初始化operator.此步一定進行,不管是運算符功能還是=功能.
                if (cmd == "+")// 很無奈的是不能用switch.enum太繁.
                    operator = 1;
                
    else if (cmd == "-")
                    operator 
    = 2;
                
    else if (cmd == "*")
                    operator 
    = 3;
                
    else
                    operator 
    = 4;
                isZero 
    = true;
            }
            
    // 單目運算
            else if (cmd == "sqrt") {
                
    if (isExcp)
                    
    return;
                
    double dnum = Double.parseDouble(number.toString());
                
    if (dnum < 0) {// 如果當前數為負,就錯誤.
                    isExcp = true;
                    text 
    = new StringBuilder("函數輸入無效。");
                } 
    else {
                    result 
    = Math.sqrt(dnum);
                    number 
    = text = new StringBuilder(String.valueOf(result));
                    
    if (operator == 0)// 有運算符必賦值給右數.
                        leftOper = result;
                    
    else {
                        rightOper 
    = result;
                    }
                    isZero 
    = true;
                }
            } 
    else if (cmd == "%") {
                
    if (isExcp)
                    
    return;
                
    double dnum = Double.parseDouble(number.toString());
                result 
    = leftOper * dnum / 100;// 這種規則讓人很難適應,有點小變態.
                number = text = new StringBuilder(String.valueOf(result));
                
    if (operator == 0)
                    leftOper 
    = result;
                
    else {
                    rightOper 
    = result;
                }
                isZero 
    = true;
            } 
    else if (cmd == "1/x") {
                
    if (isExcp)
                    
    return;
                
    double dnum = Double.parseDouble(number.toString());
                
    if (dnum == 0) {
                    isExcp 
    = true;
                    text 
    = new StringBuilder("除數不能為零。");
                } 
    else {
                    result 
    = 1 / Double.parseDouble(number.toString());
                    number 
    = text = new StringBuilder(String.valueOf(result));
                    
    if (operator == 0)
                        leftOper 
    = result;
                    
    else {
                        rightOper 
    = result;
                    }
                    isZero 
    = true;
                }
            } 
    else if (e.getActionCommand() == "=") {
                
    if (isExcp)
                    
    return;
                
    double dnum = Double.parseDouble(number.toString());
                
    if (isRightInput == 2) {// 一次有效的右輸入.如1+2=-2.如1+2=3=.就不響應3.
                    rightOper = dnum;// 當前數賦給右數.
                    isRightInput = 0;// =號破壞一次右輸入,必須得以+-*/開頭,后接數字
                }
                
    if (operator != 0) {// 1+2=
                    try {
                        result 
    = Util.calculate(leftOper, rightOper, operator);
                    } 
    catch (ArithmeticException ae) {
                        isExcp 
    = true;
                        
    if (leftOper == 0)// 左數,右數同時為0時.
                            text = new StringBuilder("函數結果未定義。");
                        
    else
                            text 
    = new StringBuilder("除數不能為零。");
                    }
                    leftOper 
    = result;
                } 
    else
                    
    // 1=
                    result = dnum;
                text 
    = new StringBuilder(String.valueOf(result));
                isZero 
    = true;
            } 
    else if (e.getActionCommand() == "關于計算器") {
                String temp 
    = "java模擬windows高模仿實用計算器.\n蕎葉制作.qq:494053175 \n blog:sina wangflood";
                JOptionPane.showMessageDialog(
    null, temp, "關于計算器",
                        JOptionPane.INFORMATION_MESSAGE);
            }
            
    // BackSpace功能
            else if (cmd == "Backspace") {
                
    if (isExcp)
                    
    return;
                
    if ((!isNeg && number.length() < 2)// 正數剩一位時,負數剩二位時.直接跳到0
                        || (isNeg && number.length() < 3)) {
                    isZero 
    = true;
                    number 
    = new StringBuilder("0");
                } 
    else
                    number 
    = number.deleteCharAt(number.length() - 1);// 每次刪除最后一位.
                text = number;
            } 
    else if (cmd == "CE") {
                isZero 
    = true;
                isExcp 
    = false;// 清異常.
                text = number;
            } 
    else if (cmd == "C") {
                operator 
    = 0;// 清運算符.
                isZero = true;
                leftOper 
    = 0;// 清左數
                rightOper = 0;// 清右數.
                result = 0;// 清結果.
                number = text = new StringBuilder("0");// 清當前數
                isExcp = false;// 清異常
                isRightInput = 0;// 清一次有效右輸入.
            } else if (cmd == "MC") {
                
    if (isExcp)// 同樣也響應不了.異常的時候.
                    return;
                m 
    = new StringBuilder("0");

            } 
    else if (cmd == "MR") {// 顯示存儲數到display.
                if (isExcp)
                    
    return;
                isRightInput 
    = 2;
                number 
    = text = m;
            } 
    else if (cmd == "MS") {
                
    if (isExcp)
                    
    return;
                m 
    = number;// 將當前數賦給m.
            } else if (cmd == "M+") {// 當前數與m相加賦給m
                if (isExcp)
                    
    return;
                m 
    = new StringBuilder(String.valueOf((Double.parseDouble(m
                        .toString()) 
    + Double.parseDouble(number.toString()))));
            } 
    else {// 一般不給出現這種情況.我們都會上天堂的.
                System.out.println("歡迎來到地獄!");
            }

            
    // 按任何鍵都會觸發的.
            tftext.setText(text.toString());
            
    if (m.length() != 0)// m不空的話就顯示M
                tfm.setText("M");
            
    else
                tfm.setText(
    "");
            
    if (isZero) {// 為清空狀態.浮點狀態和負數狀態回到默認.
                isFloat = 0;
                isNeg 
    = false;
            }
        }

        
    private void initDisplay() {
            tftext.setHorizontalAlignment(JTextField.RIGHT);
            pdisplay.add(tftext);
            tftext.setText(
    "0.");
            tfm.setHorizontalAlignment(JTextField.CENTER);
            tfm.setEditable(
    false);
            pm.add(tfm);
        }

        
    private void initPbcm() {
            
    // 生成按鈕
            for (int i = 0; i < 27; i++) {
                jb[i] 
    = new JButton(strB[i]);

            }

            
    for (int i = 0; i < 4; i++) {
                jb[i].addActionListener(
    this);
                pm.add(jb[i]);
            }
            
    for (int i = 4; i < 7; i++) {
                jb[i].addActionListener(
    this);
                pc.add(jb[i]);
            }

            
    for (int i = 7; i < 27; i++) {
                jb[i].addActionListener(
    this);
                pb.add(jb[i]);
            }
            pbc.add(pc, BorderLayout.NORTH);
            pbc.add(pb, BorderLayout.CENTER);
            pbcm.add(pm);
            pbcm.add(pbc);
        }

        
    private void addMenu() {
            
    this.setMenuBar(myMenuBar);
            
    // 以下是編輯菜單項
            Menu editMenu = new Menu("編輯");
            myMenuBar.add(editMenu);

            MenuItem menuitemcopy 
    = new MenuItem("復制");
            MenuItem menuitemplaste 
    = new MenuItem("粘貼");
            MenuItem menuitemload 
    = new MenuItem("用戶登錄");
            editMenu.add(menuitemload);
            editMenu.add(menuitemcopy);
            editMenu.add(menuitemplaste);

            menuitemload.addActionListener(
    this);
            menuitemcopy.addActionListener(
    this);
            menuitemplaste.addActionListener(
    this);

            
    // 以下是編輯菜單項
            Menu watchMenu = new Menu("查看");
            myMenuBar.add(watchMenu);

            MenuItem menuitemstandard 
    = new MenuItem("標準型");
            MenuItem menuitemsencien 
    = new MenuItem("科學型");

            watchMenu.add(menuitemstandard);
            watchMenu.add(menuitemsencien);
            watchMenu.addSeparator();
            watchMenu.add(
    new MenuItem("數字分組"));

            menuitemstandard.addActionListener(
    this);
            menuitemsencien.addActionListener(
    this);

            
    // 以下是幫助菜單項
            Menu helpMenu = new Menu("幫助");
            myMenuBar.add(helpMenu);

            CheckboxMenuItem menuitemhelp 
    = new CheckboxMenuItem("幫助主題"false);
            MenuItem menuitemaboutcal 
    = new MenuItem("關于計算器");

            helpMenu.add(menuitemhelp);
            helpMenu.addSeparator();
            helpMenu.add(menuitemaboutcal);

            menuitemhelp.addActionListener(
    this);
            menuitemaboutcal.addActionListener(
    this);

        }

        
    public static void main(String[] args) {
            
    new Cal();
        }

    }


    Util.java輔助類
    package wang.window.impl;

    public class Util {
        
    /** DoubleString格式化顯示.如果有小數點,只對小數點前面進行格式化. */
        
    private String DoubleFormat(String str) {
            StringBuilder sb 
    = new StringBuilder();

            
    int length = str.length();
            
    int left = length % 3;
            
    int count = 0;
            
    if (left == 0)
                left 
    = 3;
            String tail 
    = "";
            
    if (str.contains(".")) {
                
    int index = str.indexOf('.');
                tail 
    = str.substring(index);
                str 
    = str.substring(0, index);
            }

            
    for (int i = 0; i < str.length(); i++) {

                
    if (i == left)
                    sb.append(
    ",");
                
    else if (i > left) {
                    count
    ++;
                    
    if (count % 3 == 0)
                        sb.append(
    ",");

                }

                sb.append(str.charAt(i));

            }
            sb.append(tail);
            
    return sb.toString();
        }

        
    private void display() {
        }

        
    /** 根據兩double類型的操作數,和操作符,計算后返回double類型結果 */
        
    public static double calculate(double leftOper, double rightOper,
                
    int operator) {
            
    double result = 0;
            
    switch (operator) {
            
    case 1:
                result 
    = leftOper + rightOper;
                
    break;
            
    case 2:
                result 
    = leftOper - rightOper;
                
    break;
            
    case 3:
                result 
    = leftOper * rightOper;
                
    break;
            
    case 4:
                
    if (leftOper == 0)
                    
    throw new ArithmeticException();
                result 
    = leftOper / rightOper;

                
    break;
            
    default:
                System.out.println(
    "歡迎來到地獄!");
                
    break;
            }
            
    return result;

        }

        
    public String format(int isfloat, boolean isNeg, StringBuilder text) {
            
    int start = 0;//.前一個位置
            int end;//-后一個位置
            int count = 0;//計數
            if (isfloat != 2)
                start 
    = text.length() - 1;//java里數組的長度不用掃描?
            if (isNeg)
                end 
    = 1;
            
    else
                end 
    = 0;
            StringBuilder sb 
    = new StringBuilder();
            
    for (int i = text.length() - 1; i >= 0; i++) {
                
    char temp = text.charAt(i);
                
    if (isfloat == 2) {
                    
    if (temp == '.')
                        start 
    = i - 1;
                }
                
    if (i == start && i <= end) {
                    
    if (count == 2)
                        sb.append(
    ",");//插入,的條件
                    count = (count + 1% 3;
                }
                sb.append(temp);
            }
            
    return sb.reverse().toString();//逆序
        }
    }

    運行界面:

    有些地方還沒有完善。高手飄過,探討改進啊。
    posted on 2010-11-13 08:03 wangflood 閱讀(939) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 亚洲国产精品久久人人爱| 丝袜捆绑调教视频免费区| 亚洲va中文字幕无码久久不卡| 免费看国产成年无码AV片 | 四虎免费大片aⅴ入口| 久久国产乱子伦精品免费看| 国产天堂亚洲精品| 亚洲成熟xxxxx电影| 免费v片在线观看品善网| 91av免费观看| 无人视频免费观看免费视频| 亚洲综合激情九月婷婷| 亚洲情侣偷拍精品| 成人免费视频88| 免费不卡在线观看AV| 特级aaaaaaaaa毛片免费视频| 亚洲精品视频专区| 伊人久久精品亚洲午夜| 波多野结衣久久高清免费| 1000部啪啪未满十八勿入免费| EEUSS影院WWW在线观看免费| 久久乐国产综合亚洲精品| 亚洲av丰满熟妇在线播放| 2020久久精品国产免费| 国产精品福利片免费看| 亚洲欧洲日本国产| 久久精品国产亚洲香蕉| 24小时免费直播在线观看| APP在线免费观看视频| 曰批免费视频播放在线看片二| 亚洲国产精品久久人人爱| 亚洲av无码成h人动漫无遮挡| 免费大片黄手机在线观看| 成年大片免费视频| 国产人成免费视频网站| 久久亚洲免费视频| 三年在线观看免费观看完整版中文| 男女猛烈激情xx00免费视频| 亚洲欧美熟妇综合久久久久| 日本亚洲精品色婷婷在线影院| 亚洲另类激情综合偷自拍|