Amazon.com Widgets Chapter 10 Exercise 3
Welcome, Guest. Please login or register.
Did you miss your activation email?
May 21, 2013, 05:42:27 PM
Home Help Search chat Login Register   
News: Read this please.The Great Kangaroo Escape Looking for reviews of the 4th ed on Amazon!   Twitter:  @skochan
                     

+  Official Forum for Programming in Objective-C (the iPhone Programming Language) - Stephen Kochan
|-+  Programming in Objective-C, 4th edition
| |-+  Exercises
| | |-+  Chapter 10
| | | |-+  Chapter 10 Exercise 3
Pages: [1]   Go Down
Print
Author Topic: Chapter 10 Exercise 3  (Read 487 times)
clouded
Full Member
***
Posts: 123






« on: May 31, 2012, 11:29:34 AM »

Here is what I put together for this exercise:

Code: (Objective-C)
// Chapter 10 Exercise 3
// Add a counter to the Fraction class’s add: method to count the number of times
// it is invoked. How can you retrieve the value of the counter?

//  main.m

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main (int argc, char * argv[])
{
    @autoreleasepool {
        Fraction *a, *b, *c;
        
        NSLog (@"Fractions allocated: %i", [Fraction count]);
              
        a = [[Fraction allocF] init];
        b = [[Fraction allocF] init];
        c = [[Fraction allocF] init];
        
        NSLog (@"Fractions allocated: %i", [Fraction count]);
        NSLog (@" ");
        
        [a setTo: 1 over: 2];
        NSLog (@"Fraction a set to ");
        [a print];
        NSLog (@" ");
        
        [b setTo: 3 over: 5];
        NSLog (@"Fraction b set to ");
        [b print];
        NSLog (@" ");
        
        [c setTo: 9 over: 17];
        NSLog (@"Fraction c set to ");
        [c print];
        NSLog (@" ");
        
        c = [b add: a];
        NSLog (@"Fraction c = a added into b: ");
        [c print];
        NSLog (@" ");
        
        NSLog (@"Fraction b set to ");
        [b print];
        NSLog (@" ");
        
        a = [b add: c];
        NSLog (@"Fraction a = c added into b: ");
        [a print];
        NSLog (@" ");
        
        NSLog (@"Fractions added: %i", [Fraction addCount]);
        
    }
    return 0;
}
Code: (Objective-C)
//  Fraction.h

#import <Foundation/Foundation.h>

@interface Fraction : NSObject
@property int numerator, denominator;

-(void) print;
-(double) convertToNum;
-(void) setTo: (int) n over: (int) d;
-(Fraction *) add: (Fraction *) f;
-(Fraction *) subtract: (Fraction *) f;
-(Fraction *) multiply: (Fraction *) f;
-(Fraction *) divide: (Fraction *) f;
-(void) negate;
-(void) reduce;
-(id) addN: (id) f;
+(Fraction *) allocF;
+(int) count;
+(int) addCount;
@end
Code: (Objective-C)
// Fraction.m

#import "Fraction.h"

static int gCounter;
static int gAddCounter;

@implementation Fraction
@synthesize numerator, denominator;

