在實際學習的過程中,經常做一些小的項目,可以把學到的技術綜合應用起來,獲得一定的成就感,並鍛煉邏輯思維能力。
本計算器代碼的功能:
1、實現四則運算,其中除法實現的是整數除法
2、實現清楚輸入功能
實現該功能的核心思路:
1、對本程序的功能進行狀態劃分,總共劃分出三個狀態:
a) 輸入第一個數字狀態
b) 輸入運算符號狀態
c) 輸入第二個數字狀態
通過狀態劃分,每個狀態進行對應的繪制和事件處理,這樣邏輯比較清晰,編寫代碼起來比較簡單。
2、數據的存儲
在計算器程序中,存儲數據是一個比較核心的邏輯,本程序的實現方式,判斷用戶按下的是否是數字按鍵(KEY_NUM0到KEY_NUM9) ,這些按鍵的keyCode和對應的字符編碼相同,例如KEY_NUM0和字符0的編碼一樣,利用這個規律,獲得數字按鍵的值,可以通過keyCode – KEY_NUM0實現。
這樣只能換算出來一次的輸入,而實際輸入的結果應該等於:
上次輸入的值 × 10+本次輸入的內容
例如,上次輸入的是1,本次輸入3,則實際輸入的內容應該是1 × 10 + 3 = 13
本程序通過這樣的方式存儲用戶的輸入。
本程序的操作說明:
1、數字輸入按數字鍵實現
2、運算符號使用星號鍵輸入,按一次星號鍵切換一次運算符號
3、左軟鍵代表清除,每次清除一個數字或運算符
4、右軟鍵代碼計算,計算實際的結果
附源代碼:
import javax.microedition.lcdui.*;
/**
* 計算器界面和邏輯
*/
public class CalcCanvas extends Canvas {
/**狀態值*/
int status;
/**輸入第一個數字狀態*/
final int INPUT_FIRST = 1;
/**輸入第二個數字狀態*/
final int INPUT_SECOND = 3;
/**輸入運算符號狀態*/
final int INPUT_FLAG = 2;
/**繪制內容右下角的x坐標*/
int x = 150;
/**繪制內容右下角的x坐標*/
int y = 160;
/**行高*/
int lineHeight = 20;
/**第一個數字的值*/
int firstNum = 0;
/**第二個數字的值*/
int secondNum = 0;
/**運算符號,0無意義,1代表+,2代表減、3乘4除*/
int flag = 0;
/**屏幕寬度*/
int w;
/**屏幕高度*/
int 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) {
//按鈕C的處理
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;
//如果第二個數字為0,則切換到輸入運算符狀態
if(secondNum == 0) {
status = INPUT_FLAG;
}
break;
}
}
if(keyCode == -7) { //按鈕=的處理
//如果處於輸入第二個數字狀態,且第二個數字不是0
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) ) {
//輸入運算符
if(flag < 4) {
flag++;
}else{
flag = 1;
}
//設置狀態為輸入運算符狀態
status = INPUT_FLAG;
}
}
//重繪
repaint();
}
}
出自:http://blog.csdn.net/Mailbomb/archive/2007/12/13/1933379.aspx