準備工做數組
1.建立一個SingleViewApplication工程,默認爲咱們提供一個界面iphone
默認界面並非iphone的界面小 將圖中紅色的兩個選項勾掉 就會變成正常的iphone手機大小ide
2.使用Command + shift + h 切換到主屏幕(至關於home鍵)佈局
3.如何更改項目的名稱和icon圖標字體
a.info.plist 文件->bundle name->寫上工程要顯示的名字ui
b.添加一張圖片(放在Supporting Files裏面) 命名爲icon.png 做爲應用程序的圖標atom
c.沒有圖標的時候能夠在www.iconfinder.com上搜索相關的圖標spa
4.分析計算器3d
a.使用到的UIorm
1)能夠實現點擊 - UIButton(按鈕)
添加按鈕的方法:在右下角的object library中搜索uibtton 將button拖到界面上就會在界面上添加一個按鈕 如圖所示
下圖中紅圈中的兩個按鈕能夠對這個按鈕實現尺寸的調整 和 背景顏色字體顏色大小等屬性的更改
2)能夠顯示內容 - UILabel(文本標籤)
添加文本標籤的方法和添加按鈕的方法同樣,只是將搜索的uibutton改爲了uilabel 更改其餘屬性也和按鈕同樣
3)用戶可以看到的界面咱們稱做界面 - UIViewController
4)如何實現上面的相應內容 - (storyboard)
5.如何實現
ps:iPhone5/5s的尺寸 320 * 568
iPhone4/4s的尺寸 320 * 480
a.添加顯示文字的uilabel
1)能夠自由拖動,調整試圖在界面上的大小
2)改變alignment屬性 設置 居右對齊
3)設置font屬性 改變文字的顯示大小
4)background 設置背景顏色
5)text設置顯示的文字
基本的界面大概就是下面的樣子
b.如何接受用戶的點擊事件
1)storyboard裏面的每個界面都應該有相應的控制器和它相關聯
一個界面就是一個UIViewController
由於計算器程序只有一個界面, storyboard裏面的界面和viewController相關聯
storyboard裏面負責界面的佈局
viewController負責代碼邏輯
2)IBAction用於關聯storyboard裏面控件的事件
將鼠標放在要關聯的按鈕上 按住ctrl鍵 拖動到 viewController.m文件當中 如圖
以後會出現以下的界面 能夠對IBAction進行設置
type儘可能選成uibutton類型 若是選成id類型 接下去用的時候 還要轉換類型 比較複雜
若是要對多個按鈕進行關聯 能夠像上面一個一個進行拖動 也能夠像下圖那樣在紅點處直接拖到storyboard上
在這個程序中,咱們把數字放在一個IBAction中, 把加減乘除放在另外一個IBAction中
c.在關聯類裏面 如何獲取storyboard對面的UI對象
IBOutlet 用於關聯storyboard裏面控件自己
右擊uilabel 選擇new reference outlet 拖動到以下圖的位置
界面作好後 而且將界面和viewController相關聯以後 咱們要作的就是將計算器所要實現的功能用代碼在viewController.h中寫出來
好比咱們要計算2 + 3 * 5 - 12 / 4 - 6
這個是混合運算 運算符有優先級
個人想法是定義兩個數組 一個專門存放數字 一個專門存放運算符
那麼這樣子的話 上面的式子就變成了{2,3,5,12,4,6}
{+,*,-,/,-}
將式子裏面的數字和運算符添加到數組中以後 須要咱們咱們對存儲運算符的數組進行遍歷
當碰到乘號和除號的時候 好比上面的式子中 咱們找到了乘號 須要咱們計算的就是3 * 5
那麼咱們須要先找到乘號在數組中的索引值 能夠知道例子中是1
同時咱們也看到了 3和5的索引值分別是1,2 由此咱們能夠看出參與計算的兩個數字的索引值就是乘號的索引值和索引值加上1
第一次計算以後,咱們須要將計算的結果覆蓋在原來索引值爲1的數字上,而且將索引值爲2的數字刪除,同時將索引值爲1的乘號刪掉
(固然 上述的式子中乘號和除法是同時進行的)
因此第一次計算以後 兩個數組就變成了{2,15,3,6}
{+,-,-}
乘除計算結束以後 就輪到優先級第一等的加減法運算了,原理和乘除法中是同樣的 最後獲得的結果就是8
#import "ViewController.h"
typedef enum{
kStatusNum,
kStatusOperation,
kStatusDone
}kStatus;//記錄當前操做的狀態
typedef enum{
kLevelTypePrimary,//加減運算
kLevelTypeSenior//乘除運算
}kLevelType;
typedef enum{
kOperationTypeAdd = 1,
kOperationTypeMinus,
kOperationTypeMultiple,
kOperationTypeDivide,
kOperationTypeMod
}kOperationType;
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;
@property (nonatomic, assign) kStatus status;
@property (nonatomic, strong) NSMutableArray *paramArray;//存放每一個數字
@property (nonatomic, strong) NSMutableArray *operationArray;//存放運算符
@property (nonatomic, strong) NSDictionary *operationEnumDic;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//進行初始化
self.paramArray = [NSMutableArray array];
self.operationArray = [NSMutableArray array];
self.status = kStatusNum;
self.operationEnumDic = @{@"+":@1, @"-":@2, @"*":@3, @"/":@4, @"%":@5};
}
- (IBAction)numButtonDidClicked:(UIButton *)sender {
//獲取按鈕上面的數字
int num = [sender.titleLabel.text intValue];
long long showNum;
//判斷是否是一個新的數字的開始
if (self.status == kStatusNum) {
//獲取label上顯示的以前的數字
long long orgNum = [self.resultLabel.text longLongValue];
//顯示計算的結果
showNum = orgNum * 10 + num;
} else{
//判斷以前是否有結果 若是有結果 就丟棄這個結果
if (self.status == kStatusDone) {
[self.paramArray removeAllObjects];
}
//是一個新的數字
showNum = num;
self.status = kStatusNum;
}
//將數字顯示在顯示屏上面
self.resultLabel.text = [NSString stringWithFormat:@"%lld", showNum];
}
- (IBAction)operationButtonDidClicked:(UIButton *)sender {
//判斷是否是重複按了運算符
if (self.status != kStatusOperation) {
//沒有重複按下運算符 開始輸入新的數字
self.status = kStatusOperation;
//這個數字結束了 保存到數組中去
[self.paramArray addObject:self.resultLabel.text];
//保存當前的操做符
[self.operationArray addObject:sender.titleLabel.text];
} else{
//表示重複按下了運算符
//則須要用新的運算符去替代舊的運算符(也就是運算符數組裏面的最後一個元素)
//1.先得到當前的運算符
NSString *newOperation = sender.titleLabel.text;
//2.得到最後一個運算符的索引值
NSInteger lastIndex = self.operationArray.count - 1;
//替換
[self.operationArray replaceObjectAtIndex:lastIndex withObject:newOperation];
}
}
//按下等於號
- (IBAction)equalButtonDidClicked:(UIButton *)sender {
//將顯示屏上的最後一個數字保存到數組中去
[self.paramArray addObject:self.resultLabel.text];
//計算
[self computeByType:kLevelTypeSenior];
[self computeByType:kLevelTypePrimary];
//將結果顯示到界面上去
self.resultLabel.text = [self.paramArray firstObject];
self.status = kStatusDone;
[self.paramArray removeAllObjects];
}
//按照運算符的優先級進行計算
- (void)computeByType:(kLevelType)type{
NSString *firstOperation;
NSString *secondOperation;
NSString *thirdOperation;
if (type == kLevelTypePrimary) {
firstOperation = @"+";
secondOperation = @"-";
} else{
firstOperation = @"*";
secondOperation = @"/";
thirdOperation = @"%";
}
//開始計算
for (int i = 0; i < self.operationArray.count; i++) {
//獲取i對應的運算符
NSString *operatiion = [self.operationArray objectAtIndex:i];
if ([operatiion isEqualToString:firstOperation] || [operatiion isEqualToString:secondOperation] ||[operatiion isEqualToString:thirdOperation]) {
//獲取即將就行運算的兩個數(字符串)
NSString *firstString = [self.paramArray objectAtIndex:i];
NSString *secondString = [self.paramArray objectAtIndex:i+1];
//將兩個字符串轉化爲數字
long long firstNum = [firstString longLongValue];
long long secondNum = [secondString longLongValue];
//對兩個數字進行計算
long long result = [self compute:firstNum second:secondNum operation:operatiion];
//此次計算的結果覆蓋i對應的值
[self.paramArray replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%lld", result]];
//刪除i+1對應的值
[self.paramArray removeObjectAtIndex:i+1];
//刪除索引值爲i的那個運算符
[self.operationArray removeObjectAtIndex:i];
//將i--
i--;
}
}
}
//計算結果
- (long long)compute:(long long)firstNum second:(long long)secondNum operation:(NSString *)operation{
//從字典裏獲取運算符對應的枚舉值
kOperationType type = [[self.operationEnumDic objectForKey:operation]intValue];
long long result = 0;
switch (type) {
case kOperationTypeAdd:
result = firstNum + secondNum;
break;
case kOperationTypeMinus:
result = firstNum - secondNum;
break;
case kOperationTypeMultiple:
result = firstNum * secondNum;
break;
case kOperationTypeDivide:
result = firstNum / secondNum;
break;
case kOperationTypeMod:
result = firstNum % secondNum;
default:
break;
}
return result;
}
//正負號
- (IBAction)positiveButtonDidClicked:(UIButton *)sender {
long long num = [self.resultLabel.text longLongValue];
long long num2 = -num;
self.resultLabel.text = [NSString stringWithFormat:@"%lld", num2];
}
//清零
- (IBAction)clearButtonDidClicked:(UIButton *)sender {
self.resultLabel.text = @"0";
[self.paramArray removeAllObjects];
[self.operationArray removeAllObjects];
self.status = kStatusNum;
}
@end