2014-04-26 97 views
0

我想使命令行計算器使用XCode/OSX application/Command line tool/Foundation類型。 在XCode中,轉到Products/Scheme/Edit Scheme。在這裏,我們可以添加或刪除命令行參數。這些命令行參數存儲在參數向量中,即argv[]
我正在使用NSArray在Objective-C數組中存儲這些參數。
現在,我想讓計算器可以評估表達式。
例如,我的論點是argv[1]=5,argv[2]=+argv[3]= 10argv[4]=-,argv[5]=2。因此,這些論據將評估表達並給出結果。 結果= 13計算器的Xcode命令行工具

#import <Foundation/Foundation.h> 

int main(int argc, const char* argv[]) 
{ 

    @autoreleasepool { 
     NSArray *myarray =[[NSProcessInfo processInfo] arguments]; 

     for (int i=1; i<argc ; i++) { 
      NSLog (@"Arguents %d=%@", i, myarray[i]); 
     } 

     return 0; 
    } 
} 

回答

1

這裏有一個簡單的計算器,敲了幾分鐘:

#import <Foundation/Foundation.h> 

typedef enum { 
    OP_NONE, 
    OP_ADD, 
    OP_SUB, 
    OP_MULT, 
    OP_DIV 
} Op; 

static int calc(NSArray *args) { 
    Op op = OP_NONE; 
    int result = 0; 
    for (NSString *arg in args) { 
     if ([arg isEqualToString:@"+"]) { 
      op = OP_ADD; 
     } else if ([arg isEqualToString:@"-"]) { 
      op = OP_SUB; 
     } else if ([arg isEqualToString:@"*"]) { 
      op = OP_MULT; 
     } else if ([arg isEqualToString:@"/"]) { 
      op = OP_DIV; 
     } else { 
      int value = [arg intValue];    // NO ERROR CHECKING!!! 
      switch(op) { 
       case OP_ADD: result += value; break; 
       case OP_SUB: result -= value; break; 
       case OP_MULT: result *= value; break; 
       case OP_DIV: result /= value; break; 
       case OP_NONE: result = value; break; 
       default: abort(); 
      } 
      op = OP_NONE; 
     } 
    } 
    return result; 
} 

int main(int argc, const char **argv) { 
    @autoreleasepool { 
     NSMutableArray *args = [NSMutableArray new]; 
     for (int i = 1; i < argc; i++) 
      [args addObject:@(argv[i])]; 
     NSLog(@"result = %d", calc(args)); 
    } 
    return 0; 
} 

編譯:

$ clang -DDEBUG=1 -g -fobjc-arc -o calc calc.m -framework Foundation 

測試:

typhon:tinkering (master) $ ./calc 3 + 9 
2014-04-26 13:23:05.628 calc[8728:507] result = 12 
typhon:tinkering (master) $ ./calc 2/1 
2014-04-26 13:23:20.500 calc[8738:507] result = 2 
typhon:tinkering (master) $ ./calc 99/11 
2014-04-26 13:23:25.364 calc[8742:507] result = 9 
typhon:tinkering (master) $ ./calc 99/12 
2014-04-26 13:23:27.740 calc[8746:507] result = 8 
typhon:tinkering (master) $ ./calc 99 \* 11 
2014-04-26 13:23:53.588 calc[8754:507] result = 1089 

注:

  • 現在只適用於整數數學,但是很容易轉換爲浮點數。
  • 解析數字時沒有錯誤檢查。
  • 如果你想做乘法,你需要指定\*作爲*是一個符號來做shell globbing。
  • 當傳遞給main()時,您不需要NSProcessInfo來獲取命令行參數。
+0

這是完美的工作。感謝您的建議。但是,我可以使用不同的類來進行加法,乘法,除法,減法,模數的計算。我想創建一個主類,即計算器,並調用計算器類中的所有類。並在主類中執行。我也想在我的計算器中使用模運算符。還有一件事是可以首先進行乘法,除法和模量,然後再進行加法,減法。像優先級檢查一樣,應該先完成高優先級的運算符,然後再優先級低的運算符。 – user3575678

+0

@ user3575678我認爲不同的數學運算使用不同的類是有意義的,除非你想學習面向對象編程的一些方面和實驗多態性,因爲這些操作是如此微不足道,但它是你的代碼,所以你可以做你喜歡的。在運算符關聯性方面,那麼這會影響到一個全面的解析框架(在維基百科上查找*解析*),而不是那些適合我簡單示例的東西,因爲沒有分組的概念。就模數而言,這是一個微不足道的變化。 – trojanfoe

+0

對不起,這是我的錯。我想創建一個名爲calculator的類,並且想要定義該類中的方法並在main類中調用計算器類。我想要做的就是使用類概念來評估這個數學表達式。 – user3575678