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"
//定义一个记录当前是输入数字还是操作键的枚举
typedefenum{
kStatusNum,
kStatusOperation,
kStatusDone
}kStatus;
//定义一个判断当前操作是加减操作还是乘除操作的枚举
typedefenum {
kComputetypePrimary,
kComputetypeSenior
}kComputetype;
//定义一个当前操作是什么的枚举
typedefenum{
1,
kOperationTypeMinus,
kOperationTypeMultiple,
kOperationTypeDevide
}kOperationType;
@interfaceViewController ()
@propertyweak, nonatomic) IBOutletUILabel *resultLable;
@propertynonatomic, assign) kStatus status;
@propertynonatomic, strong) NSMutableArray//存放输入的每个数字
@propertynonatomic, strong) NSMutableArray//存放输入的每个运算符
@propertynonatomic, strong) NSDictionary//定义个字典
@end
@implementation ViewController
- (void)viewDidLoad {
superviewDidLoad];
self.statuskStatusNum;
//初始化数组
self.numMutableArrayNSMutableArrayarray];
self.operationMutableArrayNSMutableArrayarray];
//初始化字典
self.operationDic@{@"+":@1, @"-":@2, @"*":@3, @"/":@4};
}
//按下数字键
- (IBAction)numButtonDidClicked:(UIButton *)sender {
//获取按钮上面的数字
inttitleLabel.textintValue];
longlong showNum;
//判断是否是一个新的数字的开始
ifself.statuskStatusNum) {
//不是一个新的数字的开始
//计算(拼接)输入的数字
self.resultLable.textlongLongValue] * 10 + num;
else{
//判断之前是否有结果如果有结果我们将丢弃这个结果
ifself.statuskStatusDone) {
self.numMutableArrayremoveAllObjects];
}
//这是一个新的数字的开始
showNum = num;
self.statuskStatusNum;
}
//显示在label上
self.resultLable.textNSStringstringWithFormat:@"%lld",showNum];
}
- (IBAction)operationButtonDidClicked:(UIButton *)sender {
//判断是不是重复按下操作键了
ifself.statuskStatusOperation) {
//1.上一个不是按下操作键
//改变当前的状态通知上面的方法开始输入新的数字了
self.statuskStatusOperation;
//这个数字结束了将这个数字保存到数组里面
self.numMutableArrayaddObject:self.resultLable.text];
//保存当前点击按钮上的title
self.operationMutableArrayaddObject:sender.titleLabel.text];
else{
//2.重复按下操作键
//用新的操作键代替原来那个
//获取数组的最后一个索引值
NSIntegerself.operationMutableArray.count1;
//替换
self.operationMutableArrayreplaceObjectAtIndex:lastIndex withObject:sender.titleLabel.text];
}
}
//等号被按下
- (IBAction)calculate:(UIButton *)sender {
//添加当前最后一个数字
self.numMutableArrayaddObject:self.resultLable.text];
//开始计算
selfcomputeWithtype:kComputetypeSenior];
selfcomputeWithtype:kComputetypePrimary];
//将结果显示到界面上
self.resultLable.textself.numMutableArrayfirstObject];
self.statuskStatusDone;
self.numMutableArrayremoveAllObjects];
}
- (void)computeWithtype:(kComputetype)type{
NSString *firstOperation;
NSString *secondOperation;
ifkComputetypePrimary) {
@"+";
@"-";
else{
@"*";
@"/";
}
//开始计算
forint0; i< self.operationMutableArray.count; i++) {
//获取i对应的运算符
NSStringself.operationMutableArrayobjectAtIndex:i];
//判断是什么运算符
ifisEqualToString:firstOperation]||[opr isEqualToString:secondOperation]) {
//获取即将进行运算的两个数
longlongself.numMutableArrayobjectAtIndex:i] longLongValue];
longlongself.numMutableArrayobjectAtIndex:i+ 1longLongValue];
longlongselfcompute:firstNum second:secondNum operation:opr];
//覆盖i对应的值
self.numMutableArrayreplaceObjectAtIndex:i withObject:[NSStringstringWithFormat:@"%lld",result]];
//删除后面的一个数
self.numMutableArrayremoveObjectAtIndex:i+1];
//删除i对应的那个运算符
self.operationMutableArrayremoveObjectAtIndex:i];
//将i减1 因为删除了后面的一个数
i--;
}
}
}
//计算结果
- (longlong)compute:(longlong)firstNum second:(longlong)secondNum operation:(NSString *)operation{
//从字典里面获取这个字符串的运算符对应的枚举值
kOperationTypekOperationType)[[self.operationDicobjectForKey:operation] longLongValue];
longlong result;
switch (type) {
casekOperationTypeAdd:
result = firstNum + secondNum;
break;
casekOperationTypeMinus:
result = firstNum - secondNum;
break;
casekOperationTypeMultiple:
result = firstNum * secondNum;
break;
casekOperationTypeDevide:
result = firstNum / secondNum;
break;
default:
break;
}
return result;
}
//清空
- (IBAction)clearButtonDidClicked:(UIButton *)sender {
self.resultLable.text@"0";
self.numMutableArrayremoveAllObjects];
self.operationMutableArrayremoveAllObjects];
self.statuskStatusNum;
}
- (IBAction)isPlusButtonDidClicked:(UIButton *)sender {
longlongself.resultLable.textlongLongValue];
longlong num2 = -(num);
self.resultLable.textNSStringstringWithFormat:@"%lld",num2];
}
@end
最后,这个计算器还不是太好,小数点的功能还没有实现,也就是说无法完成某些除法,小数的运算,本人也是新手,欢迎讨论,不喜勿喷!