zoukankan      html  css  js  c++  java
  • iOS小程序-混合计算器

    1、实现功能:输入想要计算的表达式  例如3+2*2-9/3*2,计算器不会输入一点就算一点,而是在你输入=号的时候,根据运算符的优先级进行运算

    2、思路:a、首先由于Lable上显示的都是字符串,那么我们输入的这一串表达式也最好以字符串的形式保存起来

          b、所以我们可以定义两个数组numMutableArray和operationMutableArray,一个用来存放数字,一个用来存放运算符。例如上面那个表达式,numMutableArray里面就存放[3,2,2,9,3,2],operationMutableArray里面就存放[+,*,-,/,*],而且它们的索引值是对应的

          c、接下来我们就可以遍历operationMutableArray这个数组,当出现* 或者/运算符的时候就把索引值i和i+1在numMutableArray里面对应值做相应的就算,这样第一遍便利结束,我们就可以把乘除运算完了,第二遍就来解决加法和减法

          d、接下来就是注意一些小细节,比如两个数运算完之后,我们需要将得到的这个数放在原来索引值为i的位置上,所以需要替换,那i+1位置上的数我们就需要删除,包括i对应的那个运算符也要删除

    3、开始实现

    a、首先打开Xcode,创建一个SingleViewApplication工程

    得到如图的界面

    b、在左侧的storyboard里面我们可以看到一个iphone的模拟样式,点击模拟样式的最上边,然后在最右侧的选项里去掉这两个选项

    c、我们可以使用最右侧下方的工具栏里的label和button工具为计算器添加框架,如图

       添加显示文字的UILabel

           .可以自由拖动,调整视图在界面上的大小

        .改变alignment属性 设置居右对齐  

        .设置font属性 改变文字的显示大小

        .background 设置背景颜色

        .text 设置显示的文字

      button一样的设置

    d、接下来点击Xcode右上方的按键

    得到与这个storyboard相对应的ViewController.m,在模拟样式里将鼠标放在按键上,按住ctrl键拖动,可以得到点击这个按钮的方法如图

    然后将功能相同的数字键全部添加到这个方法上,你可以看到方法左侧有一个小加号,拖动加号到数字键上,就可以完成连接了,用相同的方法将操作键 + - * /完成,还有一个=号和清零键,对了还要把上方的label拖到代码里,定义一个属性变量,如图

    e、拖拽工作全部完成后,我们开始进入代码阶段,具体实现的代码如下:

    #import "ViewController.h"

     

    //定义一个记录当前是输入数字还是操作键的枚举

    typedef enum{

        kStatusNum,

        kStatusOperation,

        kStatusDone

    }kStatus;

     

    //定义一个判断当前操作是加减操作还是乘除操作的枚举

    typedef enum {

        kComputetypePrimary,

        kComputetypeSenior

    }kComputetype;

     

    //定义一个当前操作是什么的枚举

    typedef enum{

        kOperationTypeAdd = 1,

        kOperationTypeMinus,

        kOperationTypeMultiple,

        kOperationTypeDevide

    }kOperationType;

     

    @interface ViewController ()

    @property (weak, nonatomic) IBOutlet UILabel *resultLable;

    @property (nonatomic, assign) kStatus status;

    @property (nonatomic, strong) NSMutableArray *numMutableArray;//存放输入的每个数字

    @property (nonatomic, strong) NSMutableArray *operationMutableArray;//存放输入的每个运算符

    @property (nonatomic, strong) NSDictionary *operationDic;//定义个字典

    @end

     

    @implementation ViewController

     

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.status = kStatusNum;

        //初始化数组

        self.numMutableArray = [NSMutableArray array];

        self.operationMutableArray = [NSMutableArray array];

        //初始化字典

        self.operationDic = @{@"+":@1, @"-":@2, @"*":@3, @"/":@4};

    }

     

    //按下数字键

    - (IBAction)numButtonDidClicked:(UIButton *)sender {

        //获取按钮上面的数字

        int num = [sender.titleLabel.text intValue];

        long long showNum;

        

        //判断是否是一个新的数字的开始

        if (self.status == kStatusNum) {

            //不是一个新的数字的开始

            //计算(拼接)输入的数字

            showNum = [self.resultLable.text longLongValue] * 10 + num;

        }else{

            //判断之前是否有结果  如果有结果  我们将丢弃这个结果

            if (self.status == kStatusDone) {

                [self.numMutableArray removeAllObjects];

            }

            //这是一个新的数字的开始

            showNum = num;

            

            self.status = kStatusNum;

        }

        //显示在label

        self.resultLable.text = [NSString stringWithFormat:@"%lld",showNum];

        

    }

     

    - (IBAction)operationButtonDidClicked:(UIButton *)sender {

        //判断是不是重复按下操作键了

        if (self.status != kStatusOperation) {

            //1.上一个不是按下操作键

            //改变当前的状态  通知上面的方法 开始输入新的数字了

            self.status = kStatusOperation;

            

            //这个数字结束了  将这个数字保存到数组里面

            [self.numMutableArray addObject:self.resultLable.text];

            

            //保存当前点击按钮上的title

            [self.operationMutableArray addObject:sender.titleLabel.text];

        }else{

            //2.重复按下操作键

            //用新的操作键代替原来那个

            //获取数组的最后一个索引值

            NSInteger lastIndex = self.operationMutableArray.count - 1;

            

            //替换

            [self.operationMutableArray replaceObjectAtIndex:lastIndex withObject:sender.titleLabel.text];

        }

    }

     

    //等号被按下

    - (IBAction)calculate:(UIButton *)sender {

        //添加当前最后一个数字

        [self.numMutableArray addObject:self.resultLable.text];

        //开始计算

        [self computeWithtype:kComputetypeSenior];

        [self computeWithtype:kComputetypePrimary];

        

        //将结果显示到界面上

        self.resultLable.text = [self.numMutableArray firstObject];

        

        self.status = kStatusDone;

        

        [self.numMutableArray removeAllObjects];

        

    }

     

    - (void)computeWithtype:(kComputetype)type{

        NSString *firstOperation;

        NSString *secondOperation;

        if (type == kComputetypePrimary) {

            firstOperation = @"+";

            secondOperation = @"-";

        }else{

            firstOperation = @"*";

            secondOperation = @"/";

        }

        //开始计算

        for (int i = 0; i< self.operationMutableArray.count; i++) {

            //获取i对应的运算符

            NSString *opr = [self.operationMutableArray objectAtIndex:i];

            

            //判断是什么运算符

            if ([opr isEqualToString:firstOperation]||[opr isEqualToString:secondOperation]) {

                //获取即将进行运算的两个数

                long long firstNum = [[self.numMutableArray objectAtIndex:i] longLongValue];

                long long secondNum = [[self.numMutableArray objectAtIndex:i+ 1 ]longLongValue];

                long long result = [self compute:firstNum second:secondNum operation:opr];

                

                //覆盖i对应的值

                [self.numMutableArray replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%lld",result]];

                

                //删除后面的一个数

                [self.numMutableArray removeObjectAtIndex:i+1];

                

                //删除i对应的那个运算符

                [self.operationMutableArray removeObjectAtIndex:i];

                

                //i因为删除了后面的一个数

                i--;

            }

            

        }

    }

     

    //计算结果

    - (long long)compute:(long long)firstNum second:(long long)secondNum operation:(NSString *)operation{

        //从字典里面获取这个字符串的运算符对应的枚举值

        kOperationType type = (kOperationType)[[self.operationDic objectForKey:operation] longLongValue];

        

        long long result;

        switch (type) {

            case kOperationTypeAdd:

                result = firstNum + secondNum;

                break;

            case kOperationTypeMinus:

                result = firstNum - secondNum;

                break;

            case kOperationTypeMultiple:

                result = firstNum * secondNum;

                break;

            case kOperationTypeDevide:

                result = firstNum / secondNum;

                break;

            default:

                break;

        }

        return result;

    }

     

    //清空

    - (IBAction)clearButtonDidClicked:(UIButton *)sender {

        self.resultLable.text = @"0";

        [self.numMutableArray removeAllObjects];

        [self.operationMutableArray removeAllObjects];

        self.status = kStatusNum;

    }

    - (IBAction)isPlusButtonDidClicked:(UIButton *)sender {

        long long num = [self.resultLable.text longLongValue];

        long long num2 = -(num);

        self.resultLable.text = [NSString stringWithFormat:@"%lld",num2];

    }

     

    @end

    最后,这个计算器还不是太好,小数点的功能还没有实现,也就是说无法完成某些除法,小数的运算,本人也是新手,欢迎讨论,不喜勿喷!

  • 相关阅读:
    2019年面试题1
    面试题
    vsftp多个用户公享同一个文件,但是权限不同
    centos7搭建ftp
    安装v2ra y
    centos7安装lamp
    日升昌面试题
    一些插件
    面试被怼集(字节跳动篇)
    TOMCAT原理详解及请求过程(转载)
  • 原文地址:https://www.cnblogs.com/zhaopengs/p/5086998.html
Copyright © 2011-2022 走看看