Android老师布置的课程作业——简单计算器

功能要求实现四则运算,参考界面见下图:

首先给各位老铁提供apk安装包以及项目压缩包,略表诚意~

github地址:https://github.com/wonke/Calculator

使用GirdLayout比较适合计算器这种规则的布局,每行有几个按钮几乎都是固定的,遇到一个按钮需要占两个常规按钮空间时,使用android:layout_columnSpan="2"属性即可解决。

Layout布局代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. xmlns:tools="http://schemas.android.com/tools"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. android:orientation="vertical"
  9. tools:context=".MainActivity">
  10.  
  11. <TextView
  12.  
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:height="30dp"
  16. android:gravity="center"
  17. android:text="@string/title"
  18. android:textAppearance="@style/TextAppearance.AppCompat.Large" />
  19.  
  20. <GridLayout
  21. android:id="@+id/grid_layout"
  22. android:layout_width="match_parent"
  23. android:layout_height="500sp"
  24. android:background="#ece7e7"
  25. android:alignmentMode="alignBounds"
  26. android:columnCount="4"
  27. android:orientation="horizontal"
  28. android:rowCount="10"
  29. android:useDefaultMargins="false">
  30.  
  31. <TextView
  32. android:id="@+id/contentText"
  33. android:background="@drawable/textview_border"
  34. android:gravity="end"
  35. android:textSize="50sp"
  36.  
  37. android:layout_columnSpan="4"
  38. android:layout_columnWeight="1"
  39. android:layout_rowWeight="5"
  40. />
  41.  
  42. <Button
  43. android:id="@+id/allClear"
  44. android:textSize="30sp"
  45. android:background="@drawable/button_border"
  46. android:layout_rowWeight="1"
  47. android:layout_columnWeight="1"
  48. android:text="CE" />
  49.  
  50. <Button
  51. android:id="@+id/divide"
  52. android:textSize="30sp"
  53. android:background="@drawable/button_border"
  54. android:layout_rowWeight="1"
  55. android:layout_columnWeight="1"
  56. android:text="÷" />
  57.  
  58. <Button
  59. android:id="@+id/multiply"
  60. android:layout_rowWeight="1"
  61. android:layout_columnWeight="1"
  62. android:background="@drawable/button_border"
  63. android:text="×"
  64. android:textSize="30sp" />
  65.  
  66. <Button
  67. android:id="@+id/clear"
  68. android:layout_rowWeight="1"
  69. android:layout_columnWeight="1"
  70. android:background="@drawable/button_border"
  71. android:text="C"
  72. android:textSize="30sp" />
  73.  
  74. <Button
  75. android:id="@+id/b7"
  76. android:layout_rowWeight="1"
  77. android:layout_columnWeight="1"
  78. android:background="@drawable/button_border"
  79. android:text="7"
  80. android:textSize="30sp" />
  81.  
  82. <Button
  83. android:id="@+id/b8"
  84. android:layout_rowWeight="1"
  85. android:layout_columnWeight="1"
  86. android:background="@drawable/button_border"
  87. android:text="8"
  88. android:textSize="30sp" />
  89.  
  90. <Button
  91. android:id="@+id/b9"
  92. android:layout_rowWeight="1"
  93. android:layout_columnWeight="1"
  94. android:background="@drawable/button_border"
  95. android:text="9"
  96. android:textSize="30sp" />
  97.  
  98. <Button
  99. android:id="@+id/add"
  100. android:layout_rowWeight="1"
  101. android:layout_columnWeight="1"
  102. android:background="@drawable/button_border"
  103. android:text="+"
  104. android:textSize="30sp" />
  105.  
  106. <Button
  107. android:id="@+id/b4"
  108. android:layout_rowWeight="1"
  109. android:layout_columnWeight="1"
  110. android:background="@drawable/button_border"
  111. android:text="4"
  112. android:textSize="30sp" />
  113.  
  114. <Button
  115. android:id="@+id/b5"
  116. android:layout_rowWeight="1"
  117. android:layout_columnWeight="1"
  118. android:background="@drawable/button_border"
  119. android:text="5"
  120. android:textSize="30sp" />
  121.  
  122. <Button
  123. android:id="@+id/b6"
  124. android:layout_rowWeight="1"
  125. android:layout_columnWeight="1"
  126. android:background="@drawable/button_border"
  127. android:text="6"
  128. android:textSize="30sp" />
  129.  
  130. <Button
  131. android:id="@+id/subtract"
  132. android:layout_rowWeight="1"
  133. android:layout_columnWeight="1"
  134. android:background="@drawable/button_border"
  135. android:text="-"
  136. android:textSize="30sp" />
  137.  
  138. <Button
  139. android:id="@+id/b1"
  140. android:layout_rowWeight="1"
  141. android:layout_columnWeight="1"
  142. android:background="@drawable/button_border"
  143. android:text="1"
  144. android:textSize="30sp" />
  145.  
  146. <Button
  147. android:id="@+id/b2"
  148. android:layout_rowWeight="1"
  149. android:layout_columnWeight="1"
  150. android:background="@drawable/button_border"
  151. android:text="2"
  152. android:textSize="30sp" />
  153.  
  154. <Button
  155. android:id="@+id/b3"
  156. android:layout_rowWeight="1"
  157. android:layout_columnWeight="1"
  158. android:background="@drawable/button_border"
  159. android:text="3"
  160. android:textSize="30sp" />
  161.  
  162. <Button
  163. android:id="@+id/root"
  164. android:layout_rowWeight="1"
  165. android:layout_columnWeight="1"
  166. android:background="@drawable/button_border"
  167. android:text="√ ̄"
  168. android:textSize="30sp" />
  169.  
  170. <Button
  171. android:id="@+id/b0"
  172. android:layout_rowWeight="1"
  173. android:layout_columnSpan="2"
  174. android:layout_columnWeight="1"
  175. android:background="@drawable/button_border"
  176. android:text="0"
  177. android:textSize="30sp" />
  178.  
  179. <Button
  180. android:id="@+id/point"
  181. android:layout_rowWeight="1"
  182. android:layout_columnWeight="1"
  183. android:background="@drawable/button_border"
  184. android:text="."
  185. android:textSize="30sp" />
  186.  
  187. <Button
  188. android:id="@+id/equal"
  189. android:layout_rowWeight="1"
  190. android:layout_columnWeight="1"
  191. android:background="@drawable/button_border"
  192. android:text="="
  193. android:textSize="30sp" />
  194. </GridLayout>
  195.  
  196. </LinearLayout>

