0

私は、UITextField を介して値を取得し、オペランド ボタンが押されたときにそれらを配列 (varArray) に格納する電卓アプリ (以下のコード) に取り組んでいます。オペランド ボタンを押すと、そのオペランドが別の配列 (opArray) に保存され、varTextField がクリアされます。等号ボタン (まだ完全には実装されておらず、先に進む前に計算された値とオペランドを取得しようとしています) を押すと、計算が実行され、ラベル (equationLabel) に表示されます。これらはすべて、多変数機能を提供するためのものです。最後に、var1、op1、var2、op2、var3...などを入力して、方程式/結果全体を方程式ラベルに表示できるようにしたいと考えています。

また、オペランドをスイッチの int 値と同一視しました。

変数とオペランドを結合するスイッチがまったく実行されていないように見えるため、現時点では立ち往生しています。結果アイテムは方程式ラベルに送信されますが、デフォルト値は 0 のみです。

私はコーディングに比較的慣れておらず、objective-c についてはさらに初心者なので、ここでばかげたことをしているだけかもしれません。スイッチの問題に関するヘルプは大歓迎です。

また、各スイッチ ケースで、xCode から次の警告が表示されることにも言及する必要があります。

更新され たコード 2 完全に機能しますが、equalButton が初めて押されるまで、アプリが opButtonPush の配列に書き込みを行わないように見えることを除きます。その UI イベントまで、配列値は null として返されます。

- (IBAction)opButtonPush:(id)sender    //if +, -, /, or x buttons are pushed, add value in varTextField to varArray and button label text to setOpArray
{    
     UIButton *tmpButton = (UIButton *)sender;

     float textValue=0;

     //add operand to opArray to be accessed by displayEquation and calculator then added to equationLabel and calcFunction
    if ([[[tmpButton titleLabel] text] isEqualToString:@"+"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:0]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"+"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
        varTextField.text = @"";
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"-"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:1]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"-"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
        varTextField.text = @"";
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"x"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:2]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"x"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
        varTextField.text = @"";
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"/"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:3]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"/"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
        varTextField.text = @"";
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"+/-"])
    {
        [varTextField setText:@"-"];
    }

    [equationLabel setText:[varOpArray description]];   //send vars and ops, as entered, to equationLabel

    //NSLog(@"%@", varOpArray);
}

- (IBAction)calculator:(id)sender
{
    UIButton *tmpButton = (UIButton *)sender;

    int opCount=0;

    float finalTextValue=0;
    float result = [[varArray objectAtIndex:0] floatValue];

    if ([[[tmpButton titleLabel] text] isEqualToString:@"="]) {
        finalTextValue = [[varTextField text] floatValue];
        [varArray addObject:[varTextField text]];
        [varOpArray addObject:[varTextField text]];
        [varOpArray addObject:@"="];
        [equationLabel setText:[varOpArray description]];

        for (int i=1; i<[varArray count]; i++) {     //use opArray[i] to eval the result and new var
                                                  //then write it to an array
            switch ([[opArray objectAtIndex:opCount] intValue]) {
                case 0:
                    result = result + [[varArray objectAtIndex:(i)] floatValue];
                    [resultArray addObject:[NSNumber numberWithFloat:result]];
                    [equationLabel setText:[varOpArray description]];   //send vars and ops, as entered, to equationLabel
                    break;
                case 1:
                    result = result - [[varArray objectAtIndex:(i)] floatValue];
                    [resultArray addObject:[NSNumber numberWithFloat:result]];
                    [equationLabel setText:[varOpArray description]];   //send vars and ops, as entered, to equationLabel
                    break;
                case 2:
                    result = result * [[varArray objectAtIndex:(i)] floatValue];
                    [resultArray addObject:[NSNumber numberWithFloat:result]];
                    [equationLabel setText:[varOpArray description]];   //send vars and ops, as entered, to equationLabel
                    break;
                case 3:
                    result = result / [[varArray objectAtIndex:(i)] floatValue];
                    [resultArray addObject:[NSNumber numberWithFloat:result]];
                    [equationLabel setText:[varOpArray description]];   //send vars and ops, as entered, to equationLabel
                    break;
                default:
                    NSLog(@"default");
                    break;
            }
            opCount++;
        }
        [varOpArray addObject:[NSNumber numberWithFloat:result]];
        [equationLabel setText:[varOpArray description]];

        [varTextField setText:@""];

        //reset arrays for next function 
        varOpArray = [NSMutableArray new];
        varArray = [NSMutableArray new];
        opArray = [NSMutableArray new];
    }
}

更新されたコード 1:

