iOS小程序-混合計算器


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因為刪除了后面的一個數

            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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM