仿iPhone计算器总结(masonry布局, MVC,没有中缀转后缀)

布局方面

学习masonry以来还是第一次使用masonry布局,加上有一阵子没有认真敲代码了,布局也算是我的第一个坎
关于masonry使用的具体讲解在这篇文章

button点击事件

之前一直都是一个一个的给button加点击事件,但计算器按钮很多,一个一个添加会使代码有很多废话,从学长的代码里学会使用循环加事件

for (DeepButton *button in _myView.buttonArr) {
        [button addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];
    }

算法

写计算器时算法的短板很快就暴露出来了,数据结构课还是得认真听。。栈的基本使用都相当于初学,一点一点的查资料才开始入门。具体代码在这篇博客

MVC

这也是我第一次使用MVC写项目,写之前学长也叮咛过许多,也就没有碰到特别过不去的坎,感觉没有使用到MVC的精髓,只是单纯的将一个文件分成了三个文件去写,KVO,通知,协议都没有用到。

输入合法问题

因为计算器对表达式有一定的限制,比如:2+*,)(,6+)等都是不合法的,需要加一些限制条件,这里我想到一点就加一点限制,写的比较乱

直接按等于号处理

if ([_getStr isEqualToString: @""]) {
            _myView.showTextField.text = @"格式错误!";
            return ;
        }

括号匹配及符号不合法问题

for (int i = 0; i < _getStr.length; i++) {
            int flag1 = 0;
            int flag2 = 0;
            char shortStr;//遍历到的字符
            char nextStr = '\0';//下一个字符
            shortStr = [_getStr characterAtIndex:i];
            NSLog(@"shortStr == %c", shortStr);
            if (i != _getStr.length - 1) {
                nextStr = [_getStr characterAtIndex:i + 1];
                NSLog(@"nextStr == %c", nextStr);
            }
            //括号匹配问题
            if (shortStr == '(') {
                m++;
            }
            if (shortStr == ')') {
                m--;
            }
            if (m < -1) {
                _myView.showTextField.text = @"格式错误!";
                return ;
            }
            //找出运算符
            for (int j = 0; j < 7; j++) {
                if (opset[j] == shortStr) {
                    flag1 = 1;
                }
                if (opset[j] == nextStr) {
                    flag2 = 1;
                }
            }
            //连着两个都是运算符
            if (flag2 == 1 && flag1 == 1) {
                _myView.showTextField.text = @"格式错误!";
                return ;
            }
        }
        //括号不匹配
        if (m != -1) {
            _myView.showTextField.text = @"格式错误!";
            return ;
        }

.2+3 类问题

如果直接使用.2会出错。我加了一个判断,如果.之前没有数字,则补0

NSString *firstString = [_getStr substringFromIndex:0];
NSLog(@"firstString  ==  %@", firstString);
if ([firstString  isEqual: @""]) {
   [_getStr appendFormat:@"0"];
}

9*(-0.2)类问题

这个式子是没有问题的,但是我们的算法在执行过程中将符号认为是运算符,让9从数字栈中弹出,再次进行运算时已经没有数字可以取出了,默认返回值时0,0乘以任何数就都是0了
这里我的处理方法是立个flag = 0来标记是否有负数,如果碰见负数则不存入符号,即传入的计算式为9*(0.2),当flag = 1时,answer = -answer

if (_getStr.length >= 1) {
            NSString *frontString = [_getStr substringFromIndex:_getStr.length - 1];
            if ([frontString isEqual:@"("]) {
                _negativeFlag = 1;
                NSLog(@"no!");
                [_showStr appendFormat:@"-"];
            } else {
                NSLog(@"-");
                [_getStr appendString:@"-"];
                [_showStr appendString:@"-"];
            }
        } >= 1) {
            NSString *frontString = [_getStr substringFromIndex:_getStr.length - 1];
            if ([frontString isEqual:@"("]) {
                _negativeFlag = 1;
                NSLog(@"no!");
                [_showStr appendFormat:@"-"];
            } else {
                NSLog(@"-");
                [_getStr appendString:@"-"];
                [_showStr appendString:@"-"];
            }
        }

按 = 出答案后,清空计算式

if (_myModel.answer) {
        _myView.showTextView.text = @"";
        [_getStr setString:@""];
        [_showStr setString:@""];
        _myModel.answer = NULL;
    }

GitHub地址

calculator

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值