2012-02-28 53 views
0

我正在上课,我们正在研究计算器程序。我的背景是用C++编写的。我正在使用3的RPN计算器条目输入sqrt,并且需要在我的descriptionOfProgram方法中将其显示为sqrt(3),这是新的,包括以下相关属性。到目前为止,这是该课程。搜索“xcode”以查找我的问题。有任何想法吗?我不擅长基本的目标c课,但我正在努力学习。这里有一个总结:Objective 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 } 
+0

欢迎来到Stack Overflow。当成员发布具有特定答案的完整问题时,该网站的效果最佳。你有没有试图搜索堆栈溢出的错误或警告你看到? – Justin 2012-02-28 03:03:00

回答

3
+ (NSString *)descriptionOfProgram:(id)program 

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

+3

实际上,在类方法中使用'self' _is_,它只是不指向类的实例,而是指向类本身。 – omz 2012-02-28 03:07:08

+0

@omz谢谢,更新。 – Mahesh 2012-02-28 03:14:11