文章目录
前言
计算器这个项目写了很久,一直有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模式的精髓。
写了这么久,我只能说要考虑到各个情况实在是有点麻烦,最好用的还是限制输入