您的位置:首页 > 其它

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

2016-03-20 00:00 309 查看
摘要: 用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;
}

运行结果如下;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息