android实现简单计算器功能
本文实例为大家分享了android实现简单计算器的具体代码,供大家参考,具体内容如下
//日期:2014/9/26 //首先,人们的输入习惯为中缀表达式。为了便于计算,程序会将中缀表达式会转换为后缀表达式 //////////////////////////////////////////////////////////////////////////////////////// //目前软件还存在 //1.输入运算数和运算符不匹配时,崩溃的现象。(如:只输入一个操作数) //2.一个数字中重复输入两个小数点。(如4.5.6) //这两个重大的bug,后续会继续修改 //////////////////////////////////////////////////////////////////////////////////////// //只有一种布局。这也会在后续考虑完善。 //若有其他不完善的地方,请指正。(╯▽╰) packagecom.example.countea; importandroid.os.Bundle;//不太明白到底是啥 importandroid.app.Activity; importandroid.view.Menu; importandroid.view.MenuItem; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.Toast;//显示版权信息 importjava.util.Iterator;//迭代器 importjava.util.LinkedList;//双向列表 publicclassMainActivityextendsActivity{ privateEditTextcontent; privateEditTextoperaline; privateDoublefirst_num=0.0;//第一个操作数 privateDoublesec_num=0.0;//第二个操作数 //无法设置bool型变量????? privatestaticintequal_flg=0;//等号的状态:FALSE表示未按过等号,TRUE表示已经按过等号 privatedoublenegative_mark=0;//正负数标记 LinkedListInfix=newLinkedList ();//对content进行解析,即存放中缀表达式的链表 LinkedList Suffix=newLinkedList ();//存放后缀表达式的链表 LinkedList Suffix_Num=newLinkedList ();//存放后缀表达式的数字链表 LinkedList OP=newLinkedList ();//1.作为临时存放运算符的链表;2.存放后缀表达式的运算符 @Override protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //处理"c"清屏按钮功能 Buttonclear=(Button)findViewById(R.id.clear); clear.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv) { //TODOAuto-generatedmethodstub 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删除当前操作按钮功能 Buttoncurrent_clear=(Button)findViewById(R.id.current_clear); current_clear.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv) { //TODOAuto-generatedmethodstub 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退格按钮功能 Buttonback=(Button)findViewById(R.id.back); back.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub content=(EditText)findViewById(R.id.content); Stringstr=content.getText().toString(); if(content.getText().length()!=0) content.setText(str.substring(0,str.length()-1)); content.setSelection(content.getText().length());//暂时不知道有什么用,若编辑框为空则无需处理,验证是否会导致异常退出 } }); //考虑对符号键和数字键是否需要分开实现 //实现对"0123456789.+-*/()"按钮的监听;而对"="按钮的监听则采用匿名内部类的方法在onCreate()方法体内进行 OnClickListenermylistener=newOnClickListener() { @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub Buttonnum_btn=(Button)v; content=(EditText)findViewById(R.id.content); //储存界面运算式 Stringcontent_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()); } }; //无需特别处理的数字和符号按钮 Buttonnum1=(Button)findViewById(R.id.num_1); num1.setOnClickListener(mylistener); Buttonnum2=(Button)findViewById(R.id.num_2); num2.setOnClickListener(mylistener); Buttonnum3=(Button)findViewById(R.id.num_3); num3.setOnClickListener(mylistener); Buttonnum4=(Button)findViewById(R.id.num_4); num4.setOnClickListener(mylistener); Buttonnum5=(Button)findViewById(R.id.num_5); num5.setOnClickListener(mylistener); Buttonnum6=(Button)findViewById(R.id.num_6); num6.setOnClickListener(mylistener); Buttonnum7=(Button)findViewById(R.id.num_7); num7.setOnClickListener(mylistener); Buttonnum8=(Button)findViewById(R.id.num_8); num8.setOnClickListener(mylistener); Buttonnum9=(Button)findViewById(R.id.num_9); num9.setOnClickListener(mylistener); Buttonpoint=(Button)findViewById(R.id.point); point.setOnClickListener(mylistener); Buttonleft=(Button)findViewById(R.id.left); left.setOnClickListener(mylistener); Buttonright=(Button)findViewById(R.id.right); right.setOnClickListener(mylistener); Buttonplus=(Button)findViewById(R.id.plus); plus.setOnClickListener(mylistener); Buttonsubtract=(Button)findViewById(R.id.subs); subtract.setOnClickListener(mylistener); Buttonmultiply=(Button)findViewById(R.id.multiply); multiply.setOnClickListener(mylistener); Buttondivide=(Button)findViewById(R.id.division); divide.setOnClickListener(mylistener); //对按钮0的处理 Buttonnum0=(Button)findViewById(R.id.num_0); num0.setOnClickListener(newOnClickListener() { @Override publicvoidonClick(Viewv) { content=(EditText)findViewById(R.id.content); //当前编辑框中的值为0 if("0".equals(content.getText().toString())||""==content.getText().toString()) { content.setText("0"); } //编辑框已有非0数据 else { Stringstr=content.getText().toString(); str+="0"; content.setText(str); } content.setSelection(content.getText().length()); //Toast.makeText(MainActivity.this,"GET",Toast.LENGTH_LONG).show(); } }); //对“-/+”的处理 Buttonmark_sign=(Button)findViewById(R.id.mark_sign); mark_sign.setOnClickListener(newOnClickListener() { @Override publicvoidonClick(Viewv) { content=(EditText)findViewById(R.id.content); Stringjudge_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(); } } }); //实现"="按钮的功能 Buttonequal=(Button)findViewById(R.id.equal); equal.setOnClickListener(newOnClickListener() { @Override publicvoidonClick(Viewv) { //TODOAuto-generatedmethodstub content=(EditText)findViewById(R.id.content); operaline=(EditText)findViewById(R.id.operatline); //str_Infix为待转换的中缀表达式 Stringstr_Infix=content.getText().toString(); //友好的界面提示处理 Stringequate=str_Infix; equate+="="; operaline.setText(equate); operaline.setSelection(content.getText().length()); //调用Analysis函数对content进行解析 MainActivity.this.Analysis(str_Infix); System.out.println(Infix); //至此,中缀表达式已存放到Infix链表中 Iterator it=Infix.iterator(); while(it.hasNext()) { Stringtmp_str=it.next(); if(isNum(tmp_str)) { //如果是数字或小数点则直接进入Suffix链表; Suffix.addLast(tmp_str); } //如果不是数字或小数点的话; else { intOP_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) { Stringtemp_OP=OP.removeLast(); while(getLevel(temp_OP)!=-2){ Suffix.addLast(temp_OP); temp_OP=OP.removeLast(); } } //tmp_str为"(",则直接入OP elseif(getLevel(tmp_str)==-2) { OP.addLast(tmp_str); } //tmp_str比OP_level优先级低又不是"("")", //则OP一直出栈直到OP为空或tmp_str比OP_level优先级高 else { Stringstr2=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())) { Stringcount_str=Suffix.removeFirst(); if(isOP(count_str)) { charcompare_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列表中取出的数据,处理结果后显示到界面上。 Doubleresult=Suffix_Num.removeFirst(); Stringres_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()方法来检测元素是否为数值 publicbooleanisNum(Stringstr){ intnum=0; for(inti=0;i 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。