小小计算器

-

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

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

首先是

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

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

时间: 2024-10-27 12:36:23

小小计算器的相关文章

【C++探索之旅】第一部分第五课:简易计算器

内容简介 1.第一部分第五课:简易计算器 2.第一部分第六课预告:控制流程,随心所至 简易计算器 上一课<[C++探索之旅]第一部分第四课:内存,变量和引用>中,我们已经学习了挺重要的内存的概念,变量的知识,对引用这个C++中常用的技术也有了初步的了解. 我们在上一课开头处用一个小小计算器的存储技术引出内存的概念.其实我们的电脑兄也是一个计算器,只不过高端大气上档次了很多,不然怎么会被称为 computer呢?英语中compute这个词,正是<计算>的意思,而加上r就构成了名词.c

安卓利用栈和算术表达式优先级实现进阶版计算器

先po上具体的源代码 简单的xml文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

[连载]Java程序设计(02)---任务驱动方式:个人所得税计算器

上周有厂商到公司测试,拿了一块据说很猛的网络处理加速PCIe板卡,拎在手里沉甸甸的很有分量,最让人意淫的是那4个万兆光口,于是我迫不及待的想要一览光口转发时那种看不见的震撼.       可是,仅凭4个光口怎么测试?起码你要有个"对端"啊!任何人应该都不想扛着三台机器在客户们之间跑来跑去测试其转发性能,当然你也不能指望客户那里就一定有你需要的"对端"设备,比如我们公司就没有这种和万兆光口对接的设备,不过赶巧的是,那天还真有一台设备带有万兆光口,但是只是碰巧了.最佳的

事件监听 计算器

package 事件监听;import java.awt.*;import java.awt.event.*;public class Event extends Frame implements ActionListener { private Button button1; public Event() //导入AWT包  {   super("个人信息");           //窗口标题      this.setSize(280,300);    //组件尺寸      t

【自动化__GUI自动化】__java__Windows应用程序识别__计算器

一.代码如下 package www.woniu.gui.one; import java.awt.AWTException; import java.awt.Robot; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.aw

bzoj2242: [SDOI2011]计算器.

2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 4353  Solved: 1679[Submit][Status][Discuss] Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数. In

j2ee-JSP之简单计算器

来源韩顺平.j2ee视频实战教程jsp第1讲(下集) -------------------------------------------------------------------------------------------------------- 简单计算器,可以控制输入的数(仅第一个数)不能为空且不能为字符串 myCal.jsp代码 1 <!--这是计算器的界面 --> 2 <!-- 可以控制输入的数不能为空且不能为字符串 --> 3 <%@ page co

通过键盘接收数值和字符,实现计算器功能。

import java.util.Scanner; /** * @author 蓝色以太 * 通过键盘接收数值和字符,实现计算器功能. */ public class Calculator { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入第一个数值:"); double num1=sc.nextDouble(); System.out

Android计算器APP练习(1)--- 界面

Android Studio 2.3.2 .参考文章:http://blog.csdn.net/like_program/article/details/51813632 1. 新建工程 MyCalculator,一路下一步,均采用默认值. 2. 按照要求修改三个xml文件内容.很多地方工程名字不一样,改成自己的名字. 3. 按照步骤修改Activity_main.XML文件,遇到问题: android:singleLine="false" 过时 暂时处理方式:删掉此行. 4. 按照步