大家好,我是一名新加入开源中国社区的小鸟,在oschina打酱油好久了,突然觉得自己得尝试着写点东西,下面是我做的一个【 简易的android计算器】 程序,程序基本可以实现带括号的数据简单的加减乘除的运算,但是程序几乎没有容错性能,过几天课程不忙时打算在扩展、完善功能。
下面贴出程序主要代码,做的不好的地方妄不吝赐教,小弟在此谢过(说实话:还不知这篇文章能否被大家看到!!)----------------------------------------------------------------------------
程序布局-------
主程序代码
package com.mich.newcalculatordemo;
import java.util.Iterator;
import java.util.LinkedList;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText content;
LinkedList<String> center=new LinkedList<String>();//对content进行解析,即存放中缀表达式的链表
LinkedList<String> postfix=new LinkedList<String>();//存放后缀表达式的链表
LinkedList<Double> data=new LinkedList<Double>();//存放后缀表达式的数字链表
LinkedList<String> op=new LinkedList<String>();//1:作为临时存放运算符的链表;2:存放后缀表达式的运算符
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//处理clear清屏按钮功能
Button clear=(Button)findViewById(R.id.clear);
clear.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
content=(EditText)findViewById(R.id.content);
content.setText("");
}
});
//处理back退格按钮功能
Button back=(Button)findViewById(R.id.back);
back.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
content=(EditText)findViewById(R.id.content);
String str=content.getText().toString();
if(content.getText().length()!=0)
content.setText(str.substring(0, str.length()-1));
content.setSelection(content.getText().length());
}
});
//实现对"0123456789.+-*/"按钮的监听;而对"="按钮的监听则采用匿名内部类的方法在onCreate()方法体内进行
OnClickListener mylistener=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Button btn=(Button)v;
content=(EditText)findViewById(R.id.content);
String str=content.getText().toString();
str+=btn.getText();
content.setText(str);
content.setSelection(content.getText().length());
}
};
//对按钮注册监听器
Button num0=(Button)findViewById(R.id.num0);
num0.setOnClickListener(mylistener);
Button num1=(Button)findViewById(R.id.num1);
num1.setOnClickListener(mylistener);
Button num2=(Button)findViewById(R.id.num2);
num2.setOnClickListener(mylistener);
Button num3=(Button)findViewById(R.id.num3);
num3.setOnClickListener(mylistener);
Button num4=(Button)findViewById(R.id.num4);
num4.setOnClickListener(mylistener);
Button num5=(Button)findViewById(R.id.num5);
num5.setOnClickListener(mylistener);
Button num6=(Button)findViewById(R.id.num6);
num6.setOnClickListener(mylistener);
Button num7=(Button)findViewById(R.id.num7);
num7.setOnClickListener(mylistener);
Button num8=(Button)findViewById(R.id.num8);
num8.setOnClickListener(mylistener);
Button num9=(Button)findViewById(R.id.num9);
num9.setOnClickListener(mylistener);
Button point=(Button)findViewById(R.id.point);
point.setOnClickListener(mylistener);
Button left=(Button)findViewById(R.id.left);
left.setOnClickListener(mylistener);
Button right=(Button)findViewById(R.id.right);
right.setOnClickListener(mylistener);
Button plus=(Button)findViewById(R.id.plus);
plus.setOnClickListener(mylistener);
Button subtract=(Button)findViewById(R.id.subtract);
subtract.setOnClickListener(mylistener);
Button multiply=(Button)findViewById(R.id.multiply);
multiply.setOnClickListener(mylistener);
Button divide=(Button)findViewById(R.id.divide);
divide.setOnClickListener(mylistener);
//实现"="按钮的功能
Button equal=(Button)findViewById(R.id.equal);
equal.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
content=(EditText)findViewById(R.id.content);
String str=content.getText().toString();//str为中缀表达式
MainActivity.this.Analysis(str);//调用Analysis函数对content进行解析
System.out.println(center);
//至此,中缀表达式已存放到center链表中
Iterator<String> it=center.iterator();
while(it.hasNext()){
String tmpstr=it.next();
if(isNum(tmpstr)){
//如果是数字或小数点则直接进入postfix链表;
postfix.addLast(tmpstr);
}
//如果不是数字或小数点的话;
else{
int peeklevel=op.isEmpty()?0:getLevel(op.getLast());
//tmpstr比op的顶运算符优先级高则入op
if(getLevel(tmpstr)>peeklevel){
op.addLast(tmpstr);
}
//tmpstr比op的顶运算符优先级低
else{
//tmpstr为")",则将op一直出栈直到遇到"("
if(getLevel(tmpstr)==-1){
String str1=op.removeLast();
while(getLevel(str1)!=-2){
postfix.addLast(str1);
str1=op.removeLast();
}
}
//tmpstr为"(",则直接入op
else if(getLevel(tmpstr)==-2){
op.addLast(tmpstr);
}
//tmpstr比peeklevel优先级低(又不是"(" ")"),
//则op一直出栈直到op为空或tmpstr比peeklevel优先级高
else{
String str2=op.removeLast();
while(getLevel(str2)>=peeklevel){
postfix.addLast(str2);
if(op.isEmpty()){break;}
str2=op.removeLast();
}
op.addLast(tmpstr);
}
}
}
}
center.clear();//清空center链表
//op中剩余的元素出op进入postfix
while(!op.isEmpty()){
postfix.addLast(op.removeLast());
}
System.out.println(postfix);
//至此,中缀表达式已全部转化为后缀表达式postfix
while(!(postfix.isEmpty())){
String tmpstr=postfix.removeFirst();
if(isOp(tmpstr)){
char ch=tmpstr.charAt(0);
Double first=data.removeLast();
Double last=data.removeLast();
switch(ch){
case '*':
data.addLast(last*first);
break;
case '/':
data.addLast(last/first);
break;
case '+':
data.addLast(last+first);
break;
case '-':
data.addLast(last-first);
break;
}
}
else{
data.addLast(Double.parseDouble(tmpstr));
}
}
//至此,求得的结果已在data列表中
Double result=data.removeFirst();
content.setText(Double.toString(result));
content.setSelection(content.getText().length());
}
});
}
//自定义isNum()方法来检测元素是否为数值
public boolean isNum(String str){
int num=0;
for(int i=0;i<str.length();i++){
String strr=str.substring(i, i+1);
if(strr.equals("0")||strr.equals("1")||strr.equals("2")||strr.equals("3")||strr.equals("4")||strr.equals("5")||strr.equals("6")||strr.equals("7")||strr.equals("8")||strr.equals("9")||strr.equals("."))
num=num+1;
}
if(num==str.length())
return true;
else
return false;
}
//自定义isOp()方法来检测postfix列表的元素是否为运算符
public boolean isOp(String strr){
if(strr.equals("+")||strr.equals("-")||strr.equals("*")||strr.equals("/"))
return true;
else
return false;
}
//自定义getLevel()函数来定义运算符的等级
public int getLevel(String str){
if(str.equals("*")||str.equals("/")){
return 2;
}
else if(str.equals("+")||str.equals("-")){
return 1;
}
else if(str.equals("(")){
return -2;
}
else if(str.equals(")")){
return -1;
}
else{
return 0;
}
}
//实现对编辑框内容content进行解析的函数Analysis()
public void Analysis(String str){
String sub="";
for(int i=0;i<str.length();i++){
String strr=str.substring(i, i+1);
if(isNum(strr)){
sub+=strr;
}
else{
if(sub!=""){
center.addLast(sub);//首先sub进center
sub="";//将sub清空
}
center.addLast(strr);//"+-*/" "(" ")" 则直接进center表
}
}
if(isNum(str.substring(str.length()-1))){
center.addLast(sub);//首先sub进center
sub="";//将sub清空
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
finish();
return super.onOptionsItemSelected(item);
}
}