【问题标题】:Objective C newbieObjective C 新手
【发布时间】:2012-02-28 02:56:18
【问题描述】:

我正在上课,我们正在开发一个计算器程序。我的背景是 C++。我正在使用 3 输入 sqrt 的 RPN 计算器条目,并且需要在我的 descriptionOfProgram 方法中将其显示为 sqrt(3),这是新的,包括下面的关联属性。这是到目前为止的课程。搜索“xcode”以查找我的问题。有任何想法吗?我不太擅长基本的目标c课程,但我正在努力学习。总结如下:

  1. 它在抱怨我的布尔值。我不确定为什么。我在另一个班级做过这个,效果很好。
  2. 它正在寻找一个{我没看到它
  3. 它不喜欢我使用密钥。我不清楚如何获取我认为是问题的密钥内容。
  4. 它想要 ] 但我不明白为什么
  5. 已跳过
  6. 应该是 } 在@end

希望您能提供帮助!谢谢!

//
//  CalculatorBrain.m
//  Calculator
//
//  Created by Michele Cleary on 2/25/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "CalculatorBrain.h"

@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray  *programStack;
@property (nonatomic, strong) NSDictionary *testVariable;
@property (nonatomic) BOOL numberHandledNextOperation;
- (double) convertRadianToDegree: (double) radian;
@end

@implementation CalculatorBrain

@synthesize programStack = _programStack;
@synthesize testVariable = _testVariable;
@synthesize numberHandledNextOperation = _numberHandledNextOperation;


- (NSMutableArray *)programStack
{
    if (_programStack == nil) _programStack = [[NSMutableArray alloc] init];
    return _programStack;
}
//- (void)setOperandStack:(NSMutableArray *)operandStack
//{
//    _operandStack = operandStack;
//}



- (void)pushOperand:(double)operand
{
    [self.programStack addObject:[NSNumber numberWithDouble:operand]];   
}

- (double)performOperation:(NSString *)operation
{
    [self.programStack addObject:operation];
    return[CalculatorBrain runProgram:self.program];

}

- (id)program
{
    return [self.programStack copy];
}

