`

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

 
阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
一个使用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
//如果是输入第一个数字状态
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
flag++;
}else{
flag = 1;
}
//设置状态为输入运算符状态
status = INPUT_FLAG;
}
}
//重绘
repaint();
}
}


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1933379


分享到:
评论

相关推荐

    计算器源码大家可以看看

    本文作者和大家共享了用J2ME技术实现的简单计算器的功能、思路和具体实现的源代码,供大家参考!

    基于JAVA语言设计的计算器毕设课设项目软件源代码及详细设计文档资料(40个合集).zip

    基于JAVA语言设计的计算器毕设课设项目软件源代码及详细设计文档资料(40个合集): JAVA+SQL办公自动化系统(源代码+论文+外文翻译) JAVA+SQL电子通讯录带系统托盘(论文+源代码) JAVA+SQL离散数学题库管理系统(源代码...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    嵌入式Linux程序设计案例与实验教程-实例代码

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的移植以及...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的移植以及...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    6.2.5 一个完整的Qt程序140 6.2.6 QtDesigner介绍141 实验6.1 Qt图形界面相关实验141 6.3 基于Qt技术的Qtopia157 6.3.1 Qtopia简介157 6.3.2 Qtopia的功能157 6.3.3 Qtopia编程157 实验6.2 Qtopia的移植以及...

    网上购物系统

    每次的触发模式时,都有一个传递的数值变量通过来判断触发的是哪个工作模最新网上购物系统 块。下面详细介绍购物篮(check.asp)各工作模式的具体最新网上购物系统 实现: &lt;p&gt;&lt;B&gt;&nbsp;&lt;/B&gt;&lt;/P&gt; 最新网上购物系统 ...

    Google Android SDK开发范例大全(第3版) 1/5

    2.2 创建第一个Android项目(Hello Android!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 ...

    Google Android SDK开发范例大全(第3版) 4/5

    2.2 创建第一个Android项目(Hello Android!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 ...

    Google Android SDK开发范例大全(第3版) 3/5

    2.2 创建第一个Android项目(Hello Android!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 ...

    Google Android SDK开发范例大全(第3版) 5/5

    2.2 创建第一个Android项目(Hello Android!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 ...

Global site tag (gtag.js) - Google Analytics