android实现简单计算器功能

本文实例为大家分享了android实现简单计算器的具体代码,供大家参考,具体内容如下

// 日期:2014/9/26

// 首先,人们的输入习惯为中缀表达式。为了便于计算,程序会将中缀表达式会转换为后缀表达式

////////////////////////////////////////////////////////////////////////////////////////
// 目前软件还存在
// 1.输入运算数和运算符不匹配时,崩溃的现象。(如:只输入一个操作数)
// 2.一个数字中重复输入两个小数点。(如4.5.6)
// 这两个重大的bug,后续会继续修改

////////////////////////////////////////////////////////////////////////////////////////
// 只有一种布局。这也会在后续考虑完善。
// 若有其他不完善的地方,请指正。(╯▽╰)

package com.example.countea;

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;

import android.widget.Toast;                 // 显示版权信息
import java.util.Iterator;                  // 迭代器
import java.util.LinkedList;                 // 双向列表

public class MainActivity extends Activity {
 private EditText content;
 private EditText operaline;
 private Double first_num = 0.0;              // 第一个操作数
 private Double sec_num  = 0.0;              // 第二个操作数
 //无法设置bool型变量?????
 private static int equal_flg = 0;             // 等号的状态:FALSE表示未按过等号,TRUE表示已经按过等号
 private double negative_mark = 0;             // 正负数标记
 LinkedList<String> Infix = new LinkedList<String>();    // 对content进行解析,即存放中缀表达式的链表
 LinkedList<String> Suffix = new LinkedList<String>();   // 存放后缀表达式的链表
 LinkedList<Double> Suffix_Num = new LinkedList<Double>(); // 存放后缀表达式的数字链表
 LinkedList<String> OP = new LinkedList<String>();     // 1.作为临时存放运算符的链表;2.存放后缀表达式的运算符

 @Override
 protected void onCreate(Bundle savedInstanceState)
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 // 处理"c"清屏按钮功能
 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("");
  equal_flg = 0;

