Fraction.文件
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator,denominator;
-(void) print; //输出
-(void) setTo: (int)n over: (int)d; //设置分子和分母
-(double) convertToNum; //把分数转换成小数,测试下分子和分母是否正确读入
-(void)reduce;//简化分子和分母
-(Fraction *) add: (Fraction *)f; //两个分数相加运算
@end
Fraction.m文件
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print
{
NSLog(@"%i/%i",numerator,denominator);
}
-(void) setTo: (int)n over: (int)d
{
numerator=n;
denominator=d;
}
-(double) convertToNum //把分数转换成小数,测试下分子和分母是否正确读入
{
if (denominator != 0) //如果除数(分母)不等于0,除法计算成立
{
return (double)numerator/denominator; //用分子除以分母
}else //否则返回错误值
return NAN;
}
-(void)reduce //简化分子和分母
{
int u = numerator;
int v = denominator;
int temp;
if (v != 0) //求最大公约数:欧几里德算法--除数除以余数
{
temp = u%v;
u = v;
v = temp;
}
numerator /= u; //除以最大公约数,简化分子
denominator /= u; //除以最大公约数,简化分母
}
-(Fraction *) add: (Fraction *)f ////两个分数相加运算,并返回一个结果
{
Fraction * resultAdd = [[Fraction alloc]init]; //创建一个记录相加结果的子类
resultAdd.numerator = numerator * f.denominator + denominator *f.numerator;
//分数加法运算,
//公式:a/x + b/y 的分子= a*y+b*x
resultAdd.denominator = denominator * f.denominator; //公式:a/x + b/y的分母= x*y
[resultAdd reduce]; //简化分子和分母
return resultAdd; //返回结果
}
@end
main.m文件
#import <Foundation/Foundation.h>
#import "Fraction.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction * aFraction = [[Fraction alloc]init];
Fraction * bFraction = [[Fraction alloc]init];
Fraction *resultFraction; //记录分数相加的结果
[aFraction setTo:1 over:4];
[bFraction setTo:1 over:2];
NSLog(@"测试分子分母输入,把分数转换成小数形式:");
NSLog(@"%.2lf",[aFraction convertToNum]);
NSLog(@"%.2lf",[bFraction convertToNum]);
NSLog(@"把两个分数相加:");
[aFraction print];
NSLog(@"+");
[bFraction print];
NSLog(@"=");
resultFraction = [aFraction add: bFraction]; //把两个分数相加并简化结果
[resultFraction print ];
}
return 0;
}
/*运行结果
2014-07-18 13:43:46.555 oc[4779:303] 测试分子分母输入,把分数转换成小数形式:
2014-07-18 13:43:46.557 oc[4779:303] 0.25
2014-07-18 13:43:46.557 oc[4779:303] 0.50
2014-07-18 13:43:46.558 oc[4779:303] 把两个分数相加:
2014-07-18 13:43:46.558 oc[4779:303] 1/4
2014-07-18 13:43:46.558 oc[4779:303] +
2014-07-18 13:43:46.559 oc[4779:303] 1/2
2014-07-18 13:43:46.559 oc[4779:303] =
2014-07-18 13:43:46.559 oc[4779:303] 0/1
Program ended with exit code: 0
*/
正确结果应该是 四分之三
问题:
这个是个把两个分数相加的练习,计算他们的和
我不小心把下面这个方法里的 while 写成了 if,
导致最后计算结果出错。
-(void)reduce //简化分子和分母
{
int u = numerator;
int v = denominator;
int temp;
if (v != 0) //求最大公约数:欧几里德算法--除数除以余数
{
temp = u%v;
u = v;
v = temp;
}
numerator /= u; //除以最大公约数,简化分子
denominator /= u; //除以最大公约数,简化分母
}
我的理解 if是进行判断 在这里条件和while一样 至少会执行一次大括号里里的运算
应该不至于算出个错误的结果吧,不知道这里为什么最后算出了个零分之一的结果。
|
|