Цель C новичок - PullRequest
       3

Цель C новичок

0 голосов
/ 28 февраля 2012

Я беру урок, и мы работаем над программой калькулятора. Мой опыт работы в C ++. Я беру запись калькулятора RPN из 3 введите sqrt, и мне нужно отобразить ее как sqrt (3) в моем методе descriptionOfProgram, который является новым, включая связанное свойство ниже. Вот класс пока. Ищите «xcode», чтобы найти мои проблемы. Есть идеи? Я не очень хорошо разбираюсь в базовых задачах с классами, но пытаюсь учиться. Вот резюме:

  1. это жалуется на мой логический. Я не уверен почему. Я сделал это в другом классе, и он работал нормально.
  2. он ищет {я не вижу
  3. мне не нравится, когда я использую ключ. Мне неясно, как получить содержимое ключа, я думаю, что это проблема.
  4. Он хочет], но я не понимаю, почему
  5. пропущено
  6. Ожидается} в конце @ 1014 *

Надеюсь, вы можете помочь! Спасибо!

//
//  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 }

1 Ответ

3 голосов
/ 28 февраля 2012
+ (NSString *)descriptionOfProgram:(id)program

Вы действительно хотите descriptionOfProgram метод класса +? Если да, это больше похоже на статический метод в C ++. Он не принадлежит ни одному конкретному экземпляру класса. Отсутствует скрытый параметр постоянного указателя на текущий экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...