- (IBAction)opButtonPush:(id)sender    //if +, -, /, or x buttons are pushed, add value in varTextField to varArray and button label text to setOpArray
{    
    UIButton *tmpButton = (UIButton *)sender;

    float textValue=0;

    //add operand to opArray to be accessed by displayEquation and calculator then added to equationLabel and calcFunction
    if ([[[tmpButton titleLabel] text] isEqualToString:@"+"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:0]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"+"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"-"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:1]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"-"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"x"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:2]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"x"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"/"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:3]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"/"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }

    //add value of float var to arrays to be accessed by calculator 

    [equationLabel setText:[varOpArray description]];   //send vars and ops, as entered, to equationLabel

    varTextField.text = @"";
    NSLog(@"%@", varOpArray);

}

- (IBAction)calculator:(id)sender
{
    UIButton *tmpButton = (UIButton *)sender;

    int opCount=0;

    float finalTextValue=0;
    float result=0.0;

    if ([[[tmpButton titleLabel] text] isEqualToString:@"="]) {
        finalTextValue = [[varTextField text] floatValue];
        //[opArray addObject:[NSNumber numberWithInt:4]];
        [varOpArray addObject:[NSNumber numberWithFloat:finalTextValue]];
        [varOpArray addObject:@"="];
        [varArray addObject:[NSNumber numberWithFloat:finalTextValue]];

        for (int i=0; i<[varArray count]; i+=2) {            
            switch ([[opArray objectAtIndex:opCount] intValue]) {
                case 0:
                    result = [[varArray objectAtIndex:i] floatValue] + [[varArray objectAtIndex:(i+1)] floatValue];
                    [varOpArray addObject:[NSNumber numberWithFloat:result]];
                    varTextField.text = @"";
                    break;
                case 1:
                    result = [[varArray objectAtIndex:i] floatValue] - [[varArray objectAtIndex:(i+1)] floatValue];
                    [varOpArray addObject:[NSNumber numberWithFloat:result]];
                    varTextField.text = @"";
                    break;
                case 2:
                    result = [[varArray objectAtIndex:i] floatValue] * [[varArray objectAtIndex:(i+1)] floatValue];
                    [varOpArray addObject:[NSNumber numberWithFloat:result]];
                    varTextField.text = @"";
                    break;
                case 3:
                    result = [[varArray objectAtIndex:i] floatValue] / [[varArray objectAtIndex:(i+1)] floatValue];
                    [varOpArray addObject:[NSNumber numberWithFloat:result]];
                    varTextField.text = @"";
                    break;
                default:
                    NSLog(@"default");
                    break;
            }

            opCount++;
        }
        varOpArray = [NSMutableArray new];
        varArray = [NSMutableArray new];
        opArray = [NSMutableArray new];
        [varTextField resignFirstResponder];
    }

}

- (IBAction)textFieldClear:(id)sender
{
    if ([varTextField isFirstResponder])
    {

    }
    else
    {
        [varTextField becomeFirstResponder];
        varTextField.text = @"";
    }
}

オリジナルコード

- (IBAction)opButtonPush:(id)sender    //if +, -, /, or * buttons are pushed, add value in varTextField to varArray and button label text to setOpArray
{
    UIButton *tmpButton = (UIButton *)sender;

    //add value of float var to varArray to be accessed by displayEquation and calculator then added to equationLabel and calcFunction
    if ([[tmpButton titleLabel] text] != @"=" || [[tmpButton titleLabel] text] != @"+/-") {
        varArray = [[NSMutableArray alloc] initWithObjects:varTextField.text, nil];
    }

    //add operand to opArray to be accessed by displayEquation and calculator then added to equationLabel and calcFunction

    if ([[[tmpButton titleLabel] text] isEqualToString:@"+"])
    {
        opArray = [[NSMutableArray alloc] initWithObjects:@"+", nil];
    }

    else if ([[[tmpButton titleLabel] text] isEqualToString:@"-"])
    {
        opArray = [[NSMutableArray alloc] initWithObjects:@"-", nil];
    }

    else if ([[[tmpButton titleLabel] text] isEqualToString:@"x"])
    {
        opArray = [[NSMutableArray alloc] initWithObjects:@"*", nil];
    }

    else if ([[[tmpButton titleLabel] text] isEqualToString:@"/"])
    {
        opArray = [[NSMutableArray alloc] initWithObjects:@"/", nil];
    }
    varTextField.text = @"";     //clear varTextField
}

- (IBAction)calculator:(id)sender
{
    [equationLabel setText:@"x + y = z"];

    NSString *tmpVar;
    NSString *tmpOp;
    float var;

    int varCount = [varArray count];
    int opCount = [opArray count];

    UIButton *tmpButton = (UIButton *)sender;

    if ([[[tmpButton titleLabel] text] isEqualToString:@"="]) {

        //for each instance of varArray and opArray, add it to the string "equation" and equation label
        for (int i=0; i<[varArray count]; i++) {
            tmpVar = [varArray objectAtIndex:i];
            var = ([tmpVar floatValue]);
            for (int j=0; j<[opArray count]; j++) {
                tmpOp = [opArray objectAtIndex:j];
                //equationLabel = 
            }
        }
    }
    //result =
}
4

2 に答える 2

