Re: Stuck on CalculatorBrain.m for Assignment 2

182 views
Skip to first unread message

Harry

unread,
Jun 22, 2012, 10:50:08 AM6/22/12
to iphone-appd...@googlegroups.com
JP, it's a bit difficult to see exactly what is going on.

What do you get if you enter: 2 enter 3 +
and immediately after that 4 enter 5 +

I do not  understand the necessity for the '=' sign in your code. 

On Sunday, June 10, 2012 10:26:14 PM UTC+2, jp wrote:

I'm stuck on CalculatorBrain.m for Assignment 2.  runProgram should basically call performOperation, which calls itself recursively as it cycles through the programStack mutableArray, but I'm stuck on how to get performOperation to recurse, it seems to pop the last operand off the stack and return the result.  So my NSLog statements look like


This GDB was configured as "x86_64-apple-darwin".sharedlibrary apply-load-rules all

Attaching to process 11191.

2012-06-10 15:25:06.048 Calculator[11191:f803] stack (
    3,
    "+"
)
2012-06-10 15:25:06.088 Calculator[11191:f803] stack (
    3,
    "+"
)
2012-06-10 15:25:06.089 Calculator[11191:f803] stack (
    3,
    "+"
)
2012-06-10 15:25:06.089 Calculator[11191:f803] double value is: 3.000000


Any advice appreciated, I've been looking at this code for a couple hours and can't come up with anything at this point.  Code is below, thanks for any help...

 
#import "CalculatorBrain.h"
@interface CalculatorBrain()
@property(nonatomic,strong) NSMutableArray *programStack;
@end
@implementation CalculatorBrain
@synthesize programStack = _programStack;
- (NSMutableArray *)programStack
{
    //lazy instantiation
    if(_programStack == nil) _programStack = [[NSMutableArray alloc] init];
    return _programStack;
}
- (void)pushOperand: (double)operand
{
    //wrap operand primitive in an object
    [self.programStack addObject:[NSNumber numberWithDouble:operand]];
    
}
- (void)pushOperation: (NSString *)operation
{
    [self.programStack addObject:operation];
    //NSLog(@"%@", self.programStack);
    
}
- (double)performOperation:(NSString *)operation
{
    [self.programStack addObject:operation];
    return [CalculatorBrain runProgram:self.program];
}
- (id)program
{
    return [self.programStack copy];
}
+ (NSString *)descriptionOfProgram:(id)program
{
    return @"Implement this later";
}

/*Pop operand off stack*/
+(double)popOperandOffStack:(NSMutableArray *)stack
{
    double result = 0;
    id topOfStack = [stack lastObject];
    if (topOfStack) [stack removeLastObject];
    
    if ([topOfStack isKindOfClass:[NSNumber class]])
    {
        result = [topOfStack doubleValue];
    }
    else if([topOfStack isKindOfClass:[NSString class]])
    {
        NSString *operation = topOfStack;
        
        if ([operation isEqualToString:@"="])
        {
            result = [self popOperandOffStack:stack];
        }
        else 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 subtrahend = [self popOperandOffStack:stack];
            result = [self popOperandOffStack:stack] - subtrahend;
        }
        else if ([operation isEqualToString:@"/"])
        {
            double divisor = [self popOperandOffStack:stack];
            if(divisor)
                result = [self popOperandOffStack:stack] / divisor;
        }
        else if([operation isEqualToString:@"sin"])
        {
            result = sin([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;
        }
        
    }
        NSLog(@"stack %@", stack);
    return result;
}
+ (double)runProgram:(id)program
{
    NSMutableArray *stack;
    if([program isKindOfClass:[NSArray class]]) {
        stack = [program mutableCopy];
    }
    double result = [self popOperandOffStack:stack];
    NSLog(@"double value is: %f", result);
    return result; 
    
}
@end
Reply all
Reply to author
Forward
0 new messages