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
最后,這個計算器還不是太好,小數點的功能還沒有實現,也就是說無法完成某些除法,小數的運算,本人也是新手,歡迎討論,不喜勿噴!
