您的位置:首页 > 编程语言

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

2007-12-28 05:10 806 查看
  [align=center]一个使用J2ME技术实现的简单计算器[/align][align=center]作者:陈跃峰[/align][align=center]出自:http://blog.csdn.net/mailbomb[/align]          在实际学习的过程中,经常做一些小的项目,可以把学到的技术综合应用起来,获得一定的成就感,并锻炼逻辑思维能力。         本计算器代码的功能: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