接上文
我们继续来扩展分数类Fraction,两个分数相加,再不考虑它们是不是最简分数的情况下,有下面的公式成立:a/b+c/d=(ad+bc)/bd,那么我们在Fraction类中添加一个add方法,代码如下:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator,denominator;
-(void) print;
-(double) convertToNum;
-(void) setTo:(int) n over: (int) d;
-(void) add:(Fraction *) f;
@end
注意这个add方法的定义,参数类型是指针类型的Fraction,那么编写函数实现:
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print
{
NSLog(@"%i/%i",numerator,denominator);
}
-(double) convertToNum
{
if(denominator!=0){
return (double)numerator/denominator;
}else{
return NAN;
}
}
-(void) setTo:(int)n over:(int)d
{
numerator=n;
denominator=d;
}
-(void) add:(Fraction *)f
{
numerator=numerator*f.denominator+denominator*f.numerator;
denominator=denominator*f.denominator;
}
@end
这个实现方法内的计算过程就是数学公式的程序化。之后修改主函数,代码如下:
#import "Fraction.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *fractionA = [Fraction new];
Fraction *fractionB = [Fraction new];
[fractionA setTo:10 over:406];
[fractionB setTo:23 over:901];
[fractionA print];
[fractionB print];
[fractionA add:fractionB];
[fractionA print];
}
return 0;
}
编译运行,我们得到如下结果:
当然这里我们没有对分数进行化简。
当有方法定义的时候,就会涉及到局部变量的概念。在方法内部定义的变量就是局部变量,局部变量没有初始值,需要人为进行赋值操作。这些变量的作用域就是这个方法调用的生命周期,当方法返回结果后,本次局部变量就都消失了。也就是每次方法调用时,重新生成局部变量,赋值,使用,返回结果后它们就消失了。我们继续来编写分数化简的方法,其中使用到了局部变量,代码如下:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator,denominator;
-(void) print;
-(double) convertToNum;
-(void) setTo:(int) n over: (int) d;
-(void) add:(Fraction *) f;
-(void) reduce;
@end
我们加入了reduce方法,数学概念中,分数的化简就是找出分子和分母的最大公约数,然后分子分母同时除以这个最大公约数,就得到了最简分数。我们之前用到过求最大公约数的示例,那么这里我们直接使用,实现代码中这样来写:
-(void) reduce
{
int n=numerator;
int d=denominator;
int temp;
while (d!=0) {
temp=n%d;
n=d;
d=temp;
}
numerator/=n;
denominator/=n;
}
之后修改主函数:
#import "Fraction.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *fractionA = [Fraction new];
Fraction *fractionB = [Fraction new];
[fractionA setTo:10 over:406];
[fractionB setTo:23 over:901];
[fractionA print];
[fractionB print];
[fractionA add:fractionB];
[fractionA reduce];
[fractionA print];
}
return 0;
}
编译运行后,我们就得到如下的结果了:
扩展我们说过的局部变量的含义,方法的参数也是局部变量,比如对于方法
-(double) add: (double) x,那么调用这个方法时可以是这样的
[data add: val]。在方法中我们使用的是x变量,而传入的是val变量,val变量赋值给x后,val本身没有变化,而作为局部变量的x发生的所有变化都与val无关。
而上面我们传入对象参数时,则可以在方法中修改其实例变量的值,这是因为我们传递的是数据存储的引用位置,所以才能在方法中修改其中的值。
关键字static可以修饰变量,当static修饰局部变量时,那么这个值可以保存多次调用该方法所得到的值。而且它会在程序开始执行时初始化一次,因此需要对其先赋好值。如果static修饰的不是局部变量,那么所有的方法就都可以访问它们了。
对于分数化简的方法,我们继续探究。如何在add方法内调用reduce方法,那么在主函数中就不必再次调用该方法,而且分数做完加法后自动完成化简也是更佳的做法。那么问题就是如何在一个方法内调用本类定义的其它方法,关键字self就是完成这个功能的。self关键字用来指明对象是该方法的调用者,比如
[self reduce]。上述方法就可以改为:
-(void) add:(Fraction *)f
{
numerator=numerator*f.denominator+denominator*f.numerator;
denominator=denominator*f.denominator;
[self reduce];
}
结合上面的代码,分数化简后返回化简后的分数,此时如果我们想返回这个分数对象,又改怎么做呢?这就是方法返回对象的问题,上述代码继续扩展如下:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator,denominator;
-(void) print;
-(double) convertToNum;
-(void) setTo:(int) n over: (int) d;
-(void) add:(Fraction *) f;
-(Fraction *)add2:(Fraction *)f;
-(void) reduce;
@end
我们加入了新方法的定义,防止重名方法,那么实现如下:
-(Fraction *)add2:(Fraction *)f
{
Fraction *result=[Fraction new];
result.numerator=numerator*f.denominator+denominator*f.numerator;
result.denominator=denominator*f.denominator;
[result reduce];
return result;
}
主函数修改如下:
#import "Fraction.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *fractionA = [Fraction new];
Fraction *fractionB = [Fraction new];
Fraction *resultFraction;
[fractionA setTo:10 over:406];
[fractionB setTo:23 over:901];
[fractionA print];
[fractionB print];
resultFraction=[fractionA add2:fractionB];
[resultFraction print];
}
return 0;
}
编译运行后,我们得到如下结果:
到目前为止,我们已经编写了一个功能相对完整的类Fraction,对于此时的头文件,完全可以作为我们处理分数的方法库,并且可以将我们编写的程序提供给他人使用。如果要添加新的方法而不修改已有方法,可以通过定义扩展类来实现该目的。
接下文
- 大小: 57.1 KB
- 大小: 71.2 KB
- 大小: 73.3 KB
分享到:
相关推荐
Objective-C编程之道:IOS设计模式解析.pdf
Objective-C编程之道:iOS 设计模式解析电子书和源代码
Objective-c学习笔记 Objective-c学习笔记
Objective-C语言将决定尽可能的从编译和链接时推迟到运行时。只要有可能,Objective-C总是使用...本文档将具体介绍NSObject类以及Objective-C程序是如何和运行时系统交互的。特别地,本文档还给出来怎样在运行时动态地加
《Objective-C编程之道ios设计模式解析》电子书讲述了ios设计中常用的设计模式,希望可以帮助大家!
资源名称:Objective-C编程之道:iOS设计模式解析 资源截图:资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
Objective-C编程之道:IOS设计模式解析
Objective-C is the universal language of iPhone, iPad, and Mac apps, and Objective-C for Absolute Beginners, Second Edition starts you on the path to mastering this language and its latest release. ...
Objective-C基础教程:1天玩转Objective-C语法
Objective-C 学习笔记 IOS软件开发
Objective-C语言的许多决策可以在编译和运行时执行。只要有可能,它是动态的。这意味着Objective-C语言不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。Runtime系统是一种用于Objective-C语言的操作系统...
最全最新版 Objective-C编程之道IOS设计模式解析.pdf
通过学习Objective-C的基本语法、类和对象、控制流程和方法等内容,你将能够编写简单的Objective-C程序并逐渐掌握更复杂的概念。继续学习和实践,你将能够开发各种类型的应用程序,并为用户提供出色的体验。祝你在...
Objective-C基础教程.pdf(Learn Objective-C on the Mac中文版) 中文扫描版 + 英文电子书 + 源码 该资源在Mac下用BetterZIP压缩,共三个分卷,其他分卷在我的资源中找。 更新: Windows下使用7zip对part1解压...
《objective-c程序设计》通过大量的实例系统地介绍了objective-c语言的基本概念、语法规则、框架、类库及开发环境。读者在阅读《objective-c程序设计》后,可以掌握objective-c语言的基本内容,并进行实际的iphone/...
中文名: Objective-C基础教程 作者: Mark Dalrymple Scott Knaster译者: 高朝勤 杨越 刘霞图书 分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社 书号: ISBN: 9787115208774 发行时间: 2009...
Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition).epub (epub 格式) Want to write iOS apps or desktop Mac applications? This introduction to programming and the Objective-C language is ...
objective语言快速入门的绝佳途径,是视频教程的完整ppt课件,涵盖所有知识点,后出版书目为《iphone与ipad》开发实战的前半部分语言学习!