一个使用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();
}
}