程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 一個使用J2ME技術實現的簡單計算器

一個使用J2ME技術實現的簡單計算器

編輯:關於JAVA

在實際學習的過程中,經常做一些小的項目,可以把學到的技術綜合應用起來,獲得一定的成就感,並鍛煉邏輯思維能力。

本計算器代碼的功能:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved