zoukankan      html  css  js  c++  java
  • 12月29号 计算器(包含混合运算)

    准备工作

    1.创建一个SingleViewApplication工程,默认为我们提供一个界面

    默认界面并不是iphone的界面小   将图中红色的两个选项勾掉  就会变成正常的iphone手机大小

    2.使用Command + shift + h 切换到主屏幕(相当于home键)

    3.如何更改项目的名称和icon图标

      a.info.plist 文件->bundle name->写上工程要显示的名字

      

      b.添加一张图片(放在Supporting Files里面)  命名为icon.png  作为应用程序的图标

            

      c.没有图标的时候可以在www.iconfinder.com上搜索相关的图标

    4.分析计算器

      a.使用到的UI

      1)可以实现点击 - UIButton(按钮)

      添加按钮的方法:在右下角的object  library中搜索uibtton  将button拖到界面上就会在界面上添加一个按钮   如图所示

      

      下图中红圈中的两个按钮可以对这个按钮实现尺寸的调整  和  背景颜色字体颜色大小等属性的更改

      

      2)可以显示内容 - UILabel(文本标签)

      添加文本标签的方法和添加按钮的方法一样,只是将搜索的uibutton改成了uilabel   更改其他属性也和按钮一样

      

      3)用户能够看到的界面我们称作界面 - UIViewController

      4)如何实现上面的相应内容 - (storyboard)

    5.如何实现

      ps:iPhone5/5s的尺寸   320 * 568

        iPhone4/4s的尺寸   320 * 480

      a.添加显示文字的uilabel

        1)可以自由拖动,调整试图在界面上的大小

        2)改变alignment属性  设置 居右对齐

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

        4)background 设置背景颜色

        5)text设置显示的文字

       基本的界面大概就是下面的样子

      

      b.如何接受用户的点击事件

        1)storyboard里面的每一个界面都应该有相应的控制器和它相关联

          一个界面就是一个UIViewController

          因为计算器程序只有一个界面, storyboard里面的界面和viewController相关联

          storyboard里面负责界面的布局

          viewController负责代码逻辑

        2)IBAction用于关联storyboard里面控件的事件

      将鼠标放在要关联的按钮上  按住ctrl键 拖动到 viewController.m文件当中  如图

      之后会出现如下的界面  可以对IBAction进行设置   

      type尽量选成uibutton类型  如果选成id类型  接下去用的时候  还要转换类型  比较复杂

    如果要对多个按钮进行关联  可以像上面一个一个进行拖动   也可以像下图那样在红点处直接拖到storyboard上

      在这个程序中,我们把数字放在一个IBAction中, 把加减乘除放在另一个IBAction中

      c.在关联类里面 如何获取storyboard对面的UI对象

      IBOutlet  用于关联storyboard里面控件本身

      右击uilabel  选择new reference outlet   拖动到如下图的位置

    界面做好后  并且将界面和viewController相关联之后  我们要做的就是将计算器所要实现的功能用代码在viewController.h中写出来

    比如我们要计算2 + 3 * 5 - 12 / 4 - 6

    这个是混合运算  运算符有优先级

    我的想法是定义两个数组   一个专门存放数字    一个专门存放运算符

    那么这样子的话  上面的式子就变成了{2,3,5,12,4,6}

                    {+,*,-,/,-}

    将式子里面的数字和运算符添加到数组中之后       需要我们我们对存储运算符的数组进行遍历

    当碰到乘号和除号的时候  比如上面的式子中  我们找到了乘号  需要我们计算的就是3 * 5

    那么我们需要先找到乘号在数组中的索引值   可以知道例子中是1

    同时我们也看到了  3和5的索引值分别是1,2   由此我们可以看出参与计算的两个数字的索引值就是乘号的索引值和索引值加上1

    第一次计算之后,我们需要将计算的结果覆盖在原来索引值为1的数字上,并且将索引值为2的数字删除,同时将索引值为1的乘号删掉

    (当然  上述的式子中乘号和除法是同时进行的)

    所以第一次计算之后  两个数组就变成了{2,15,3,6}

                      {+,-,-}

    乘除计算结束之后  就轮到优先级第一等的加减法运算了,原理和乘除法中是一样的   最后得到的结果就是8

    #import "ViewController.h"

     

    typedef enum{

        kStatusNum,

        kStatusOperation,

        kStatusDone

    }kStatus;//记录当前操作的状态

     

    typedef enum{

        kLevelTypePrimary,//加减运算

        kLevelTypeSenior//乘除运算

    }kLevelType;

     

    typedef enum{

        kOperationTypeAdd = 1,

        kOperationTypeMinus,

        kOperationTypeMultiple,

        kOperationTypeDivide,

        kOperationTypeMod

    }kOperationType;

     

     

     

    @interface ViewController ()

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

    @property (nonatomic, assign) kStatus status;

    @property (nonatomic, strong) NSMutableArray *paramArray;//存放每个数字

    @property (nonatomic, strong) NSMutableArray *operationArray;//存放运算符

    @property (nonatomic, strong) NSDictionary *operationEnumDic;

     

     

    @end

     

    @implementation ViewController

     

    - (void)viewDidLoad {

        [super viewDidLoad];

        //进行初始化

        self.paramArray = [NSMutableArray array];

        self.operationArray = [NSMutableArray array];

        self.status = kStatusNum;

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

       

    }

     

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

        //获取按钮上面的数字

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

        long long showNum;

        

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

        if (self.status == kStatusNum) {

            //获取label上显示的之前的数字

            long long orgNum = [self.resultLabel.text longLongValue];

            //显示计算的结果

            showNum = orgNum * 10 + num;

        } else{

            //判断之前是否有结果  如果有结果  就丢弃这个结果

            if (self.status == kStatusDone) {

                [self.paramArray removeAllObjects];

            }

            //是一个新的数字

            showNum = num;

            self.status = kStatusNum;

        }

        //将数字显示在显示屏上面

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

        

    }

     

     

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

        //判断是不是重复按了运算符

        if (self.status != kStatusOperation) {

            //没有重复按下运算符  开始输入新的数字

            self.status = kStatusOperation;

            

            //这个数字结束了  保存到数组中去

            [self.paramArray addObject:self.resultLabel.text];

            //保存当前的操作符

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

        } else{

            //表示重复按下了运算符

            //则需要用新的运算符去替代旧的运算符(也就是运算符数组里面的最后一个元素)

            //1.先获得当前的运算符

            NSString *newOperation = sender.titleLabel.text;

            

            //2.获得最后一个运算符的索引值

            NSInteger lastIndex = self.operationArray.count - 1;

            

            //替换

            [self.operationArray replaceObjectAtIndex:lastIndex withObject:newOperation];

            

        }

        

    }

     

    //按下等于号

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

        //将显示屏上的最后一个数字保存到数组中去

        [self.paramArray addObject:self.resultLabel.text];

        

        //计算

     

        [self computeByType:kLevelTypeSenior];

        [self computeByType:kLevelTypePrimary];

        //将结果显示到界面上去

        self.resultLabel.text = [self.paramArray firstObject];

        

        self.status = kStatusDone;

        

        [self.paramArray removeAllObjects];

        

    }

     

     

     

    //按照运算符的优先级进行计算

    - (void)computeByType:(kLevelType)type{

        NSString *firstOperation;

        NSString *secondOperation;

        NSString *thirdOperation;

        if (type == kLevelTypePrimary) {

            firstOperation = @"+";

            secondOperation = @"-";

        } else{

            firstOperation = @"*";

            secondOperation = @"/";

            thirdOperation = @"%";

        }

        

        //开始计算

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

            //获取i对应的运算符

            NSString *operatiion = [self.operationArray objectAtIndex:i];

            

            if ([operatiion isEqualToString:firstOperation] || [operatiion isEqualToString:secondOperation] ||[operatiion isEqualToString:thirdOperation]) {

                //获取即将就行运算的两个数(字符串)

                

                NSString *firstString = [self.paramArray objectAtIndex:i];

                NSString *secondString = [self.paramArray objectAtIndex:i+1];

                //将两个字符串转化为数字

                long long firstNum = [firstString longLongValue];

                long long secondNum = [secondString longLongValue];

                

                //对两个数字进行计算

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

                

                //这次计算的结果覆盖i对应的值

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

                

                //删除i+1对应的值

                [self.paramArray removeObjectAtIndex:i+1];

                

                //删除索引值为i的那个运算符

                [self.operationArray removeObjectAtIndex:i];

                

                //i--

                i--;

            }

        }

        

    }

     

     

    //计算结果

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

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

        kOperationType type = [[self.operationEnumDic objectForKey:operation]intValue];

        

        long long result = 0;

        switch (type) {

            case kOperationTypeAdd:

                result = firstNum + secondNum;

                break;

            case kOperationTypeMinus:

                result = firstNum - secondNum;

                break;

            case kOperationTypeMultiple:

                result = firstNum * secondNum;

                break;

            case kOperationTypeDivide:

                result = firstNum / secondNum;

                break;

            case kOperationTypeMod:

                result = firstNum % secondNum;

                

            default:

                break;

        }

        return result;

        

    }

     

     

    //正负号

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

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

        long long num2 = -num;

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

    }

     

     

     

    //清零

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

        self.resultLabel.text = @"0";

        [self.paramArray removeAllObjects];

        [self.operationArray removeAllObjects];

        self.status = kStatusNum;

    }

     

    @end

      

      

  • 相关阅读:
    CF1280G Kirchhoff's Current Loss【表达式解析,不等式】
    [AGC040C] Neither AB nor BA
    [AGC040B]Two Contests
    [ARC101E]Ribbons on Tree(容斥,dp)
    [GXOI/GZOI2019]旧词
    [SDOI2015]寻宝游戏
    半平面交初步
    [CF585E]Marbles
    [P5348]密码解锁
    NOIP2018 保卫王国
  • 原文地址:https://www.cnblogs.com/hmzxwky/p/5087234.html
Copyright © 2011-2022 走看看