一个使用J2ME技术实现的计算器的代码

  
一个使用J2ME技术实现的简单计算器
作者:陈跃峰
 
         在实际学习的过程中,经常做一些小的项目,可以把学到的技术综合应用起来,获得一定的成就感,并锻炼逻辑思维能力。
         本计算器代码的功能:
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();
}
}


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1933379


你可能感兴趣的:(j2me)