IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> IOS——实现简单计算器 -> 正文阅读

[移动开发]IOS——实现简单计算器

记录一下最近写的一个计算器APP。

实现包含括号以及四则运算的简单计算器,利用MVC设计模式以及Masonry布局。
实现界面:
在这里插入图片描述
首先实现这个界面到了之前学过的Masonry第三方库,对按钮进行了屏幕比例的限制。

遇见的一些问题

在MVC设计模式中Button事件的处理

根据MVC的设计模式,Button事件应该加在C的代码中,这里一开始没有好的思路,后来问了下学长,学了一手。、
我们可以利用协议传值,在V的代码中添加事件,但事件函数是在C中实现的,每次点击Button时,C可以得到Button的tag值,以进行下一步处理。
部分代码:

//  View.h
//  计算器
//
//  Created by 差不多先生 on 2021/10/6.
//

#import <UIKit/UIKit.h>

@protocol viewDelegate <NSObject>

- (void) pressChange: (UIButton*) cButton;

@end
[_zeroButton addTarget:self action:@selector(return:) forControlEvents:UIControlEventTouchUpInside];

- (void) return: (UIButton*) cButton {
    [_delegate pressChange:cButton];
}

// 在c中实现的pressChange:方法

// 记录小数点状态
int flag = 0;
// 防止连续输入符号
int secondFlag = 0;
// 记录等于号状态
int thirdFlag = 0;
// 防止连续输入zero
int zeroFlag = 0;
- (void) pressChange: (UIButton*) cButton {
    if (cButton.tag == 101) {
        [_changeArray removeAllObjects];
        NSString *ansString = @"0";
        _firstView.topLabel.text = ansString;
        flag = 0;
        secondFlag = 0;
        thirdFlag = 0;
    } else if (cButton.tag == 120) {
        if (thirdFlag == 1) {
            ;
        } else {
            [_changeArray addObject:@"#"];
            NSString *ansString = [_changeArray componentsJoinedByString:@""];
//            NSLog(@"%@", ansString);
            [_firstModel operation:ansString];
            _firstView.topLabel.text = [_firstModel operation:ansString];;
            [_changeArray removeAllObjects];
            thirdFlag = 1;
        }
        
    } else if (cButton.tag == 119) {    //控制小数点输入合理
        if (flag == 0) {
            flag = 1;
            [_changeArray addObject:cButton.titleLabel.text];
            NSString *ansString = [_changeArray componentsJoinedByString:@""];
            _firstView.topLabel.text = ansString;
        } else {
            ;
        }
    }
    else {
        if (cButton.tag == 104 || cButton.tag == 108 || cButton.tag == 112 || cButton.tag == 116 ) {
            flag = 0;
            if (secondFlag == 0) {
                return;
            } else {
                secondFlag = 0;
            }
        } else if (cButton.tag != 102){ // 左括号后不能按符号
            secondFlag = 1;
        }
        [_changeArray addObject:cButton.titleLabel.text];
        NSString *ansString = [_changeArray componentsJoinedByString:@""];
        _firstView.topLabel.text = ansString;
        thirdFlag = 0;
        
    }
}

一些判错处理和预处理

这里我参考手机计算器的一些限制非法输入。
1.当没有数字时无法输入符号。
2.不能连续输入两个符号
3.当已经又了一个小数点,但没有出现运算符的情况下,不能继续输入小数点。
4.左括号后不能立即添加符号
代码在上面的方法中

对于输入进来的数据处理

首先判断括号是否有效

当括号无效时,直接判断输入错误。
代码:

// 设置符号优先级
int compareReturn(char str1) {
    if (str1 == '#') {
        return 0;
    } else if (str1 == '+' || str1 == '-') {
        return 1;
    } else if (str1 == '*' || str1 == '/') {
        return 2;
    } else if (str1 == '(' || str1 == ')') {
        return 0;
    }
    else {
        // 此时为数字
        return -1;
    }
}
// 判断括号是否有效
int tureKH (const char* str) {
    int top = 0;
    for (int i = 0; i < strlen(str); i++) {
        if (str[i] == '(') {
            top++;
        } else if (str[i] == ')') {
            if (top == 0) {
                return 0;
            } else {
                top--;
            }
        } else {
            ;
        }
    }
    if (top == 0) {
        return 1;
    } else {
        return 0;
    }
}