  first_num = 0.0;
  sec_num = 0.0;
  OP.clear();
  Suffix.clear();
  Suffix_Num.clear();
  operaline.setText("");
  operaline.setSelection(operaline.getText().length());
  }
 });

 // 处理CE删除当前操作按钮功能
 Button current_clear = (Button) findViewById(R.id.current_clear);
   current_clear.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v)
  {
  // TODO Auto-generated method stub
  content = (EditText) findViewById(R.id.content);
  content.setText("");
  equal_flg = 0;

  first_num = 0.0;
  sec_num = 0.0;
  OP.clear();
  Suffix.clear();
  Suffix_Num.clear();
  }
 });

 // 处理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 num_btn = (Button) v;
  content = (EditText) findViewById(R.id.content);

  // 储存界面运算式
  String content_str = content.getText().toString();

  // 当已经有一次运算时,再次按“数字键”清除上次的结果
  if((1==equal_flg)/*&&(num_btn.getText().toString().equals("1")
   ||num_btn.getText().toString().equals("2")
   ||num_btn.getText().toString().equals("3")
   ||num_btn.getText().toString().equals("4")
   ||num_btn.getText().toString().equals("5")
   ||num_btn.getText().toString().equals("6")
   ||num_btn.getText().toString().equals("7")
   ||num_btn.getText().toString().equals("8")
   ||num_btn.getText().toString().equals("9")
   ||num_btn.getText().toString().equals("0"))*/)
  {
   content.setText("0");
   content.setSelection(content.getText().length());
   Toast.makeText(MainActivity.this,"还真执行了!", Toast.LENGTH_LONG).show();
   equal_flg=0;
  }

  // 重复输入运算符、括号或者“.”的处理
  if(("+".equals(content_str.substring(content_str.length()-1,content_str.length()))
   ||"-".equals(content_str.substring(content_str.length()-1,content_str.length()))
   ||"*".equals(content_str.substring(content_str.length()-1,content_str.length()))
   ||"/".equals(content_str.substring(content_str.length()-1,content_str.length()))
   ||".".equals(content_str.substring(content_str.length()-1,content_str.length())))&&((num_btn.getText().toString().equals("+")
   ||num_btn.getText().toString().equals("-")
   ||num_btn.getText().toString().equals("*")
   ||num_btn.getText().toString().equals("/")
   ||num_btn.getText().toString().equals("."))))
  {
   content_str=content_str.substring(0, content_str.length()-1);
   //Toast.makeText(MainActivity.this,"手抖了吗?", Toast.LENGTH_LONG).show();
  } 

  // 重复按“.”的处理
  /*if(num_btn.getText().toString().equals("."))
  {
   // 如果界面只有数字,则改变当前数字的符号
   if("0"!=content_str)
   {
   judge_str = turn_mark(judge_str);
   content.setText(judge_str);
   content.setSelection(content.getText().length());
   // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show();
   }
  }*/  

  // 不实现拼接
  // 当前数据为0,下次输入为非0数字或括号
  if("0".equals(content.getText().toString())
   &&!(num_btn.getText().toString().equals("+"))
   &&!(num_btn.getText().toString().equals("-"))
   &&!(num_btn.getText().toString().equals("*"))
   &&!(num_btn.getText().toString().equals("/"))
   &&!(num_btn.getText().toString().equals(".")))
  {
   // 强制转换测试是否有危险??????
   content_str = (String) num_btn.getText();
   //Toast.makeText(MainActivity.this,num_btn.getText(), Toast.LENGTH_LONG).show();
  }

  // 实现拼接
  // 当前数据为0且下次输入为运算符或点号
  else
  {
   content_str += num_btn.getText();
   //Toast.makeText(MainActivity.this,content_str, Toast.LENGTH_LONG).show();
  }
  content.setText(content_str);
  content.setSelection(content.getText().length());
  }
 };

 // 无需特别处理的数字和符号按钮
 Button num1 = (Button) findViewById(R.id.num_1);
 num1.setOnClickListener(mylistener);
 Button num2 = (Button) findViewById(R.id.num_2);
 num2.setOnClickListener(mylistener);
 Button num3 = (Button) findViewById(R.id.num_3);
 num3.setOnClickListener(mylistener);
 Button num4 = (Button) findViewById(R.id.num_4);
 num4.setOnClickListener(mylistener);
 Button num5 = (Button) findViewById(R.id.num_5);
 num5.setOnClickListener(mylistener);
 Button num6 = (Button) findViewById(R.id.num_6);
 num6.setOnClickListener(mylistener);
 Button num7 = (Button) findViewById(R.id.num_7);
 num7.setOnClickListener(mylistener);
 Button num8 = (Button) findViewById(R.id.num_8);
 num8.setOnClickListener(mylistener);
 Button num9 = (Button) findViewById(R.id.num_9);
 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.subs);
 subtract.setOnClickListener(mylistener);
 Button multiply = (Button) findViewById(R.id.multiply);
 multiply.setOnClickListener(mylistener);
 Button divide = (Button) findViewById(R.id.division);
 divide.setOnClickListener(mylistener);

 // 对按钮0的处理
 Button num0 = (Button) findViewById(R.id.num_0);
 num0.setOnClickListener(new OnClickListener()
 {
  @Override
  public void onClick(View v)
  {
  content = (EditText) findViewById(R.id.content);
  // 当前编辑框中的值为0
  if ("0".equals(content.getText().toString())||""== content.getText().toString())
  {
   content.setText("0");
  }
  // 编辑框已有非0数据
  else
  {
    String str = content.getText().toString();
     str += "0";
     content.setText(str);
  }
  content.setSelection(content.getText().length());
  // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show();
  }
 });

 // 对“-/+”的处理
 Button mark_sign = (Button) findViewById(R.id.mark_sign);
 mark_sign.setOnClickListener(new OnClickListener()
 {
  @Override
  public void onClick(View v)
  {

  content = (EditText) findViewById(R.id.content);
  String judge_str = content.getText().toString();

  // 如果界面只有数字,则改变当前数字的符号
  if("0"!=judge_str&&((-1==judge_str.indexOf("+"))
   ||(-1==judge_str.indexOf("-")))
   ||(-1==judge_str.indexOf("*"))
   ||(-1==judge_str.indexOf("/"))
   ||(-1==judge_str.indexOf("("))
   ||(-1==judge_str.indexOf(")")))
  {
   judge_str = turn_mark(judge_str);
   content.setText(judge_str);
   content.setSelection(content.getText().length());
   // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show();
  }
  }
 });
 // 实现"="按钮的功能
 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);
  operaline = (EditText) findViewById(R.id.operatline);
  // str_Infix为待转换的中缀表达式
  String str_Infix = content.getText().toString();
  // 友好的界面提示处理
  String equate = str_Infix;
  equate += "=";
  operaline.setText(equate);
  operaline.setSelection(content.getText().length());
  // 调用Analysis函数对content进行解析
  MainActivity.this.Analysis(str_Infix);
  System.out.println(Infix);
  // 至此,中缀表达式已存放到Infix链表中

  Iterator<String> it = Infix.iterator();
  while (it.hasNext())
  {
   String tmp_str = it.next();
   if (isNum(tmp_str))
   {
      // 如果是数字或小数点则直接进入Suffix链表;
   Suffix.addLast(tmp_str);
   }
   // 如果不是数字或小数点的话;
   else
   {
   int OP_level = OP.isEmpty() ? 0 : getLevel(OP.getLast());
   // tmp_str比OP的顶运算符优先级高则入OP
   if (getLevel(tmp_str) > OP_level)
   {
    OP.addLast(tmp_str);
   }
   // tmp_str比OP的顶运算符优先级低
   else
   {
    // tmp_str为")",则将OP一直出栈直到遇到"("
    if (getLevel(tmp_str) == -1)
    {
    String temp_OP = OP.removeLast();
    while (getLevel(temp_OP) != -2) {
     Suffix.addLast(temp_OP);
     temp_OP = OP.removeLast();
    }
    }
    // tmp_str为"(",则直接入OP
    else if (getLevel(tmp_str) == -2)
    {
    OP.addLast(tmp_str);
    }
    // tmp_str比OP_level优先级低又不是"(" ")",
    // 则OP一直出栈直到OP为空或tmp_str比OP_level优先级高
    else
    {
    String str2 = OP.removeLast();
    while (getLevel(str2) >= OP_level)
    {
     Suffix.addLast(str2);
     if (OP.isEmpty())
     {
     break;
     }
     str2 = OP.removeLast();
    }
    OP.addLast(tmp_str);
    }
   }
   }
  }
  Infix.clear();// 清空Infix链表
  // OP中剩余的元素出OP进入Suffix
  while (!OP.isEmpty())
  {
   Suffix.addLast(OP.removeLast());
  }
  System.out.println(Suffix);
  // 至此,中缀表达式已全部转化为后缀表达式Suffix

  // 后缀表达式的计算过程???未指定操作数时 默认为0
  while (!(Suffix.isEmpty()))
  {
   String count_str = Suffix.removeFirst();
   if (isOP(count_str))
   {
   char compare_ch = count_str.charAt(0);
   first_num = Suffix_Num.removeLast();
   sec_num = Suffix_Num.removeLast();
   switch (compare_ch) {
   case '*':
    Suffix_Num.addLast(sec_num * first_num);
    break;
   case '/':
    // 测试注意除数和被除数的顺序
    if (first_num != 0)
    {
    Suffix_Num.addLast(sec_num / first_num);
    break;
    } else
    {
    content = (EditText) findViewById(R.id.content);
    // ?????无法再编辑框内,设置提示
    content.setText("∞");
    content.setSelection(content.getText().length());
    }
   case '+':
    Suffix_Num.addLast(sec_num + first_num);
    break;
   case '-':
    Suffix_Num.addLast(sec_num - first_num);
    break;
   }
   }
   else
   {
   Suffix_Num.addLast(Double.parseDouble(count_str));
   }
  }
  // 至此,求得的结果已在Suffix_Num列表中

  // 这部分的逻辑为 result 存放从Suffix_Num列表中取出的数据,处理结果后显示到界面上。
  Double result=Suffix_Num.removeFirst();
  String res_str=Double.toString(result);

  if("0".equals(res_str.substring(res_str.length()-1,res_str.length())))
  {
   if(".".equals(res_str.substring(res_str.length()-2,res_str.length()-1)))
   {
   res_str=res_str.substring(0,res_str.length()-2);
   //Toast.makeText(MainActivity.this,res_str, Toast.LENGTH_LONG).show();
   };
  };
    content.setText(res_str);
    content.setSelection(content.getText().length());
    equal_flg = 1;
    if("-".equals(res_str.substring(0,1)))
   res_str=turn_mark(res_str);
  }
 });
 // 操作数清空?????android有自动释放机制?
 first_num = 0.0;
 sec_num = 0.0;
 OP.clear();
 Suffix.clear();
 Suffix_Num.clear();
 }

 // 自定义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()方法来检测Suffix列表的元素是否为运算符
 public boolean isOP(String strr) {
 if (strr.equals("+") || strr.equals("-") || strr.equals("*")
  || strr.equals("/"))
  return true;
 else
  return false;
 }

 // 定义运算符的等级
 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;
 }
 }

 // 改变正负号
 public String turn_mark(String str)
 {
 String temp = "(";
 temp += "-";
 temp += str;
 temp += ")";
 str = temp;
 return str;
 }

 // 实现对编辑框内容以数字和操作符分开储存
 public void Analysis(String str) {
 String sub = "";

 for (int i = 0; i < str.length(); i++)
 {
  // 用substring遍历需要解析的数组
  String strr = str.substring(i, i + 1);
  if (isNum(strr))
  {
  sub += strr;
  }
  else
  {
  if (sub != "")
  {
   Infix.addLast(sub);  // 首先sub进Infix
   sub = "";       // 将sub清空
  }
  Infix.addLast(strr);   // "+-*/" "(" ")" 则直接进Infix表
  }
 }
 // ?????测试for下面的IF是否是因为循环无法判断最后一个数
 if (isNum(str.substring(str.length() - 1))) {
  Infix.addLast(sub);      // 首先sub进Infix
  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);
  */
 menu.add(0, 1, 1, "退出");
 menu.add(0, 2, 2, "关于");
 menu.add(0, 3, 3, "帮助");
 return super.onCreateOptionsMenu(menu);
 /* return true; */
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 // TODO Auto-generated method stub
 //finish();
 if (item.getItemId() == 2)
 {
  // 利用Toast来显示提示信息
  Toast.makeText(MainActivity.this,"作者:歡  联系:cdch@gmail.com", Toast.LENGTH_LONG).show();
 }
 if (item.getItemId() == 3)
 {
  // 利用Toast来显示提示信息
  Toast.makeText(MainActivity.this,"适用于一般算数运算!", Toast.LENGTH_LONG).show();
 }

 return super.onOptionsItemSelected(item);
 };

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android开发实现的简单计算器功能【附完整demo源码下载】

    本文实例讲述了Android开发实现的简单计算器功能.分享给大家供大家参考,具体如下: 这个Android计算器虽然还有点小bug,不过简单的计算功能还是没问题的哦: 先上图看效果 比较简单,所以我就没怎么写注释,应该一看就能明白的 有不明白的可以发信问我 先贴MainActivity.java代码 package com.example.calculator; import android.app.Activity; import android.os.Bundle; import andro

  • 简单实现Android计算器功能

    自己写的安卓的计算器: 注:这个是在mac中开发的,如果要在windows的eclipse中运行可能会出现路径问题,解决办法从windows中已有的安卓工程根目录下复制一下classpath文件,然后复制粘贴覆盖掉这个工程根目录里面的路径文件,再导入工程应该就可以打开了.  安卓计算器Android <wbr>calculator 工程下载链接:https://github.com/jiangxh1992/Android-Calculator 代码: package com.example.c

  • 从零开始学android实现计算器功能示例分享(计算器源码)

    下面是效果展示: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match

  • android计算器简单实现代码

    本文实例为大家分享了android计算器的具体实现代码,供大家参考,具体内容如下 java代码: package com.itheima74.simplecalculator4; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; imp

  • Android中使用GridLayout网格布局来制作简单的计算器App

    关于GridLayout 在android4.0版本之前,如果想要达到网格布局的效果,首先可以考虑使用最常见的LinearLayout布局,但是这样的排布会产生如下几点问题: 1.不能同时在X,Y轴方向上进行控件的对齐. 2.当多层布局嵌套时会有性能问题. 3.不能稳定地支持一些支持自由编辑布局的工具. 其次考虑使用表格布局TabelLayout,这种方式会把包含的元素以行和列的形式进行排列,每行为一个TableRow对象,也可以是一个View对象,而在TableRow中还可以继续添加其他的控件

  • Android Studio实现简易计算器

    如果是制作简易计算器的话是基本没有难点的,供大家参考,具体内容如下 步骤是先写好界面布局,将按钮的布局.字号颜色啥的做好,再就是设置监听器. 使用了NoTitleBar的主题 代码如下: activity_main里关于界面的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a

  • Android计算器编写代码

    其实这个安卓计算机,所有的后台思想与<C#计算器编写代码>是一模一样的.Win窗体程序移植到安卓,从C#到Java其实很简单的,因为两者的基本语法都很相像,唯一的难点是安卓的xml布局部分,不像C#窗体能够直接拖.  还是如下图一个能够完成基本四则运算的计算器: 先在res\values\strings.xml设置按钮相应的字体,以免布局文件警告满天飞: <?xml version="1.0" encoding="utf-8"?> <r

  • android计时器,时间计算器的实现方法

    需求:默认为"00:00:00",点击开始按钮时清零后开始计时,出现如10:28:34.点击停止的时候停止计时.问题:使用Calendar DateFormat的方法,不设置时区获取到的小时是本地时区的(东八区的就是8),设置成GMT标准时区获取到的时间是12小时(12:00:00),设置24小时制无效.在开始时间加减各种小时都无效,而且计时只能到12小时就自动跳上去了,始终无法出现默认状态00:00:00开始计时的效果.尝试各种时间设置方法无效后只能自己写一个根据秒数转换时间格式字符

  • android计算器代码示例分享

    复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><EditText    android:id="@+id/editText1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:ems="10&quo

  • Android实战教程第一篇之最简单的计算器

    从今天开始,本专栏持续更新Android简易实战类博客文章.和以往专栏不同,此专栏只有实例.每个实例尽量按照知识点对应相应一章节的内容去写,循序渐进.有些实例可能会与另一个专栏有重复的文章. 开始本专栏的第一个简易案例: 首先设置两个布局文件,一个布局文件进行输入数据,获取加法运算:另一个布局文件进行显示最终结果.Activity1启动Activity2,并传递计算结果值给Activity2. main.xml: <?xml version="1.0" encoding=&quo

随机推荐