21.3.3 Fraction类

Fraction类在以前的例子和这个例子中几乎没有什么变化,只是增加了一个新的convertToString方法,用于将分数转换为相应的字符串表示。代码清单21-2显示了Fraction接口文件和对应的实现文件。

代码清单21-2 Fraction.h接口文件


import<UIKit/UIKit.h>

@interface Fraction:NSObject{

int numerator;

int denominator;

}

@property int numerator, denominator;

-(void)print;

-(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;

-(double)convertToNum;

-(NSString*)convertToString;

@end


代码清单21-2 Fraction.m实现文件


import“Fraction.h”

@implementation Fraction

@synthesize numerator, denominator;

-(void)setTo:(int)n over:(int)d

{

numerator=n;

denominator=d;

}

-(void)print

{

NSLog(@“i/%i”,numerator, denominator);

}

-(double)convertToNum

{

if(denominator!=0)

return(double)numerator/denominator;

else

return 1.0;

}

-(NSString*)convertToString;

{

if(numerator==denominator)

if(numerator==0)

return@“0”;

else

return@“1”;

else if(denominator==1)

return[NSString stringWithFormat:@“i”,numerator];

else

return[NSString stringWithFormat:@“i/%i”,

numerator, denominator];

}

//add a Fraction to the receiver

-(Fraction)add:(Fraction)f

{

//To add two fractions:

//a/b+c/d=((ad)+(bc))/(b*d)

//result will store the result of the addition

Fraction*result=[[Fraction alloc]init];

int resultNum, resultDenom;

resultNum=numeratorf.denominator+denominatorf.numerator;

resultDenom=denominator*f.denominator;

[result setTo:resultNum over:resultDenom];

[result reduce];

return[result autorelease];

}

-(Fraction)subtract:(Fraction)f

{

//To sub two fractions:

//a/b-c/d=((ad)-(bc))/(b*d)

Fraction*result=[[Fraction alloc]init];

int resultNum, resultDenom;

resultNum=numeratorf.denominator-denominatorf.numerator;

resultDenom=denominator*f.denominator;

[result setTo:resultNum over:resultDenom];

[result reduce];

return[result autorelease];

}

-(Fraction)multiply:(Fraction)f

{

Fraction*result=[[Fraction alloc]init];

[result setTo:numerator*f.numerator over:denominator

*f.denominator];

[result reduce];

return[result autorelease];

}

-(Fraction)divide:(Fraction)f

{

Fraction*result=[[Fraction alloc]init];

[result setTo:numeratorf.denominator over:denominatorf.numerator];

[result reduce];

return[result autorelease];

}

-(void)reduce

{

int u=numerator;

int v=denominator;

int temp;

if(u==0)

return;

else if(u<0)

u=-u;

while(v!=0){

temp=u%v;

u=v;

v=temp;

}

numerator/=u;

denominator/=u;

}

@end


convertToString:方法用于检查分数的分子和分母,以产生更适合查看的结果。如果分子和分母相等(但不是0),我们将返回@“1”。如果分子为0,则返回字符串@“0”。如果分母为1,则分数是一个整数,因此不需要显示分母。

convertToString:方法内部使用的stringWithFormat:方法返回一个指定格式的字符串(类似于NSLog)和一个用逗号隔开的参数列表。将参数传递给一个参数数量不定的方法时,可以使用逗号将多个参数隔开,这与将参数传递给NSLog函数时的做法是一样的。