中缀转后缀

这个我前面写过博客中缀表达式转后缀表达式
只不过当时是用c语言实现的,这次是用OC实现的。
有些细微的区别,OC的数组并不能存储简单的数据类型,所以得将输入的数据转成一个个字符串对象再存入数组,由于输入的数据没有分隔符,所以如果直接将表达式转化为数组,那么会发现数组的第一个元素就是这个字符串整体对象,所以这里我先将字符串对象变为c风格的数组,然后再对其逐一处理进行转换。

// 判断是否是符号
- (BOOL) isSymbol:(NSString*) string {
    if ([string isEqual:@"*"] || [string isEqual:@"+"] || [string isEqual:@"-"] || [string isEqual:@"/"] || [string isEqual:@"("] || [string isEqual:@")"] || [string isEqual:@"#"]) {
        return YES;
    } else {
        return NO;
    }
}
// 优先级表
- (int) firstSymbol:(NSString*) string {
    if ([string isEqual:@"-"] || [string isEqual:@"+"]) {
        return 2;
    } else if ([string isEqual:@"*"] || [string isEqual:@"/"]) {
        return 3;
    } else if ([string isEqual:@"#"]) {
        return 1;
    } else {
        return 0;
    }
}
// 中缀转后缀

- (NSMutableArray*)switchString :(const char *) outString {
    // 设置存字符串标识
    int flag = 0;
    // 结果栈
    self.ansArray = [[NSMutableArray alloc] init];
    // 临时符号栈
    self.tempArray = [[NSMutableArray alloc] init];
    NSMutableArray *textArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < strlen(outString); i++) {
//        printf("%c", outString[i]);
        NSString *str1 = [NSString stringWithFormat:@"%c", outString[i]];
        [textArray addObject:str1];
    }
//    NSLog(@"%@", textArray);
    NSMutableString* numberString = [[NSMutableString alloc] init];
    for (int i = 0; i < textArray.count;) {
        if ([self isSymbol:textArray[i]] == NO) {
            [numberString appendString:textArray[i++]];
            flag = 0;
        } else {
            if (flag == 0) {
                NSMutableString* temp = [[NSMutableString alloc] init];
                temp = [numberString copy];
                [self.ansArray addObject:temp];
                flag = 1;
                [numberString deleteCharactersInRange:NSMakeRange(0, numberString.length)];
                NSLog(@"%@", self.ansArray);
            }
            if ([textArray[i] isEqual:@"("]) {
//                [symbolString appendString:textArray[i++]];
                [self.tempArray addObject:textArray[i++]];
            } else if ([textArray[i] isEqual:@")"]) {
                while (![self.tempArray[self.tempArray.count - 1] isEqual:@"("]) {
                    [self.ansArray addObject:self.tempArray[self.tempArray.count - 1]];
                    [self.tempArray removeLastObject];
                }
                [self.tempArray removeLastObject];
                i++;
            } else {
                if (self.tempArray.count == 0) {
                    [self.tempArray addObject:textArray[i++]];
                    continue;
                }
                if (self.tempArray.count != 0 && [self firstSymbol:textArray[i]] > [self firstSymbol:self.tempArray[self.tempArray.count - 1]]) {
                    [self.tempArray addObject:textArray[i++]];
                } else {
                    [self.ansArray addObject:self.tempArray[self.tempArray.count - 1]];
                    [self.tempArray removeLastObject];
                }
            }
        }
    }
//    NSLog(@"%lu", self.ansArray.count);
    NSLog(@"%@", self.ansArray);
    return self.ansArray;
}

计算后缀表达式后有多余的0

在将字符串转为double计算后,再变为字符串,会出现多余0的问题,这里可以在最后再进行一次处理。

// 除去sum后多余的0
-(NSString*)removeZero:(NSString*)string {
    NSString * testNumber = string;
    NSString * ansNumber = [NSString stringWithFormat:@"%@",@(testNumber.doubleValue)];
    return ansNumber;
}

做除法运算分母不能为0

设置一个比较奇怪的值,加判断返回输入有误

} else if ([symbol isEqual:@"/"]) {
        if (y == 0) {
            ans = -9999;
            return ans;
        }
        ans = x / y;
    }

完整代码地址

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-08 11:54:36  更:2021-10-08 11:54:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:36:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码