一个使用J2ME技术实现的简单计算器

http://tech.ddvip.com   2008年09月08日    社区交流

本文详细介绍一个使用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();
}
}

来源:blog.csdn    作者:陈跃峰    责编:豆豆技术应用

正在加载评论...