Fully separated for easy clarification, in the book the Class is together in the same file... either way will work.
//
// main.m
// Chapter 11 Program 1
#import "Fraction.h"
#import "Fraction+MathOps.h"
int main (int argc, char * argv[])
{
@autoreleasepool {
Fraction *a = [[Fraction alloc] init];
Fraction *b = [[Fraction alloc] init];
Fraction *result;
[a setTo: 1 over: 3];
[b setTo: 2 over: 5];
[a print]; NSLog (@" +"); [b print]; NSLog (@"-----");
result = [a add: b];
[result print];
NSLog (@"\n");
[a print]; NSLog (@" -"); [b print]; NSLog (@"-----");
result = [a sub: b];
[result print];
NSLog (@"\n");
[a print]; NSLog (@" *"); [b print]; NSLog (@"-----");
result = [a mul: b];
[result print];
NSLog (@"\n");
[a print]; NSLog (@" /"); [b print]; NSLog (@"-----");
result = [a div: b];
[result print];
NSLog (@"\n");
}
return 0;
}
//
// Fraction+MathOps.h
// Chapter 11 Program 1
#import "Fraction.h"
@interface Fraction (MathOps)
-(Fraction *) add: (Fraction *) f;
-(Fraction *) mul: (Fraction *) f;
-(Fraction *) sub: (Fraction *) f;
-(Fraction *) div: (Fraction *) f;
@end
//
// Fraction+MathOps.m
// Chapter 11 Program 1
#import "Fraction+MathOps.h"
@implementation Fraction (MathOps)
-(Fraction *) add: (Fraction *) f
{
// To add two fractions:
// a/b + c/d = ((a*d) + (b*c)) / (b * d)
Fraction *result = [[Fraction alloc] init];
result.numerator = (self.numerator * f.denominator) + (self.denominator * f.numerator);
result.denominator = self.denominator * f.denominator;
[result reduce];
return result;
}
-(Fraction *) sub: (Fraction *) f
{
// To sub two fractions:
// a/b - c/d = ((a*d) - (b*c)) / (b * d)
Fraction *result = [[Fraction alloc] init];
result.numerator = (self.numerator * f.denominator) - (self.denominator * f.numerator);
result.denominator = self.denominator * f.denominator;
[result reduce];
return result;
}
-(Fraction *) mul: (Fraction *) f
{
Fraction *result = [[Fraction alloc] init];
result.numerator = self.numerator * f.numerator;
result.denominator = self.denominator * f.denominator;
[result reduce];
return result;
}
-(Fraction *) div: (Fraction *) f
{
Fraction *result = [[Fraction alloc] init];
result.numerator = self.numerator * f.denominator;
result.denominator = self.denominator * f.numerator;
[result reduce];
return result;
}
@end
//
// Fraction.h
// Chapter 11 Program 1
@interface Fraction : NSObject
@property int numerator, denominator;
-(NSString *) description;
-(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) reduce;
@end
//
// Fraction.m
// Chapter 11 Program 1
#import "Fraction.h"
@implementation Fraction
@synthesize numerator, denominator;
-(NSString *) description
{
return [NSString stringWithFormat: @"%i/%i", numerator, denominator];
}
-(void) print
{
NSLog (@"%i/%i", numerator, denominator);
}
-(double) convertToNum
{
if (denominator != 0)
return (double) numerator / denominator;
else
return NAN;
}
-(void) setTo: (int) n over: (int) d
{
numerator = n;
denominator = d;
}
-(Fraction *) add: (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 *) 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;
}
@end