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;

}


运行结果如下;


092050_rwpp_2683146.png



转载于:https://my.oschina.net/luhoney/blog/643947

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值