Here is what I put together for this exercise:
// 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;
}
// 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
// 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