A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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一样 至少会执行一次大括号里里的运算
应该不至于算出个错误的结果吧,不知道这里为什么最后算出了个零分之一的结果。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马