MainActivity逻辑处理代码:

  1. import android.support.v7.app.AppCompatActivity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.Button;
  5. import android.widget.TextView;
  6.  
  7. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  8.  
  9. private Button[] buttons = new Button[18];
  10. private int[] ids = new int[]{R.id.allClear,R.id.divide,R.id.multiply,R.id.clear,R.id.b0,R.id.b1,
  11. R.id.b2,R.id.b3,R.id.b4,R.id.b5,R.id.b6,R.id.b7,R.id.b8,R.id.b9,R.id.add,R.id.subtract,
  12. R.id.equal,R.id.point};
  13.  
  14. private TextView textView;
  15. private String expression = "";
  16. private boolean end = false;
  17. private int countOperate=2;
  18.  
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23.  
  24. for (int i=0; i<ids.length;i++){
  25. buttons[i] = findViewById(ids[i]);
  26. buttons[i].setOnClickListener(this);
  27. }
  28. textView = (TextView)findViewById(R.id.contentText);
  29. }
  30. public void onClick(View view) {
  31. int id = view.getId();
  32. Button button = (Button)view.findViewById(id);
  33. String current = button.getText().toString();
  34. if(end){ //如果上一次算式已经结束,则先清零
  35. expression = "";
  36. end = false;
  37. }
  38. if(current.equals("CE")){ //如果为CE则清零
  39. expression = "";
  40. countOperate=0;
  41. }else if(current.equals("C")){ //如果点击退格
  42. if(expression.length()>1){ //算式长度大于1
  43. expression = expression.substring(0,expression.length()-1);//退一格
  44. int i = expression.length()-1;
  45. char tmp = expression.charAt(i); //获得最后一个字符
  46. char tmpFront = tmp;
  47. for(;i>=0;i--){ //向前搜索最近的 +-*/和.,并退出
  48. tmpFront = expression.charAt(i);
  49. if(tmpFront=='.'||tmpFront=='+'||tmpFront=='-'||tmpFront=='×'||tmpFront=='÷'){
  50. break;
  51. }
  52. }
  53. if(tmp>='0'&&tmp<='9'){ //最后一个字符为数字,则识别数赋值为0
  54. countOperate=0;
  55. }else if(tmp==tmpFront&&tmpFront!='.') countOperate=2; //如果为+-*/,赋值为2
  56. else if(tmpFront=='.') countOperate=1; //如果前面有小数点赋值为1
  57. }else if(expression.length()==1){
  58. expression = "";
  59. }
  60. }else if(current.equals(".")){
  61. if(expression.equals("")||countOperate==2){
  62. expression+="0"+current;
  63. countOperate = 1; //小数点按过之后赋值为1
  64. }
  65. if(countOperate==0){
  66. expression+=".";
  67. countOperate = 1;
  68. }
  69. }else if(current.equals("+")||current.equals("-")||current.equals("×")||current.equals("÷")){
  70. if(countOperate==0){
  71. expression+=current;
  72. countOperate = 2; // +-*/按过之后赋值为2
  73. }
  74. }else if(current.equals("=")){ //按下=时,计算结果并显示
  75. double result = (double) Math.round(count()*100)/100;
  76. expression+="="+result;
  77. end = true; //此次计算结束
  78. }
  79. else{//此处是当退格出现2+0时,用current的值替代0
  80. if(expression.length()>=1){
  81. char tmp1 = expression.charAt(expression.length()-1);
  82. if(tmp1=='0'&&expression.length()==1){
  83. expression = expression.substring(0,expression.length()-1);
  84. }
  85. else if(tmp1=='0'&&expression.length()>1){
  86. char tmp2 = expression.charAt(expression.length()-2);
  87. if(tmp2=='+'||tmp2=='-'||tmp2=='×'||tmp2=='÷'){
  88. expression = expression.substring(0,expression.length()-1);
  89. }
  90. }
  91. }
  92. expression+=current;
  93. if(countOperate==2||countOperate==1) countOperate=0;
  94. }
  95. // Toast.makeText(this, "countOperate:"+countOperate, Toast.LENGTH_SHORT).show();
  96. textView.setText(expression); //显示出来
  97. }
  98. //计算逻辑,求expression表达式的值
  99. private double count(){
  100. double result=0;
  101. double tNum=1,lowNum=0.1,num=0;
  102. char tmp=0;
  103. int operate = 1; //识别+-*/,为+时为正数,为-时为负数,为×时为-2/2,为/时为3/-3;
  104. boolean point = false;
  105. for(int i=0;i<expression.length();i++){ //遍历表达式
  106. tmp = expression.charAt(i);
  107. if(tmp=='.'){ //因为可能出现小数,此处进行判断是否有小数出现
  108. point = true;
  109. lowNum = 0.1;
  110. }else if(tmp=='+'||tmp=='-'){
  111. if(operate!=3&&operate!=-3){ //此处判断通用,适用于+-*
  112. tNum *= num;
  113. }else{ //计算/
  114. tNum /= num;
  115. }
  116. // Toast.makeText(this, "tNum = "+tNum, Toast.LENGTH_SHORT).show();
  117. if(operate<0){ //累加入最终的结果
  118. result -= tNum;
  119. }else{
  120. result += tNum;
  121. }
  122. operate = tmp=='+'?1:-1;
  123. num = 0;
  124. tNum = 1;
  125. point = false;
  126. }else if(tmp=='×'){
  127. if(operate!=3&&operate!=-3){
  128. tNum *= num;
  129. }else{
  130. tNum /= num;
  131. }
  132. operate = operate<0?-2:2;
  133. point = false;
  134. num = 0;
  135. }else if(tmp=='÷'){
  136. if(operate!=3&&operate!=-3){
  137. tNum *= num;
  138. }else{
  139. tNum /= num;
  140. }
  141. operate = operate<0?-3:3;
  142. point = false;
  143. num = 0;
  144. }else{
  145. //读取expression中的每个数字,doube型
  146. if(!point){
  147. num = num*10+tmp-'0';
  148. }else{
  149. num += (tmp-'0')*lowNum;
  150. lowNum*=0.1;
  151. }
  152. }
  153. }
  154. //循环遍历结束,计算最后一个运算符后面的数
  155. if(operate!=3&&operate!=-3){
  156. tNum *= num;
  157. }else{
  158. tNum /= num;
  159. }
  160. // Toast.makeText(this, "tNum = "+tNum, Toast.LENGTH_SHORT).show();
  161. if(operate<0){
  162. result -= tNum;
  163. }else{
  164. result += tNum;
  165. }
  166. //返回最后的结果
  167. return result;
  168. }
  169.  
  170. }

