仿写计算器


前言

计算器这个项目写了很久,一直有bug。真的是挺惨的 简单说一下在写计算器里边遇到的一些问题


布局

布局这块就几个button,更改一下背景颜色就好。不多说

关于自定义颜色


#define myColor(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:10.f]
self.backgroundColor = myColor(50, 50, 50);

在这里插入图片描述

运算

就是加减乘除四则运算,可以看博客C语言实现简单四则运算

- (CGFloat) countNum1:(CGFloat)x Num2:(CGFloat)y {
    CGFloat num = 0;
    switch (oper) {
        case '+':
            num = x + y;
            break;
        case '-':
            num = x - y;
            break;
        case '*':
            num = x * y;
            break;;
        case '/':
            num = x / y;
            break;
        default:
            break;
    }
    
    return num;
}
//运算符优先级的比较
int Compare(char str) {
    if (str == '=') {
        return 0;
    }  else if (str == '(' || str == ')') {
        return 0;
    } else if (str == '+' || str == '-') {
        return 1;
    } else if (str == '*' || str == '/') {
        return 2;
    }else if (str == '.') {
        return 3;
    } else {
        return -1;
    }
}

一系列遇到的问题

小数点

我们在使用计算器的时候,一个数字里边至多只能有一个小数点。如果输入多个小数点,可以判定为不合法输入。

//在一个数字里循环查找小数点,然后累计查找到的小数点数量
while (i < Length) {
            if ([array[i] isEqualToString:@"."]) {
                sum++;
            }
            if (sum > 1) {
                self.showString = [[NSMutableString alloc] initWithString:@"不合法输入"];
                self.label.text = @"不合法输入";
                return;
            }
            i++;
        }

在这里插入图片描述

也可以把小数点的这个按钮设置的特殊一点,在重新按下加减乘除几个键中的一个后才能按下小数点,这样就保证了一个数字里只有一个小数点

括号匹配

我的想法是定义一个变量来记录左括号的出现次数,然后定义一个变量来记录右括号出现的次数。如果两个变量不相等,说明输入有误。

这个是将OC字符串转变为C字符串的方法。

const char *string = [_MainString UTF8String];

输入数字小数点后又输入了很多个零

在这里插入图片描述
在这里插入图片描述
在这种情况下,我们第一次输入的3.0000其实就是等于3的,当按下=符号时,屏幕上会显示3的数值。
这里也可以使用像小数点处的方法,如果小数点后的数字全是0,那么去掉小数点后的所有0

当输入几个符号相连时

在这里插入图片描述

我们可以通过对比相邻输入的tag值来区分这种情况,如果两个相邻按钮都是符号,打印“不合法输入”
当然,也可以通过给每个按钮设置不同的状态,当一个符号按钮被打开时,其他几个符号就不能在打开了。在这个时候点击其他符号也就没有意义。

小数运算

有时候两个整数相除会出现小数,这个时候把整数转换成float类型,然后进行运算即可。

//计算是小数的情况
            if (array[i] == '.') {
                double num = 0.1;
                ++i;
                while (array[i] >= '0' && array[i] <= '9') {
                    x += ((array[i] - '0') * num);
                    num *= 0.1;
                    ++i;
                }
            }
            //数字进栈


除0操作

0不能做分母,所以这个情况也需要判错

int i = 0;
    while (i < l - 1) {
        if ([array[i] isEqualToString:@"/"] && [array[i + 1] isEqualToString:@"0"]) {
        //当出现“/”和“0”相连的情况时,error
            self.error = 1;
            return;
        }
        i++;
    }

左括号后不能添加乘除符号,乘除加减符号后不能添加右括号

像这种情况,也是不合法的
我是通过设置括号和符号的按钮的状态来避免这种情况,让这种情况不能出现。
就像上面的一个数字里不能出现多个小数点的情况

在这里插入图片描述

第一个输入不能是乘号和除号

和小数点,符号相连的情况相同,只要在初始化的时候把乘除号的按钮设置为开启状态即可

连续点击两次等号

在点击两次等号后,会出现一些很奇怪的数字
使用等号的输入限制来避免这种情况
在这里插入图片描述
在等号的点击函数里加一个判断条件。如果等号的状态是开启的,那么等号不能点击。即等号不能连续点击。

总结

计算器是第一次使用MVC模式来写项目,感觉只是把代码分到了不同的文件里去写。用了协议进行传值。还没有学到MVC模式的精髓。
写了这么久,我只能说要考虑到各个情况实在是有点麻烦,最好用的还是限制输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河丘壑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值