以狀態機設計實作四則運算計算機,支援整數除法、清除功能,邏輯清晰易擴充。
INPUT_FIRST:輸入第一個數字INPUT_FLAG:輸入運算符號 (+ - * /)INPUT_SECOND:輸入第二個數字value = value * 10 + (keyCode - KEY_NUM0),利用鍵碼與字元編碼對應關係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();
}
}
操作說明:數字鍵輸入數字、* 鍵切換運算子、左軟鍵刪除、右軟鍵計算結果。