+ (NSString *)descriptionOfProgram:(id)program
{
    self.numberHandledNextOperation = NO;  //1. this is a problem with xcode: member reference type struct objc_class * is a pointer; maybe you meant to use ->

    NSMutableSet * displayDescrip = [[NSMutableSet alloc] init];

    for(id foundItemKey in program)
    {
        if ([foundItemKey isKindOfClass:[NSString class]])
            //operator or variable
        {
            if ([foundItemKey isEqualToString:@"sin"]&&(!self.numberHandledNextOperation)) 
            { //2. xcode says To match this {. 
                NSObject *nextObj = [program objectForKey:(foundItemKey+1);  //3. xcode doesn't like this: arithmetic on pointer to interface id which is not a constant size in non-fragile ABI
                //[displayDescrip addObject:foundItemKey];
            }
            else if ([foundItemKey isEqualToString:@"cos"]) 
            {
                //[displayDescrip addObject:foundItemKey];
            }
            else if ([foundItemKey isEqualToString:@"sqrt"])
            {
                //[displayDescrip addObject:foundItemKey];
            }
            else if ([foundItemKey isEqualToString:@"Ï€"]) 
            {
                //[displayDescrip addObject:foundItemKey];
            }
            else if (![CalculatorBrain isOperationName:foundItemKey]) 
            {
            //variable

                //[displayDescrip addObject:foundItemkey];
            }
            else if (foundItemKey isKindOfClass:[NSNumber class])  //4. xcode expected ]
            {
                //number
                //if next object is operation
                if(isOperation([program objectForKey:(foundItemKey+1))) 
                {
                    numberHandledNextOperation = YES;
                    if(isOperationSpecial([program objectForKey:(foundItemKey+1)))
                    { //sin or cos or sqrt need parentheses
                        //[displayDescrip addObject:(foundItemKey+1)];
                        //[displayDescrip addObject:@"("];
                        //[displayDescrip addObject:foundItemKey];
                        //[displayDescrip addObject:@")"];
                    }
                    else 
                    { //regular operation + - / *
                    //[displayDescrip addObject:(foundItemKey+1)];
                    //[displayDescrip addObject:(foundItemKey)];
                    }
                    numberHandledNextOperation = YES;
                 } //if
            } //else if

        } //if
    } //for
    //not sure if I need this next thing
    //NSSet * returnedVarNames = [varNames copy];
    //return returnedVarNames;
    return @"implement this in Assignment 2";
}

+ (double)runProgram:(id)program
{
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {
        stack = [program mutableCopy];
    }
    return [self popOperandOffStack:stack];
}

+ (double)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues
{
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {
        stack = [program mutableCopy];
    }

    if(variableValues)
    {
        int numItemsDisplayed = [stack count];
        for (int count = 0; count < numItemsDisplayed; count++) 
        {
            id foundItem = [stack objectAtIndex:count];
            if ([foundItem isKindOfClass:[NSString class]])
            {
                NSString * var = [variableValues objectForKey:foundItem];
                if(var)
                {
                   [stack replaceObjectAtIndex:count withObject:[NSNumber numberWithDouble:[var doubleValue]]];
                }
            }
        }
    }
    return [self popOperandOffStack:stack];
}

+ (double)popOperandOffStack:(NSMutableArray *)stack
{
    double result = 0;

    id topOfStack = [stack lastObject];
    if (topOfStack) [stack removeLastObject];

    if([topOfStack isKindOfClass:[NSNumber class]]){ //number
        result = [topOfStack doubleValue];
    }
    else if ([topOfStack isKindOfClass:[NSString class]]){ //string operation
        NSString *operation = topOfStack;
        if ([operation isEqualToString:@"+"]) {
            result = [self popOperandOffStack:stack] + [self popOperandOffStack:stack];
        }else if ([operation isEqualToString:@"*"]) {
            result = [self popOperandOffStack:stack] * [self popOperandOffStack:stack];    
        }else if ([operation isEqualToString:@"/"]) {
            double divisor = [self popOperandOffStack:stack];
            if (divisor) 
                result = [self popOperandOffStack:stack] / divisor;    
        }else if ([operation isEqualToString:@"-"]) {
            double subtrahend = [self popOperandOffStack:stack];
            result = [self popOperandOffStack:stack] - subtrahend;    
        }else if ([operation isEqualToString:@"sin"]) {
            result = result = (sin([self popOperandOffStack:stack])); //(sin([self convertRadianToDegree:[self popOperandOffStack:stack]]));    
        }else if ([operation isEqualToString:@"cos"]) {
            result = (cos([self popOperandOffStack:stack]));    
        }else if ([operation isEqualToString:@"sqrt"]) {
            result = (sqrt([self popOperandOffStack:stack]));    
        }else if ([operation isEqualToString:@"π"]) {
            result = M_PI;    
        }else{
            result = 0;
        }


    }

    return result;
}

+ (NSSet *)variablesUsedInProgram:(id)program
{
    NSMutableSet * varNames = [[NSMutableSet alloc] init];

    for(id foundItem in program)
    {
       if ([foundItem isKindOfClass:[NSString class]])
       {
           if (![CalculatorBrain isOperationName:foundItem])
           {
               [varNames addObject:foundItem];
           }
       }
    }
    NSSet * returnedVarNames = [varNames copy];
    return returnedVarNames;
}

+ (BOOL)isOperationName:(NSString *)foundItem
{
    NSSet *myOperationSet = [NSSet setWithObjects:@"sqrt", @"sin", @"cos", @"π", @"+", @"-", @"*", @"/", nil];
    return([myOperationSet containsObject:(foundItem)]);
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"stack = %@", self.programStack];
}

-(double) convertRadianToDegree: (double) radian;
{
    return M_PI*2*radian/360;
}

@end  //6. xcode expected }

【问题讨论】:

  • 欢迎来到 Stack Overflow。当成员发布具有特定答案的完整问题时,该网站效果最佳。您是否尝试在 Stack Overflow 上搜索您看到的错误或警告?

标签: objective-c


【解决方案1】:
+ (NSString *)descriptionOfProgram:(id)program

你真的想要descriptionOfProgram 一个类+ 方法吗?如果是,它更像是 C++ 中的静态方法。它不属于某个类的任何特定实例。没有传递指向当前实例的常量指针的隐藏参数。

【讨论】:

  • 其实,在类方法中使用selfis,它只是不指向类的实例,而是指向类本身。
猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多