透過小型專案綜合應用所學技術,強化邏輯思維。本計算機實作:
將程式行為劃分為三個狀態:
每個狀態對應特定繪製邏輯與按鍵處理,使程式結構清晰、易於擴展。
利用按鍵 KEY_NUM0~KEY_NUM9 的 keyCode 與字符編碼一致的特性:
int digit = keyCode - Canvas.KEY_NUM0; // 取得 0~9
數值累積公式:新值 = 舊值 × 10 + 當前輸入(例:先輸 1 再輸 3 → 13)。
KEY_STAR):循環切換運算符號(+ → - → * → / → +)-6):刪除最後一個字符(數字或符號)-7):計算並顯示結果import javax.microedition.lcdui.*;
public class CalcCanvas extends Canvas {
// 狀態常數
final int INPUT_FIRST = 1;
final int INPUT_FLAG = 2;
final int INPUT_SECOND = 3;
int status = INPUT_FIRST;
// 繪製座標
int x = 150, y = 160, lineHeight = 20;
int w, h;
// 資料儲存
int firstNum = 0, secondNum = 0, flag = 0; // flag: 1=+, 2=-, 3=*, 4=/
String[] sFlag = {"+", "-", "*", "/"};
public CalcCanvas() {
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) {
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) {
int digit = keyCode - KEY_NUM0;
switch (status) {
case INPUT_FIRST:
firstNum = firstNum * 10 + digit;
break;
case INPUT_SECOND:
secondNum = secondNum * 10 + digit;
break;
case INPUT_FLAG:
status = INPUT_SECOND;
secondNum = secondNum * 10 + digit;
break;
}
}
// 星號鍵:切換運算符
if (keyCode == KEY_STAR) {
if (status == INPUT_FIRST || status == INPUT_FLAG) {
flag = (flag < 4) ? flag + 1 : 1;
status = INPUT_FLAG;
}
}
repaint();
}
}
原文連結:CSDN Blog - Mailbomb