作者:陈跃峰 出自: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(); } }
|