切换到计算器app objective-c没有运行

时间:2012-09-29 16:52:57

标签: objective-c switch-statement calculator

我正在开发一个计算器应用程序(下面的代码),它通过UITextField获取值,在按下操作数按钮时将它们存储到数组(varArray)。按下操作数按钮还会将该操作数存储在另一个数组(opArray)中并清除varTextField。按下相等按钮(尚未完全实现,仍在尝试获取值和在我继续前计算的操作数)将执行计算并将其显示在标签(equationLabel)中。所有这些都是为了提供多变量功能。最后,我希望能够输入类似:var1,op1,var2,op2,var3等等,并将整个方程/结果显示在equationLabel中。

我还将操作数等同于交换机的int值。

我现在卡住了,因为组合变量和操作数的开关似乎根本没有运行。结果项将发送到equationLabel,但仅使用默认值0.

我对编码比较新,对Objective-c来说更是如此,所以我可能只是在做一些愚蠢的事情。任何有关切换问题的帮助都将不胜感激。

我还应该提到,在每个交换机案例中,我都会从xCode收到以下警告:“'result'的本地声明隐藏了实例变量。

更新了代码2 完美的工作,除了应用程序似乎没有写入opButtonPush中的数组,直到第一次推送equalButton。数组值返回null,直到该UI事件。

- (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 =
}

2 个答案:

答案 0 :(得分:1)

请勿使用!=来比较此行中的字符串:

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

改为使用isEqualToString

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

您的opArray包含NSString类型的对象。要将该值分配给int,您需要向NSString询问其intValue。您还希望使用objectAtIndexopArray中检索值。

由于您将它用作数组的索引,因此您需要做两件事:

1)在<{strong> opCount循环之前将0设置为for

opCount = 0;

2)在switch语句中,执行以下操作:

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

我仍然看到几个问题:

1)你确定你没有点击switch语句吗?在切换之前立即放置NSLog

2)在诸如1+2*3/4-5=的等式中,每个操作数实际上只有一个操作,第二个操作数是前一个结果。检测到=后,我会将result设置为varArray中的第一个值,然后我将从for循环中的第二个操作数开始(在i处开始索引1 i,每次循环时只将result递增1。在所有计算中使用变量for作为第一个操作数。

3)请将您的每个版本的代码留在上面的问题中,否则对于稍后出现的人来说,答案是没有意义的。

4)只有在计算完最终结果后才能进行(即[varOpArray addObject:[NSNumber numberWithFloat:result]]; 循环后)。

varOpArray

在清除之前不要忘记显示result

5)显然你的类中有一个名为- (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]; } } 的实例变量(或属性),这就是你收到错误信息的原因。摆脱它,只使用你定义的本地结果。

此修改后的代码有效:

{{1}}

答案 1 :(得分:0)

我试图了解你的项目。 我可能错了,但似乎: 在for循环中,opCount 应该是objectAtIndex;

和 结果应该是=,而不是+ =