大家好,我是一名新加入开源中国社区的小鸟,在oschina打酱油好久了,突然觉得自己得尝试着写点东西,下面是我做的一个【 简易的android计算器】 程序,程序基本可以实现带括号的数据简单的加减乘除的运算,但是程序几乎没有容错性能,过几天课程不忙时打算在扩展、完善功能。

下面贴出程序主要代码,做的不好的地方妄不吝赐教,小弟在此谢过(说实话:还不知这篇文章能否被大家看到!!)----------------------------------------------------------------------------

程序布局-------

:开源社区是个好地方:第一个android小程序【简易计算器】" src="https://img.it610.com/image/info2/2880d29a868f41eaa1d820da83b9e3ae.jpg" width="290" height="450">

主程序代码

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);  }}

更多相关文章

  1. Android短信Receiver优先级
  2. Android(安卓)上的 Chrome 终于,即将,就要,支持文件上传(input type=
  3. 描述下IOS和android系统流畅度的差别
  4. Android简单计算器实现
  5. Activity生命周期前传-Android(安卓)中的进程模式
  6. ionic框架对Android返回键的处理
  7. 初学Android,BroadcastReceiver之有序广播(七十一)
  8. Android的进程、线程与优先级
  9. Java/Android中的优先级任务队列的实践

随机推荐

  1. android摄像头调用资料收集
  2. android语音识别 android.speech 包分析
  3. 如何让Android字体自适应屏幕分辨率
  4. 刚刚注册了一个android两天的培训
  5. Android相关文档资源大放送 感兴趣的话可
  6. Android开发者指南(12) ―― Android Sup
  7. Wear OS手表应用开发教程之-创建应用
  8. Android Service dump使用
  9. android 4.2.2提示 unauthorized终极解决
  10. 命令行创建虚拟环境