OC基础第三天(定义一个分数类,实现加减乘除!)

FJFraction.h

#import <Foundation/Foundation.h>

/**定义一个分数类分为分子和分母*/

@interface FJFraction : NSObject{

    NSInteger _num;

    NSInteger _den;

}/**传入一个小数转化为分数*/

+ (instancetype) fractionWithDouble:(double) value;

/**初始化方法*/

+ (instancetype) fractionWithNum:(NSInteger) num den:(NSInteger)den;

/**分数相加*/

- (instancetype) add:(FJFraction *)otherFraction;

/**分数相减*/

- (instancetype) sub:(FJFraction *)otherFraction;

/**分数相乘*/

- (instancetype) mul:(FJFraction *)otherFraction;

/**分数相除*/

- (instancetype) div:(FJFraction *)otherFraction;

/**得到分数的分子*/

- (NSInteger)num;

/**得到分子的分母*/

- (NSInteger)den;


@end




FJFraction.m

#import "FJFraction.h"

//求最大公约数算法:短除法!!!

NSInteger gcd(NSInteger x, NSInteger y) {

    if (x > y) {

        return gcd(y, x);

    }

    else if (y % x != 0) {

        return gcd(y % x, x);

    }

    else {

        return x;

    }

}

@implementation FJFraction


+ (instancetype) fractionWithNum:(NSInteger) num den:(NSInteger) den{

    return [[[[self alloc]initWithNum:(NSInteger) num den:(NSInteger) den] normalize] simplify];

    

}


- (instancetype) initWithNum:(NSInteger) num den:(NSInteger) den{

    if (self = [super init]) {

        _num = num;

        _den = den;

    

    

    }

    return self;

}


- (instancetype)add:(FJFraction *)otherFraction{

    

    return [[[FJFraction fractionWithNum:_num*otherFraction.den + _den*otherFraction.num den:_den*otherFraction.den]normalize] simplify];

    

}


- (instancetype)sub:(FJFraction *)otherFraction{

    return [[[FJFraction fractionWithNum:_num*otherFraction.den - _den*otherFraction.num den:_den*otherFraction.den]normalize]simplify];

}


-(instancetype)mul:(FJFraction *)otherFraction{

    return [[[FJFraction fractionWithNum:_num*otherFraction.num den:_den*otherFraction.den]normalize]simplify];

}


- (instancetype)div:(FJFraction *)otherFraction{

    return [[[FJFraction fractionWithNum:_num*otherFraction.den  den:_den*otherFraction.num]normalize]simplify];

}



+ (instancetype)fractionWithDouble:(double)value{

    NSInteger num = (NSInteger)(value * 10000);

    NSInteger den = 10000;

    return [self fractionWithNum:num den:den];

}



//将分数的负号放到分子上面去

- (instancetype) normalize{

    if (_den < 0) {

        _den = -_den;

        _num = -_num;

    }

    return self;

}

/**把分数正规化和化简的方法返回的都是分数本身,可以实现级联编程,即直接调用该方法就可以实现化简和正规化!*/

//对分数进行化简!同时除以最大公约数

- (instancetype) simplify{

    if (_num!=0) {

        NSInteger fac = gcd(labs(_num), labs(_den)) ;

        if (fac > 1) {

            _num /= fac;

            _den /= fac;

        }

    }

    return self;

}


- (NSInteger)num{

    return _num;

}

- (NSInteger)den{

    return _num;

}


- (NSString *)description{

    if (_den == 1) {

         // @()可以将一个基本类型的变量变成一个NSNumber对象

        //当分母为1时只是输出分子

        return [@(_num) stringValue];

    }

    return [NSString stringWithFormat:@"%ld/%ld",_num,_den];

}



@end

main.m

#import <Foundation/Foundation.h>

#import "FJFraction.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        FJFraction *f1 = [FJFraction fractionWithDouble:0.75];

        FJFraction *f2 = [FJFraction fractionWithNum:4 den:5];

        NSLog(@"%@ + %@ = %@", f1, f2, [f1 add:f2]);

        NSLog(@"%@ - %@ = %@", f1, f2, [f1 sub:f2]);

        NSLog(@"%@ * %@ = %@", f1, f2, [f1 mul:f2]);

        NSLog(@"%@ / %@ = %@", f1, f2, [f1 div:f2]);


        

        

    }

    return 0;

}


运行结果如下;




你可能感兴趣的:(OC实现分数的加减乘除)