3

RPN 電卓プログラムを作成しようとしていますが、入力した式を示すラベルが必要です。3,5,4,+,/ と入力すると、ラベルは ((4+5) / 3) と表示されます。これを実装するのに問題があります。数値とオペランドの両方を保持するスタックを呼び出す mutableArray を使用しています。もう 1 つの大きな問題は、渡される文字列が完全な文字列ではなく、ユーザーが値を入力するたびに渡されるため、プログラムはスタック上の 1 つまたは 2 つの項目のみで継続的に機能しなければならないことです。これがコードです。

   + (NSString *)descriptionOfProgram:(id)program
{
NSMutableArray *stack;

if([NSArray isKindOfClass:[NSArray class]])
    stack = [program mutableCopy];

NSUInteger count = [stack count];
NSString* symbol;
NSMutableString *result;
[result appendString:@"("];



for( NSUInteger i=0; i<count; i++){



    if ([[stack lastObject] isEqualToString:@"+"] || [[stack lastObject] isEqualToString:@"-"] ||  [[stack lastObject] isEqualToString:@"/"] ||  [[stack lastObject] isEqualToString:@"*"] ||  [[stack lastObject] isEqualToString:@"sin"] || [[stack lastObject] isEqualToString:@"cos"] )
        {
            symbol = [stack lastObject];
            [stack removeLastObject];

        }
    else
        {


            if( [stack lastObject] != nil){
                [result appendString:[stack lastObject]];
                [stack removeLastObject]; }


         // [result stringByAppendingString:symbol];


            if( [stack lastObject]){
            [result appendString:[stack lastObject]];
                [stack removeLastObject];}


            [result appendString:@")"];

            [stack addObject:result];
        }
}

return [stack lastObject];


}
4

1 に答える 1

1

コードの大きな問題の 1 つはstringByAppendingString:の使用です。 NSStringis immutableであるため、コードはメソッドから返された結果を次のように元の文字列に割り当てる必要があります。

result = [result stringByAppendingString:[stack lastObject]];

複数の文字列を動的に連結する必要がある場合、より適切な方法は を使用することNSMutableStringです。NSStringこれは、次のような他の文字列を追加できるサブクラスです。

[result appendString:[stack lastObject]];

メソッドを使用すると、文字列の追加を完全に回避できますstringWithFormat:

プログラムの内容でスタックを開始することも正しいことではありません:programシンボルを 1 つずつ調べ、数値をプッシュし、最後の 2 つの項目をポップして操作を処理し、操作を左側と右側の間に挿入する必要があります。 、その周りに括弧を追加して、スタックに押し戻します。

+ (NSString *)descriptionOfProgram:(NSArray*)program {
    NSArray *ops = [NSArray arrayWithObjects:@"+",@"-",@"*",@"/",@"sin",@"cos",nil];
    NSMutableArray *stack = [NSMutableArray array];
    for (NSString *s in program) {
        if ([ops indexOfObject:s] != NSNotFound) {
            NSString *lhs = [stack lastObject];
            [stack removeLastObject];
            NSString *rhs = [stack lastObject];
            [stack removeLastObject];
            [stack addObject:[NSString stringWithFormat:@"(%@ %@ %@)", lhs, s, rhs]];
        } else {
            [stack addObject:s];
        }
    }
    return [stack lastObject];
}
于 2012-07-14T00:40:19.730 に答える