Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 353|回复: 0

[J2ME学习]简单的计算器代码

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 04:01:50 | 显示全部楼层 |阅读模式
    在实际学习的过程中,经常做一些小的项目,可以把学到的技术综合应用起来,获得一定的成就感,并锻炼逻辑思维能力。
       
       
                 本计算器代码的功能:
       
       
        1、 实现四则运算,其中除法实现的是整数除法
       
       
        2、 实现清楚输入功能
       
       
        实现该功能的核心思路:
       
       
        1、 对本程序的功能进行状态划分,总共划分出三个状态:
       
       
        a)         输入第一个数字状态
       
       
        b)         输入运算符号状态
       
       
        c)         输入第二个数字状态
       
       
        通过状态划分,每个状态进行对应的绘制和事件处理,这样逻辑比较清晰,编写代码起来比较简单。
       
      
       
       
         
       

         
       
      
       

      


    2、 数据的存储


                在计算器程序中,存储数据是一个比较核心的逻辑,本程序的实现方式,判断用户按下的是否是数字按键(KEY_NUM0到KEY_NUM9),这些按键的keyCode和对应的字符编码相同,例如KEY_NUM0和字符0的编码一样,利用这个规律,获得数字按键的值,可以通过keyCode ?C 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();


    }


    }


      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 07:36 , Processed in 0.311005 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表