首页 文萃 技术文档 二手市场 培训机构 e书下载 五星图书 考试资源 软件下载 标准下载 最新资讯
图书资源 留言板 联系我们
一个使用J2ME技术实现的简单计算器|西安信息资源网|E书下载|电子书下载|信息发布


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

推荐人:WD

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

 

[收藏本文]   [发表评论]  [查看评论我要推荐文章

上一篇:Windows API OpenProcess函数 下一篇:国际:Web开发设计的五大准则

最新参与TOP10
ascall码
【经典推荐】每个JAVA初学者都应该搞懂的问题
成功安装Mysql+Apache2+php5过程
五种提高 SQL 性能的方法
配置Eclpise+tomcat并实现JSP的编写与部署
Eclipse 3.0 上配置JSP开发环境
PHP中的XML拉模式详解
php的ajax框架xajax入门与试用
win2000server IIS和tomcat5多站点配置
JSP连接SQL Server 2000系统配置

西安信息资源网 版权所有 全球排名

QQ:363694816