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函数时的做法是一样的。