2012-02-28 47 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