1.设计任务及要求
(1)设计一款基于Android系统下的计算器,实现加减乘除算法,以及清零、撤销操作。界面设计应该就尽量简洁而美观,具有良好的交互性,程序应具有较好的稳健性;
(2)另起一行显示运算结果;
(3)在整个输入和计算过程中,首先应该对输入的数据进行容错处理,这样有利于提高用户体验。容错设计比如:在输入过程中操作符不能连续输入,整数数据的开头不能出现0等。在程序设计过程中,需要设计数据结构来存储数字、操作符和容错标记;
(4)对于连续输入的多组数据,如3+8/2-98或(1+2)3+5-4/2,应当能够区分各个数字和运算符,并且根据优先级进行运算。
2.设计原理及结构框图
将表达式的字符串进行处理,将数字和运算符分别存放在两个栈中,设计方法来处理两个栈从而得到相应的计算结果,将操作符设计优先级,乘除优先级设置为2,加减优先级设置为1。
(1)从操作符栈中弹出两个操作符,假设为symbol1和symbol2,比较两个操作付的优先级,如果symbol1的优先级大于等于symbol2的则执行二,否则执行三。
(2)从数字栈中弹出两个数字,计算这两个数字在操作符symbol1下的运算结果,结束后将结果压入数字栈,将symbol2压入操作符栈,最后返回一。
(3)从数字栈中弹出三个数字,计算后两个数字在操作符symbol2下的运算结果,结束后将运算结果压入栈,将剩下的第一个数字压入栈,将操作符symbol1压入栈,最后返回一。
结构框图如下所示:
图1 简易计算器软件结构框图
图1 简易计算器功能结构框图
3.详细设计
输入模块主要描述了计算器键盘以及键盘的监听即主要负责读取用户的键盘输入以及响应触屏的按键,当用户点击按键或者屏幕的时候监听器会去调用相应功能的按键,分别是清零,0,1,2,3,4,5,6,7,8,9,+,-,*,/,=,@,左括号,右括号等。显示模块主要描述了计算器的显示区,即该区域用于显示用户输入的数据以及最终的计算结果和一些其他信息。
根据输入多项式的不同(比如输入3+8/2-9*8),需要对多项式进行分割,找出各个数字和符号并分别保存,再根据运算符的优先级来进行计算。
(1)初始化部分代码
Button btn_0;Button btn_1;Button btn_2;Button btn_3;Button btn_4;Button btn_5;Button btn_6;Button btn_7;Button btn_8;Button btn_9;Button btn_clear; //清除数据输入区Button btn_del; //删除一位Button btn_plus;// +Button btn_minus;// -Button btn_multiply;// *Button btn_divide;// /Button btn_equal;// =Button btn_left;//左括号Button btn_right;//右括号private TextView et_input;//数据输入区private StringBuilder pending = new StringBuilder();//数据输入区字符串private void initView() {btn_0 = (Button) findViewById(R.id.btn_0);btn_1 = (Button) findViewById(R.id.btn_1);btn_2 = (Button) findViewById(R.id.btn_2);btn_3 = (Button) findViewById(R.id.btn_3);......btn_0.setOnClickListener(this);//设置按键监听btn_1.setOnClickListener(this);btn_2.setOnClickListener(this);btn_3.setOnClickListener(this);......}
(2)按钮键值判断及执行函数代码
public void onClick(View v) {int last = 0;if(pending.length()!=0) {last = pending.codePointAt(pending.length()-1);}switch (v.getId()) {case R.id.btn_0:pending = pending.append("0");et_input.setText(pending);break;case R.id.btn_1:pending = pending.append("1");et_input.setText(pending);break;case R.id.btn_2:pending = pending.append("2");et_input.setText(pending);break;case R.id.btn_3:pending = pending.append("3");et_input.setText(pending);break;case R.id.btn_4:pending = pending.append("4");et_input.setText(pending);break;case R.id.btn_5:pending = pending.append("5");et_input.setText(pending);break;case R.id.btn_6:pending = pending.append("6");et_input.setText(pending);break;case R.id.btn_7:pending = pending.append("7");et_input.setText(pending);break;case R.id.btn_8:pending = pending.append("8");et_input.setText(pending);break;case R.id.btn_9:pending = pending.append("9");et_input.setText(pending);break;......}}
(3)优先级判断函数
使用集合定义符号的运算优先级,如果有括号,首先计算括号内的式子,然后按照先乘除、后加减的顺序进行计算。
4. 测试与分析
测试过程:
(1)安装相关软件,JDK安装配置
(2)安装Java的JDK至默认路径 D:\Program Files\Java\,一般需要300M的空间,硬盘空间充足的话,所有组件全部安装。然后完成环境变量的配置。
(3)配置Eclipse开发环境,设置代码字体大小,调整为12(或14),显示行号,代码格式化,改变一行能容纳的最大字符数,设置智能提示,运行eclipse.exe完成路径设置后,选择菜单Help—Install New Software…
配置SDK路径:
(1)安装java开发的JDK到本机,配置好环境变量。
(2)解压Android SDK和Eclipse,配置Eclipse的SDK路径。
系统默认的是在线安装新的SDK组件,选取Use existing SDKs,然后点击下一步完成经一部的配置。完成配置到Windows里找到Android SDK Manager运行,检测是否可以正常启动,在启动之后,选择国内的镜像网站来进行下一步操作。
!配置完成的Eclipse配置完成的Eclipse
总结:需要先安装JDK后配置环境变了,然后完成SDK的解压,解压有ADT的Eclipse,最后在Eclipse里重新配置SDK路径。就可以使用了。
至此Android开发环境就基本搭建完成了。
测试情况如下图:
5. 参考文献
[1] 孙更新,宾晟,孙海轮.Java ME手机应用开发大全.北京:科学出版社,.6
[2]郭克华.JavaME移动开发实例精讲.北京:清华大学出版社,.1