1

私はObjective C(Javaからのもの)から始めたばかりで、構文といくつかの基本的なことを練習するためだけに電卓プログラムに取り組んでいます。私が行っている方法は、ユーザーに文字列を入力させ、演算子を調べて(操作の順序を考慮して)、その演算子を囲む用語を見つけて計算し、用語を答えに置き換え、繰り返しますすべての用語; ただし、用語の計算に使用している方法に問題があります。演算子のインデックスを渡し、別の演算子にヒットするまで逆方向にループして、その直前の番号を見つけ、その後の番号に対して同じ順方向を実行します。私の問題は、ループが演算子にヒットしても停止せず、代わりに両方向の文字列の終わりまで続くことです。これ' これはおそらく私が見落としていた非常に単純なことですが、しばらくの間これを理解しようとしてきましたが、それを理解できないようです. あらかじめ決められた文字列と演算子のインデックスを使用して、メソッドの前半だけの SSCCE を含めました。(また、二次的な質問: すべての行の前に手動で 4 つのスペースを入れるよりも、このサイトにコード ブロックを投稿するより良い方法はありますか?)

#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;
}
4

4 に答える 4

1

Objective-C ではそれを行うことはできません:[calculation substringWithRange:prevChar] != @"*" 代わりに、次のことを行う必要があります:

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

(長いですが、算術演算子は Java のように文字列に対してオーバーロードされません)。

于 2012-11-20T18:06:29.887 に答える
1

この行の問題点 [calculation substringWithRange:prevChar] != @"*"は、2 つのポインターの値を比較していることです。リテラル statementと同様[calculation substringWithRange:prevChar]に、オブジェクトへのポインターを返します。2 つの文字列を比較する最も簡単な方法は、 の方法を使用することです。例えば:NSStringNSString@"*"isEqualToString:NSString

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-]. これにより、テキストが 1 タブ幅分右に移動します。次に、右シフトCmd-cをコピーしCmd-[て元に戻します。

于 2012-11-21T05:23:50.050 に答える