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

 

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

 

posted @ 2015-12-29 20:41  赵鹏s  阅读(1779)  评论(8编辑  收藏  举报