1

!=この行の文字列を比較するために使用しないでください:

if ([[tmpButton titleLabel] text] != @"=" || [[tmpButton titleLabel] text] != @"+/-") {

代わりに次を使用しますisEqualToString

if (![[[tmpButton titleLabel] text] isEqualToString:@"="] || ![[[tmpButton titleLabel] text] isEqualToString:@"+/-"]) {

タイプopArrayのオブジェクトが含まれていますNSString。その値を int に割り当てるには、NSStringにそのintValue. objectAtIndexから値を取得するためにも使用したいと考えていますopArray

これを配列のインデックスとして使用しているため、次の 2 つのことを行う必要があります。

1)ループのに設定opCountします。0 for

opCount = 0;

2)switchステートメントでは、次のことを行います。

switch([[opArray objectAtIndex:opCount] intValue]) {

まだいくつかの問題があります。

1) switch ステートメントを実行していませんか? NSLogスイッチの直前にa を置きます。

1+2*3/4-5=2)実際には、オペランドごとに 1 つの演算しかなく、2 番目のオペランドが前の結果であるような方程式では。=が検出されたらresult、varArray の最初の値に設定し、次にループの 2 番目のオペランドからfor開始します (インデックスiを で開始し、ループのたびに 11だけインクリメントします。すべての最初のオペランドとして変数を使用します)。あなたの計算の。iresult

3) あなたのコードの各バージョンを上記の質問に残してください。

4) 最終結果が計算された後でのみ実行します (つまり、forループの後)。

[varOpArray addObject:[NSNumber numberWithFloat:result]];

varOpArrayクリアする前に表示を忘れずに。

5) どうやら、呼び出されたクラスにインスタンス変数 (またはプロパティ)resultがあるため、エラー メッセージが表示されます。それを取り除き、定義したローカル結果を使用してください。

この変更されたコードは動作します:

- (IBAction)opButtonPush:(id)sender {
    UIButton *tmpButton = (UIButton *)sender;

    float textValue=0;

    //add operand to opArray to be accessed by displayEquation and calculator then added to equationLabel and calcFunction
    if ([[[tmpButton titleLabel] text] isEqualToString:@"+"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:0]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"+"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"-"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:1]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"-"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"x"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:2]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"x"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }
    else if ([[[tmpButton titleLabel] text] isEqualToString:@"/"])
    {
        textValue = [[varTextField text] floatValue];
        [opArray addObject:[NSNumber numberWithInt:3]];
        [varOpArray addObject:[NSNumber numberWithFloat:textValue]];
        [varOpArray addObject:@"/"];
        [varArray addObject:[NSNumber numberWithFloat:textValue]];
    }

    //add value of float var to arrays to be accessed by calculator 

    [equationLabel setText:[varOpArray description]];   //send vars and ops, as entered, to equationLabel

    varTextField.text = @"";
    NSLog(@"%@", varOpArray);

}

- (IBAction)calculator:(id)sender {
    UIButton *tmpButton = (UIButton *)sender;

    int opCount=0;

    float finalTextValue=0;
    float result=0.0;

    if ([[[tmpButton titleLabel] text] isEqualToString:@"="]) {
        finalTextValue = [[varTextField text] floatValue];
        //[opArray addObject:[NSNumber numberWithInt:4]];
        [varOpArray addObject:[NSNumber numberWithFloat:finalTextValue]];
        [varOpArray addObject:@"="];
        [varArray addObject:[NSNumber numberWithFloat:finalTextValue]];

        result = [[varArray objectAtIndex:0] floatValue];

        for (int i=1; i<[varArray count]; i++) { 
            NSLog(@"switch hit");
            switch ([[opArray objectAtIndex:opCount] intValue]) {
                case 0:
                    result = result + [[varArray objectAtIndex:i] floatValue];
                    varTextField.text = @"";
                    break;
                case 1:
                    result = result - [[varArray objectAtIndex:i] floatValue];
                    varTextField.text = @"";
                    break;
                case 2:
                    result = result * [[varArray objectAtIndex:i] floatValue];
                    varTextField.text = @"";
                    break;
                case 3:
                    result = result / [[varArray objectAtIndex:i] floatValue];
                    varTextField.text = @"";
                    break;
                default:
                    NSLog(@"default");
                    break;
            }

            opCount++;
        }
        [varOpArray addObject:[NSNumber numberWithFloat:result]];
        [equationLabel setText:[varOpArray description]];      

        varOpArray = [NSMutableArray new];
        varArray = [NSMutableArray new];
        opArray = [NSMutableArray new];
        [varTextField resignFirstResponder];
    }

}
于 2012-09-29T22:25:59.787 に答える
0

私はあなたのプロジェクトを理解しようとしました。私は間違っているかもしれませんが、次のように思われます。forループでは、opCountはobjectAtIndexである必要があります。

結果は+=ではなく=である必要があります

于 2012-09-29T20:33:40.513 に答える