-
自己做了个简易的小计算器,目前仅实现加减乘除操作,后续还未完善,只是简单记录一下自己的学习历程
计算器制作布局很简单,只是运用的算法清晰即可制作,我是运用了中缀表达式转化成后缀表达式,然后来的出计算器的算法。
首先是
(1)若为数字直接输出,并且储存在pre_out数组中,
(2)遇到运算符,若栈为空,则进栈,不然先弹出优先级较高的运算符到pre_out,再将运算符弹入栈中
(3)当读取完字符串,就将栈里面的元素都弹出,此时pre_out就是一个后缀表达式
(4)然后对pre_out进行操作,当遇到操作数,则直接加入栈中,当遇到运算符,则从栈中弹出两个元素进行运算,但是要注意元素的先后顺序和运算符的种类,即减法和除法要注意元素弹出的顺序,后弹出的应该作为被除数和被减数。
(5)在操作过程中,如果遇到运算符但是栈中只有一个元素,那么说明无法进行运算,表达式为错误表达式,我们就用Toast提示用户重新输入
(6)对的表达式最后应该栈中只有一个元素,那个就是结果取出输出即可
1 /** 2 * author Cc_Elvis 3 */ 4 package com.hcc.my_calculate; 5 6 import java.util.LinkedList; 7 import java.util.Stack; 8 9 import android.R.integer; 10 import android.R.layout; 11 import android.app.Activity; 12 import android.os.Bundle; 13 import android.view.Menu; 14 import android.view.MenuItem; 15 import android.view.View; 16 import android.view.View.OnClickListener; 17 import android.widget.Button; 18 import android.widget.TextView; 19 import android.widget.Toast; 20 21 public class MainActivity extends Activity 22 { 23 private TextView screenView; 24 private Button zeroBtn; 25 private Button oneBtn; 26 private Button twoBtn; 27 private Button threeBtn; 28 private Button fourBtn; 29 private Button fiveBtn; 30 private Button sixBtn; 31 private Button sevenBtn; 32 private Button eightBtn; 33 private Button nineBtn; 34 private Button plusBtn; 35 private Button minusBtn; 36 private Button divideBtn; 37 private Button MultiBtn; 38 private Button equalBtn; 39 private Button resBtn; 40 private LinkedList<String> NumList=new LinkedList<String>(); 41 private String showString=""; 42 private String[] pre_out=new String[100]; 43 private int pre_out_Num=0; 44 boolean illegal_flag=true; 45 boolean isString=true; 46 @Override 47 protected void onCreate(Bundle savedInstanceState) 48 { 49 super.onCreate(savedInstanceState); 50 setContentView(R.layout.myview); 51 (oneBtn=(Button)findViewById(R.id.One)).setOnClickListener(listen); 52 (twoBtn=(Button)findViewById(R.id.Two)).setOnClickListener(listen); 53 (threeBtn=(Button)findViewById(R.id.Three)).setOnClickListener(listen); 54 (fourBtn=(Button)findViewById(R.id.Four)).setOnClickListener(listen); 55 (fiveBtn=(Button)findViewById(R.id.Five)).setOnClickListener(listen); 56 (sixBtn=(Button)findViewById(R.id.Six)).setOnClickListener(listen); 57 (sevenBtn=(Button)findViewById(R.id.Seven)).setOnClickListener(listen); 58 (eightBtn=(Button)findViewById(R.id.Eight)).setOnClickListener(listen); 59 (nineBtn=(Button)findViewById(R.id.Nine)).setOnClickListener(listen); 60 (equalBtn=(Button)findViewById(R.id.equal)).setOnClickListener(listen); 61 (divideBtn=(Button)findViewById(R.id.Division)).setOnClickListener(listen); 62 (minusBtn=(Button)findViewById(R.id.Minus)).setOnClickListener(listen); 63 (plusBtn=(Button)findViewById(R.id.plus)).setOnClickListener(listen); 64 (MultiBtn=(Button)findViewById(R.id.Multip)).setOnClickListener(listen); 65 (resBtn=(Button)findViewById(R.id.restart)).setOnClickListener(listen); 66 (zeroBtn=(Button)findViewById(R.id.Zero)).setOnClickListener(listen); 67 screenView=(TextView)findViewById(R.id.Screen); 68 Init(); 69 } 70 private OnClickListener listen=new OnClickListener() 71 { 72 73 @Override 74 public void onClick(View v) 75 { 76 Button btn=(Button)v; 77 if( btn.getText().equals("1") || btn.getText().equals("2") || 78 btn.getText().equals("3") || btn.getText().equals("4") || 79 btn.getText().equals("5") || btn.getText().equals("6") || 80 btn.getText().equals("7") || btn.getText().equals("8") || 81 btn.getText().equals("9") || btn.getText().equals("0"))//如果为数字,直接输出并储存在pre_out数组里以转化成后缀表达式 82 { 83 String c=btn.getText().toString(); 84 addString(c);//add to TextEdit 85 if(isString) 86 { 87 pre_out[pre_out_Num]+=c;//add to Stack 88 isString=true; 89 } 90 else 91 { 92 pre_out_Num++; 93 pre_out[pre_out_Num]=c; 94 isString=true; 95 } 96 } 97 else if(btn.getText().equals("AC"))//reset 98 { 99 restart(); 100 } 101 else if(btn.getText().equals("="))//遇到‘=’则对栈开始进行清空并且输出到pre_out里面 102 { 103 while(!NumList.isEmpty()) 104 { 105 pre_out[++pre_out_Num]=NumList.removeFirst(); 106 } 107 if(!GetResult())//judge if result true? 108 { 109 Toast.makeText(MainActivity.this, "输入不合法", Toast.LENGTH_LONG).show(); 110 } 111 else 112 { 113 String restString=screenView.getText().toString(); 114 restart(); 115 screenView.setText(restString); 116 } 117 } 118 else if (btn.getText().equals("+") || btn.getText().equals("-") || 119 btn.getText().equals("*") || btn.getText().equals("/")) 120 { 121 isString=false; 122 String c=btn.getText().toString(); 123 addString(c);//输出到TextView上面 124 if(NumList.isEmpty())//若栈为空则先将运算符压入 125 { 126 NumList.addFirst(c); 127 } 128 else 129 { 130 while(NumList.size()>=1&&get_prior(c)<=get_prior(NumList.getFirst().toString()))////先弹出优先级较高的运算符 131 { 132 if(pre_out_Num>0) 133 pre_out[++pre_out_Num]=NumList.removeFirst();//转为后缀表达式序列 134 else pre_out[pre_out_Num]=NumList.removeFirst(); 135 } 136 NumList.addFirst(c);//再将此运算符入栈 137 } 138 } 139 } 140 }; 141 private void restart()//重新开始 142 { 143 Init(); 144 NumList.clear(); 145 pre_out_Num=0; 146 screenView.setText(""+0); 147 showString=""; 148 } 149 private void addString(String c)//显示结果框的字符串 150 { 151 showString+=c; 152 screenView.setText(showString); 153 } 154 private boolean GetResult()//获取结果 155 { 156 int length=0; 157 while(pre_out[length]!="") 158 { 159 String c=pre_out[length]; 160 if(get_prior(c)==0)//数字直接压入栈 161 { 162 NumList.addFirst(c); 163 length++; 164 } 165 else 166 { 167 compute(c); 168 length++; 169 } 170 } 171 if(NumList.size()>1||get_prior(NumList.getFirst())!=0||illegal_flag==false) 172 return false; 173 if(!NumList.isEmpty()) 174 { 175 int result=Integer.parseInt(NumList.removeFirst()); 176 screenView.setText(""+result); 177 return true; 178 } 179 else return false; 180 } 181 private int get_prior(String c) 182 { 183 if(c.equals("+")||c.equals("-")) 184 return 1; 185 else if(c.equals("*")||c.equals("/")) 186 return 2; 187 else return 0; 188 } 189 private void compute(String c)//计算每一次的结果值 190 { 191 int sum =0,a,b; 192 if(NumList.size()>=2)//如果只剩下一个数,那么肯定不合法 193 { 194 a=Integer.parseInt(NumList.removeFirst()); 195 b=Integer.parseInt(NumList.removeFirst()); 196 } 197 else 198 { 199 illegal_flag=false; 200 return ; 201 } ; 202 if(c.equals("+")) 203 { 204 sum=a+b; 205 } 206 else if(c.equals("*")) 207 { 208 sum=a*b; 209 } 210 else if(c.equals("-")) 211 { 212 sum=b-a; 213 } 214 else if(c.equals("/")) 215 { 216 sum=b/a; 217 } 218 String s=""+sum; 219 NumList.addFirst(s); 220 } 221 private void Init()//初始化表达式 222 { 223 for(int i=0;i<100;i++) 224 pre_out[i]=""; 225 } 226 }
XML
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 <TextView 7 android:layout_marginTop="40dp" 8 android:layout_width="fill_parent" 9 android:layout_height="50dp" 10 android:textSize="40dp" 11 android:text="0" 12 android:gravity="right" 13 android:id="@+id/Screen" 14 /> 15 <GridLayout 16 android:layout_marginLeft="10dp" 17 android:layout_marginTop="50dp" 18 android:layout_height="wrap_content" 19 android:layout_width="wrap_content" 20 android:columnCount="4" 21 android:rowCount="4"> 22 <Button 23 android:layout_marginLeft="10dp" 24 android:layout_marginTop="10dp" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:text="7" 28 android:id="@+id/Seven" 29 /> 30 <Button 31 android:layout_marginLeft="10dp" 32 android:layout_marginTop="10dp" 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:text="8" 36 android:id="@+id/Eight" 37 /> 38 <Button 39 android:layout_marginLeft="10dp" 40 android:layout_marginTop="10dp" 41 android:layout_width="wrap_content" 42 android:layout_height="wrap_content" 43 android:text="9" 44 android:id="@+id/Nine" 45 /> 46 <Button 47 android:layout_marginLeft="10dp" 48 android:layout_marginTop="10dp" 49 android:layout_width="wrap_content" 50 android:layout_height="wrap_content" 51 android:text="/" 52 android:id="@+id/Division" 53 /> 54 <Button 55 android:layout_marginLeft="10dp" 56 android:layout_marginTop="10dp" 57 android:layout_width="wrap_content" 58 android:layout_height="wrap_content" 59 android:text="4" 60 android:id="@+id/Four" 61 /> 62 <Button 63 android:layout_marginLeft="10dp" 64 android:layout_marginTop="10dp" 65 android:layout_width="wrap_content" 66 android:layout_height="wrap_content" 67 android:text="5" 68 android:id="@+id/Five" 69 /> 70 <Button 71 android:layout_marginLeft="10dp" 72 android:layout_marginTop="10dp" 73 android:layout_width="wrap_content" 74 android:layout_height="wrap_content" 75 android:text="6" 76 android:id="@+id/Six" 77 /> 78 <Button 79 android:layout_marginLeft="10dp" 80 android:layout_marginTop="10dp" 81 android:layout_width="wrap_content" 82 android:layout_height="wrap_content" 83 android:text="@string/Multi" 84 android:id="@+id/Multip" 85 /> 86 <Button 87 android:layout_marginLeft="10dp" 88 android:layout_marginTop="10dp" 89 android:layout_width="wrap_content" 90 android:layout_height="wrap_content" 91 android:text="1" 92 android:id="@+id/One" 93 /> 94 <Button 95 android:layout_marginLeft="10dp" 96 android:layout_marginTop="10dp" 97 android:layout_width="wrap_content" 98 android:layout_height="wrap_content" 99 android:text="2" 100 android:id="@+id/Two" 101 /> 102 <Button 103 android:layout_marginLeft="10dp" 104 android:layout_marginTop="10dp" 105 android:layout_width="wrap_content" 106 android:layout_height="wrap_content" 107 android:text="3" 108 android:id="@+id/Three" 109 /> 110 <Button 111 android:layout_marginLeft="10dp" 112 android:layout_marginTop="10dp" 113 android:layout_width="wrap_content" 114 android:layout_height="wrap_content" 115 android:text="-" 116 android:id="@+id/Minus" 117 /> 118 <Button 119 android:layout_marginLeft="10dp" 120 android:layout_marginTop="10dp" 121 android:layout_width="wrap_content" 122 android:layout_height="wrap_content" 123 android:text="0" 124 android:id="@+id/Zero" 125 /> 126 <Button 127 android:layout_marginLeft="10dp" 128 android:layout_marginTop="10dp" 129 android:id="@+id/equal" 130 android:layout_gravity="fill" 131 android:text="=" 132 /> 133 <Button 134 android:layout_marginLeft="10dp" 135 android:layout_marginTop="10dp" 136 android:id="@+id/restart" 137 android:text="@string/ac" 138 /> 139 140 <Button 141 android:layout_marginLeft="10dp" 142 android:layout_marginTop="10dp" 143 android:layout_width="wrap_content" 144 android:layout_height="wrap_content" 145 android:text="+" 146 android:id="@+id/plus" 147 /> 148 </GridLayout> 149 150 <TextView 151 android:layout_width="fill_parent" 152 android:layout_height="wrap_content" 153 android:layout_marginBottom="10dp" 154 android:text="This is CC's Calculator" /> 155 156 </LinearLayout>
代码量较小,健壮性还有待完善