我正在开发一个计算器应用程序(下面的代码),它通过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 =
}
答案 0 :(得分: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
中检索值。
由于您将它用作数组的索引,因此您需要做两件事:
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;
和 结果应该是=,而不是+ =