+(Fraction *) allocF
{
    extern int gCounter;
    ++gCounter;
    return [Fraction alloc];
}
+(int) count
{
    extern int gCounter;
    return gCounter;
}
+(int) addCount
{
    extern int gAddCounter;
    return gAddCounter;
}
-(void) print
{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = numerator;
    result.denominator = denominator;
    
    if (numerator/denominator >= 1 || numerator/denominator <= -1) {
        if (result.numerator % result.denominator == 0) {
            NSLog(@"%i \nOR", result.numerator / result.denominator);
        } else if (result.numerator <= 0) {
            NSLog(@"%i %i/%i \nOR", result.numerator / result.denominator, -(result.numerator % result.denominator) , result.denominator);
        } else {
            NSLog(@"%i %i/%i \nOR", result.numerator / result.denominator, result.numerator % result.denominator , result.denominator);
        }
    }
    [result reduce];
    NSLog (@"%i/%i", result.numerator, result.denominator);
}
-(double) convertToNum
{
    if (denominator != 0)
        return (double) numerator / denominator;
    else
        return NAN;
}
-(void) setTo: (int) n over: (int) d
{
    numerator = n;
    denominator = d;
    if (d < 0) {
        [self negate];
    }
}
-(void) negate
{
    denominator *= -1;
    numerator *= -1;
}
-(Fraction *) add: (Fraction *) f
{
    extern int gAddCounter;
    gAddCounter++;
    
    Fraction *result = [[Fraction alloc] init];
    result.numerator = numerator * f.denominator + denominator * f.numerator;
    result.denominator = denominator * f.denominator;
    
    [result reduce];
    return result;
}
-(Fraction *) subtract: (Fraction *) f
{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = numerator * f.denominator - denominator * f.numerator;
    result.denominator = denominator * f.denominator;
    
    [result reduce];
    return result;
}
-(Fraction *) multiply: (Fraction *) f
{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = numerator * f.numerator;
    result.denominator = denominator * f.denominator;
    
    [result reduce];
    return result;
}
-(Fraction *) divide: (Fraction *) f
{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = numerator * f.denominator;
    result.denominator = denominator * f.numerator;
    
    [result reduce];
    return result;
}
-(void) reduce
{
    int u = numerator;
    int v = denominator;
    int temp;
    while (v != 0) {
        temp = u % v;
        u = v;
        v = temp;
    }
    numerator /= u;
    denominator /= u;
    if (denominator < 0) {
        [self negate];
    }
}
-(id) addN: (id) f
{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = numerator * [f denominator] + denominator * [f numerator];
    result.denominator = denominator * [f denominator];
    
    [result reduce];
    return result;
}
@end

Output:

Fractions allocated: 0
Fractions allocated: 3

Fraction a set to
1/2
 
Fraction b set to
3/5

Fraction c set to
9/17
 
Fraction c = a added into b:
1 1/10
OR
11/10
 
Fraction b set to
3/5

Fraction a = c added into b:
1 7/10
OR
17/10

Fractions added: 2
« Last Edit: May 31, 2012, 11:35:30 AM by clouded » Logged
mo7ionsickness
Jr. Member
**
Posts: 50






« Reply #1 on: August 21, 2012, 05:11:06 AM »

Code: (Objective-C)
static int counter;

-(id) addThis:(id)f
{
    Fraction *result = [[Fraction alloc] init];
   
    [result setNumerator: numerator * [f denominator] + denominator * [f numerator]];
    [result setDenominator: denominator * [f denominator]];
    [result reduce];
   
    extern int counter;
    ++counter;
   
    return result;
}

+(int) count
{
    extern int counter;
   
    return counter;
}
Code: (Objective-C)
        Fraction *frac1 = [[Fraction alloc] init];
        Fraction *frac2 = [[Fraction alloc] init];
        Fraction *frac3 = [[Fraction alloc] init];
        Fraction *frac4 = [[Fraction alloc] init];
        
        [frac1 setTo:1 over:3];
        [frac2 setTo:2 over:6];
        [frac3 setTo:1 over:4];
        [frac4 setTo:4 over:6];
        
        [frac1 addThis:frac2];
        [frac1 addThis:frac3];
        [frac1 addThis:frac4];
        
        NSLog(@"number of times addThis method was invoked = %i", [Fraction count]);
2012-08-21 13:07:43.286 FractionTest[953:303] number of times addThis method was invoked = 3
« Last Edit: August 21, 2012, 05:13:46 AM by mo7ionsickness » Logged
Pages: [1]   Go Up
Print
Jump to:  



Login with username, password and session length

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC Valid XHTML 1.0! Valid CSS!
Entire forum contents (c) 2009 classroomM.com. All rights reserved.