计算器设计思路/问题/总结

计算器设计思路

代码见github,地址如下:https://github.com/Hpsyche/Android_Calculator

计算器界面的实现

界面如下:

在这里插入图片描述

过程:

  • 首先通过网格布局,设计网格为6行4列;
  • 第一行放置文本标签textview,用于显示数字和符号,及回响计算结果;
  • 第二行用于放置两个button,一个用于清除textview,一个用于清除textview的最后一个字符;
  • 后面四行用于放置0-9、及±*/.=符号;

应注意:需要给textview和各个按钮添加id,以便在.java中实现对按钮的监听及对textview的回响显示。

MainActivity的设计

过程:

  • 获取各按钮;

  • 各按钮添加监听器及监听事件;

    • 对于0-9和±*/,可以设置同一个监听器(否则代码太过于冗余),对此需要在监听器中先判断button的来源,并对应符号进行回响;

      其关键代码:

      class MyClick implements View.OnClickListener {
             
              @Override
              public void onClick(View v) {
             
                  //获得view的名称中"button"的位置
                  int index=v.toString().lastIndexOf("button");
                  //view名称中有"button*"的信息,可利用*来确定事件来源者身份
                  String buttonNum=v.toString().substring(index+6,index+7);
                  if(buttonNum.equals("A")){
             
                      sb.append("+");
                  }
                  else if(buttonNum.equals("B")){
             
                      sb.append("-");
                  }
                  else if(buttonNum.equals("C")){
             
                      sb.append("*");
                  }
                  else if(buttonNum.equals("D")){
             
                      sb.append("/");
                  }
                  else if(buttonNum.equals("O")){
             
                      sb.append(".");
                  }
                  //如果不属于+-*/. ,则直接添加即可
                  else {
             
                      sb.append(buttonNum);
                  }
                  textView.setText(sb);
              }
          }
      
    • 对于清除按钮的监听器,设置textview长度为0即可;

    • 对于撤回按钮的监听器,先判断是否已为0,为0则设置为空即可;不为0则去除最后一位;

    • 对于“=”的监听事件,是本设计的重点,也是最为复杂的;首先需要通过正则判断输入是否不符合运算规则:

      • 若不符合,回显“输入有误!”
      • 若符合,通过新建的utils工具类(下文介绍)计算出结果并回显;

Utils.Calculate设计

此类最为关键,用于计算结果

过程:

  • 1.首先定义三个列表,用于存储各信息
    • List math:用于存储计算式中的数字
    • List flag:用于存储计算式中的符号
    • List mulDiv:用于存储 “在flag列表中*或/的下标” 的list列表,以便后续的优先级运算
  • 2.循环计算式中各字符,并将数字存储于math,将符号存储于flag,将mulDiv中;
  • 3.若mulDiv不为空,则按先后计算mulDiv前后两数*或/的结果;
    • 由于mulDiv存储的为flag列表的 * 或 / 的下标,故可利用flag,找到该 * 或 / 符号,并在math列表中找到其前后的数字;
    • 判断flag及数字的类型(整型 / 浮点型),并进行 * 或 / 运算;
  • 4.计算完毕后在math中remove前后两数,在flag中remove该符号,在mulDiv中remove第一位,并在math后重新添加计算结果;
  • 5.循环步骤3-4至mulDiv为0,此时计算式只剩下±,原理大体同3-4,按先后计算flag前后两数*或/的结果,计算完毕后在math中remove前后两数,在flag中remove该符号,并在math后重新添加计算结果;
  • 最终即可得出运算结果。

由于此算法较为复杂,在此贴出该Calculate工具类的完整代码:

package com.example.hpsyche.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 计算器工具类,负责计算结果
 */
public 
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值