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进行解析,即存放中缀表达式的链表
LinkedListSuffix=newLinkedList();//存放后缀表达式的链表
LinkedListSuffix_Num=newLinkedList();//存放后缀表达式的数字链表
LinkedListOP=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链表中
Iteratorit=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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。