:开源社区是个好地方:第一个android小程序【简易计算器】
16lz
2021-01-26
大家好,我是一名新加入开源中国社区的小鸟,在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); }}
更多相关文章
- Android短信Receiver优先级
- Android(安卓)上的 Chrome 终于,即将,就要,支持文件上传(input type=
- 描述下IOS和android系统流畅度的差别
- Android简单计算器实现
- Activity生命周期前传-Android(安卓)中的进程模式
- ionic框架对Android返回键的处理
- 初学Android,BroadcastReceiver之有序广播(七十一)
- Android的进程、线程与优先级
- Java/Android中的优先级任务队列的实践