2012-11-20 52 views
1

我剛剛從客觀的c(來自java)開始,我正在研究一個計算器程序,只是爲了練習語法和一些基本的東西。我要做的方式是讓用戶輸入一個字符串並查找操作員(考慮操作順序),然​​後找到圍繞該操作員的術語,計算它,用答案替換該術語,然後重複所有條款;不過,我正在使用我用來計算該術語的方法存在問題。我傳入運營商的索引並讓它向後循環,直到它擊中另一個運營商以找到它之前的號碼,並在之後爲該號碼執行相同的轉發。我的問題是,循環不會停止時,它擊中操作員,而是繼續,直到字符串在兩個方向的結束。這可能很簡單,我忽略了,但我一直試圖弄清楚這一點,可以'似乎得到它。我已經在方法的前半部分包含了一個SSCCE,其中包含預定義的字符串和操作符索引。 (另外,二次的問題:有沒有更好的方式在本網站發佈的代碼塊,而不是在4位的每行前手動放?)Objective C:循環問題

#import <Foundation/Foundation.h> 
int firstNumInTerm(int index); 
NSString *calculation; 
int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     calculation = @"51-43+378*32"; 
     int firstNumber = firstNumInTerm(9); 
     NSLog(@"The number before the term is: %i", firstNumber);  
    } 
    return 0; 
} 

int firstNumInTerm(int index){ 
    int firstNumIndex = index - 1; 
    int firstNumLength = 1; 
    NSRange prevChar = NSMakeRange(firstNumIndex - 1, 1); 
    while ([calculation substringWithRange:prevChar] != @"*" && 
      [calculation substringWithRange:prevChar] != @"/" && 
      [calculation substringWithRange:prevChar] != @"+" && 
      [calculation substringWithRange:prevChar] != @"-" && 
      firstNumIndex > 0) { 
     NSLog(@"prevChar: %@", [calculation substringWithRange:prevChar]);//TEST 
     firstNumIndex--; firstNumLength++; 
     prevChar = NSMakeRange(firstNumIndex - 1, 1); 
    } 
    NSRange firstRange = NSMakeRange(firstNumIndex, firstNumLength); 
    int firstNum = [[calculation substringWithRange:firstRange] intValue]; 

    NSLog(@"firstNum String: %@", [calculation substringWithRange:firstRange]);//TEST 
    NSLog(@"firstNum int: %i", firstNum);//TEST 

    return firstNum; 
} 
+0

「有沒有更好的方法在本站上發佈代碼塊,而不是在每行之前手動放置4個空格?」 - 把它寫在代碼編輯器中,全選,打TAB。另外,+1是一個很好的問題,並感謝您爲編碼格式化所做的努力!旁註:難道你不想正確地將字符串解析爲AST嗎?會更清潔。 – 2012-11-20 18:00:06

+2

我不確定這是否是問題,但是...... Objective-C中字符串比較的第一條規則是:使用'isEqualToString:'而不是'=='和'!='運算符。字符串是對象,操作符只測試對象地址,而不是內容。 –

+0

@PhillipMills斑點。這個問題寫得非常好,我甚至沒有注意到noob錯誤;) – 2012-11-20 18:03:19

回答

1

這一行的問題: [calculation substringWithRange:prevChar] != @"*"是,你比較兩個指針的值。 [calculation substringWithRange:prevChar]返回一個指向NSString對象的指針,NSString字面語句@"*"也一樣。比較兩個字符串的最簡單方法是使用NSStringisEqualToString:方法。例如:

NSString *myName = @"Stephen"; 
NSString *yourName = @"Matt"; 

if([myName isEqualToString:yourName]){ 
    printf("We have the same name!"); 
} 
else{ 
    printf("We do not have the same name"); 
} 

如果你打算做了很多的字符串比較,它可能是明智的編寫一個宏,如: #define STREQ(x,y) [x isEqualToString:y]

關於複製/粘貼代碼到StackOverflow上:

由於我99%的時間使用XCode,我發現它很方便選擇我要複製的文本,然後點擊Cmd-]。這將文本轉移到右側的一個製表符寬度。然後我Cmd-c複製,然後Cmd-[撤消右移。

1

你不能這樣做,在Objective-C:[calculation substringWithRange:prevChar] != @"*" 相反,你需要做的:

[[calculation substringWithRange:prevChar] compare:@"*"] != NSOrderedSame

(我知道,這是更長的時間,但算術運算符重載不是字符串,如他們在Java)。

1

我看到其他人已經回答了這個問題,以糾正你的字符串比較操作的問題,但更好的方法來分割這個字符串將使用NSString的本地解析方法。例如:

NSArray *numbers = [ calculation componentsSeparatedByCharactersInSet: 
[ NSCharacterSet characterSetWithCharactersInString: @"*/+-" ] ]; 

會給你一個包含你的字符串中每個數字(按順序)的數組。你可以想出自定義的解析例程,但使用NSString的可能會更直接,而且更少bug。這對其他人來說也會更容易閱讀和理解。

1
while((![[calculation substringWithRange:prevChar] isEqualToString:@"*"]) && …){ 

} 

NSArray *operators = @[@"+", @"-", @"*", @"/"]; 
while(![operators contains:[calculation substringWithRange:prevChar]])