温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android怎么实现简单计算器功能

发布时间:2021-04-16 09:31:52 来源:亿速云 阅读:203 作者:小新 栏目:移动开发

这篇文章主要介绍了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);  };   }

感谢你能够认真阅读完这篇文章,希望小编分享的“android怎么实现简单计算器功能”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI