码迷,mamicode.com
首页 > 其他好文 > 详细

小小计算器

时间:2015-09-14 01:54:01      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:

-

自己做了个简易的小计算器,目前仅实现加减乘除操作,后续还未完善,只是简单记录一下自己的学习历程

 

计算器制作布局很简单,只是运用的算法清晰即可制作,我是运用了中缀表达式转化成后缀表达式,然后来的出计算器的算法。

首先是

(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>

代码量较小,健壮性还有待完善

 

小小计算器

标签:

原文地址:http://www.cnblogs.com/Cc1231/p/4805990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!