简单计算器 安卓 Android 作业的更多相关文章

  1. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  2. Win7的64位系统如何搭建安卓Android开发环境

    在搭建安卓Android开发环境,那么现在比较主流的Win7的64位操作系统如何搭建呢?其实很简单,不需要设置任何环境变量,只需要下载两个程序包(ADT和JDK),下载的时候注意选择相应的64位程序包 ...

  3. C语言,简单计算器【上】

    由于工作需要最近在研究PHP扩展,无可避免的涉及到了C语言.从出了学校以后C语言在实际工作中还没有用到过,所以必须要先进行一点复习工作.个人认为对于熟悉一样东西说最好的方法是上手实践.于是便想起了当时 ...

  4. 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...

  5. 基于Netbeans的安卓Android开发环境配置 - CSDN博客

    原文:基于Netbeans的安卓Android开发环境配置 - CSDN博客 基于Netbeans的安卓Android开发环境配置 一.准备工作 NetBeans 勾选网页中的Accept-选择对应系 ...

  6. 安卓Android碎片fragment实现静态加载

    静态加载好后的界面如下,两个碎片分别位于一个活动的左边和右边: 左边和右边分别为一个碎片,这两个碎片正好将一整个活动布满.一个活动当中可以拥有多个碎片,碎片的含义就是可以在同一个UI界面下,将这个界面 ...

  7. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  8. 安卓Android面试题大全

    56个问题都是经常用到的,可以深入研究下,也是必须掌握的开发必备知识. 安卓Android面试题汇总 搜集了一些Android面试题目,供将要面试或者正在面试的朋友参考. 1, 谈谈你对Activit ...

  9. PAT 06-1 简单计算器

    想看一般简单计算器实现的看客不好意思了,这不是你想要点东西,此处题设为“只能进行加减乘除”.“都是整数”.”优先级相同“和"从左到右".此题来自PAT(http://www.pat ...

随机推荐

  1. codeforces 983B XOR-pyramid

    题意: 定义一个函数f(a): 给出一个数组a,有q个询问,每次询问回答在l到r的区间内,连续子串的f函数的最大值. 思路: 画图,来自codeforces SheepRanger 由此图可知,f(l ...

  2. Js的String对象

    Js的String对象常用方法: 方法一.得到某字符在字符串中的索引位置. str.indexOf(findStr,[index])--返回的是要查找字符在字符串中的位置索引   ,index开始查找 ...

  3. const用法体会

    const三个原则: 第一,如果你参数里面的变量在函数体内不改变,那么把该参数定义成const... : 第二,如果你的函数不会改变类里面的成员变量,把该函数定义成const成员函数,Eg: int ...

  4. 网络模型 - 每天5分钟玩转 Docker 容器技术(169)

    本节我们讨论 Kubernetes 网络这个重要主题. Kubernetes 作为编排引擎管理着分布在不同节点上的容器和 Pod.Pod.Service.外部组件之间需要一种可靠的方式找到彼此并进行通 ...

  5. linux或Mac中./与/

      mac终端命令和linux中命令是一致的,在执行可执行xxx.sh文件时,需要进入xxx.sh文件所在的目录,然后输入./xxx.sh才可以执行成功 1.为什么需要添加./   因为linux/u ...

  6. jQuery学习之旅 Item6 好用的each()

    1.javascript 函数的调用方式 首先来研究一下jquery的each()方法的源码,在这之前,先要回顾一下javascript函数具体调用样式: 普通函数调用 setName(); 可以作为 ...

  7. ps技术--批量给图片加水印

    在日常的办公过程中,对于一些比较重要的文件的扫描件需要特殊处理,这时我们就需要给它们加上水印,保证它们的用途唯一,而这些扫描件很多,不可能一一给他们加水印,所以为提高工作效率,我们就可以使用一些小软件 ...

  8. token.go

    package sego // 字串类型,可以用来表达 //    1. 一个字元,比如"中"又如"国", 英文的一个字元是一个词 //    2. 一个分词, ...

  9. I/O-----字节输入流

    package io.day03; import java.io.FileInputStream; import java.io.InputStream; public class day03 { p ...

  10. Travel 并查集

    题意:给一个图,若干询问,每次询问只经过边权<=w的边,x能到达的点数 并查集啊,对询问和边排序,直接合并,维护size,查询 #include<cstdio> #include&l ...