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减1 因为删除了后面的一个数
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
最后,这个计算器还不是太好,小数点的功能还没有实现,也就是说无法完成某些除法,小数的运算,本人也是新手,欢迎讨论,不喜勿喷!