<新手>:开源社区是个好地方:第一个android小程序【简易计算器】

本文介绍了一个简易的Android计算器程序,能够处理包含括号的基本算术运算。该程序使用中缀到后缀表达式的转换方法,并实现了相应的计算逻辑。

 

      大家好,我是一名新加入开源中国社区的小鸟,在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);
  }

}

 

转载于:https://my.oschina.net/foreverhui/blog/116934

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值