首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 簡易計算機實作:狀態機設計與按鍵處理邏輯

     編輯:J2ME

以狀態機設計實作四則運算計算機,支援整數除法、清除功能,邏輯清晰易擴充。

三狀態設計

  1. INPUT_FIRST:輸入第一個數字
  2. INPUT_FLAG:輸入運算符號 (+ - * /)
  3. INPUT_SECOND:輸入第二個數字

核心邏輯

  • 數字累積:value = value * 10 + (keyCode - KEY_NUM0),利用鍵碼與字元編碼對應關係
  • 運算符號切換:按 * 鍵循環切換 + - * /
  • 左軟鍵清除:依狀態刪除最後一位數字或運算符
  • 右軟鍵計算:執行四則運算,結果存回第一數字,重置狀態

完整原始碼 (CalcCanvas.java)

public class CalcCanvas extends Canvas {
    int status; final int INPUT_FIRST=1, INPUT_FLAG=2, INPUT_SECOND=3;
    int x=150, y=160, lineHeight=20;
    int firstNum=0, secondNum=0, flag=0; // flag: 1=+, 2=-, 3=*, 4=/
    int w, h; String[] sFlag = {"+","-","*","/"};

    public CalcCanvas() {
        status = INPUT_FIRST;
        setFullScreenMode(true);
        h = getHeight(); w = getWidth();
    }

    protected void paint(Graphics g) {
        g.setColor(0xffffff); g.fillRect(0,0,w,h);
        g.setColor(0);
        g.drawString("=", w, h, Graphics.RIGHT|Graphics.BOTTOM);
        g.drawString("C", 0, h, Graphics.LEFT|Graphics.BOTTOM);
        switch(status) {
            case INPUT_FIRST:
                g.drawString(""+firstNum, x, y, Graphics.RIGHT|Graphics.BOTTOM); break;
            case INPUT_FLAG:
                g.drawString(""+firstNum, x, y-lineHeight, Graphics.RIGHT|Graphics.BOTTOM);
                g.drawString(sFlag[flag-1], x, y, Graphics.RIGHT|Graphics.BOTTOM); break;
            case INPUT_SECOND:
                g.drawString(""+firstNum, x, y-2*lineHeight, Graphics.RIGHT|Graphics.BOTTOM);
                g.drawString(sFlag[flag-1], x, y-lineHeight, Graphics.RIGHT|Graphics.BOTTOM);
                g.drawString(""+secondNum, x, y, Graphics.RIGHT|Graphics.BOTTOM); break;
        }
    }

    public void keyPressed(int keyCode) {
        if (keyCode == -6) { // 左軟鍵 C
            switch(status) {
                case INPUT_FIRST: firstNum/=10; break;
                case INPUT_FLAG: status=INPUT_FIRST; flag=0; break;
                case INPUT_SECOND: secondNum/=10; if(secondNum==0) status=INPUT_FLAG; break;
            }
        }
        if (keyCode == -7) { // 右軟鍵 =
            if (status==INPUT_SECOND && secondNum!=0) {
                switch(flag) {
                    case 1: firstNum+=secondNum; break;
                    case 2: firstNum-=secondNum; break;
                    case 3: firstNum*=secondNum; break;
                    case 4: firstNum/=secondNum; break;
                }
                status=INPUT_FIRST; flag=0; secondNum=0;
            }
        }
        if (keyCode>=KEY_NUM0 && keyCode<=KEY_NUM9) {
            switch(status) {
                case INPUT_FIRST: firstNum = firstNum*10 + (keyCode-KEY_NUM0); break;
                case INPUT_SECOND: secondNum = secondNum*10 + (keyCode-KEY_NUM0); break;
                case INPUT_FLAG: status=INPUT_SECOND; secondNum = secondNum*10 + (keyCode-KEY_NUM0); break;
            }
        }
        if (keyCode == KEY_STAR) { // * 鍵切換運算符
            if (status==INPUT_FIRST || status==INPUT_FLAG) {
                flag = (flag < 4) ? flag+1 : 1;
                status = INPUT_FLAG;
            }
        }
        repaint();
    }
}

操作說明:數字鍵輸入數字、* 鍵切換運算子、左軟鍵刪除、右軟鍵計算結果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved