首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > JAVA专栏 > 正文
  • 一个使用J2ME技术实现的简单计算器
      2008-1-25  来源:Csdn博客  编辑:Jsbulo  热度:

    在实际学习的过程中,经常做一些小的项目,可以把学到的技术综合应用起来,获得一定的成就感,并锻炼逻辑思维能力。

    本计算器代码的功能:

    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();
    }
    }