android 简易计算器

来源:互联网 发布:破解今日头条算法推荐 编辑:程序博客网 时间:2024/05/22 08:14
//  日期: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.存放后缀表达式的运算符@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 处理"c"清屏按钮功能Button clear = (Button) findViewById(R.id.clear);clear.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcontent = (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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcontent = (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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcontent = (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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubButton 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() {@Overridepublic void onClick(View v) {content = (EditText) findViewById(R.id.content);// 当前编辑框中的值为0if ("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() {@Overridepublic 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcontent = (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的顶运算符优先级高则入OPif (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为"(",则直接入OPelse 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进入Suffixwhile (!OP.isEmpty()) {Suffix.addLast(OP.removeLast());}System.out.println(Suffix);// 至此,中缀表达式已全部转化为后缀表达式Suffix// 后缀表达式的计算过程???未指定操作数时 默认为0while (!(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;elsereturn false;}// 自定义isOP()方法来检测Suffix列表的元素是否为运算符public boolean isOP(String strr) {if (strr.equals("+") || strr.equals("-") || strr.equals("*")|| strr.equals("/"))return true;elsereturn 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进Infixsub = "";             // 将sub清空}Infix.addLast(strr);      // "+-*/" "(" ")" 则直接进Infix表}}// ?????测试for下面的IF是否是因为循环无法判断最后一个数if (isNum(str.substring(str.length() - 1))) {Infix.addLast(sub);           // 首先sub进Infixsub = "";                     // 将sub清空}}@Overridepublic 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; */}@Overridepublic 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 0
原创粉丝点击