接上文
我们继续来扩展分数类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
分享到:
相关推荐
1. **Objective-C是C的超集**:Objective-C在C语言的基础上增加了面向对象的特性,如类、继承、多态等。它允许程序员通过消息传递来调用对象的方法,而不是像C那样直接调用函数。 2. **消息传递**:在Objective-C中...
这篇“Objective-C学习笔记”旨在帮助初学者理解并掌握这种强大的编程工具。 一、Objective-C基础 1. 类与对象:Objective-C中的所有操作都是基于类的,类是对象的模板,而对象是类的实例。理解类和对象的概念是...
根据给定的学习笔记,我们将从以下几个方面深入探讨Objective-C的基础语法: 1. **基本概念介绍**:包括类、对象、方法等基本概念。 2. **Objective-C核心类型**:如`NSString`、`NSArray`、`NSDictionary`。 3. **...
在Objective-C中,类的定义通常包含`@interface`,`@implementation`,以及可能的`@property`和`@protocol`等关键字。`@property`用于声明属性,而方法的定义则包含`-`(实例方法)或`+`(类方法)符号,以及方法的...
这篇笔记主要介绍了Objective-C的一些基础知识,包括以下几个方面: 1. Objective-C概述,介绍了Objective-C的来源、发展历史和作为面向对象的C语言的特点。 2. 第一个OC程序,讲解了如何创建一个OC项目,解释了一些OC...
这份“Objective-C学习资料”包含了内置的学习笔记和各内容源码,是作者在近两个月的学习过程中整理出来的成果,旨在为初学者提供有价值的指导。 首先,让我们深入了解一下Objective-C的基本概念。Objective-C是在...
Objective-C中定义一个类通常包括两个文件:头文件(`.h`)和实现文件(`.m`)。头文件包含了类的接口声明,而实现文件包含了类的方法实现。 - **头文件**:定义了类的公共接口,其他类可以通过这个接口来访问这个...
Objective-C是一种面向对象的编程语言,它在C语言的基础上增加了SmallTalk-80的特性,主要应用于Apple的iOS和macOS平台。Objective-C中的UIKit框架是构建用户界面的基础,提供了丰富的控件和功能来创建iOS应用程序。...
- **函数定义**:在Objective-C中,函数可以被定义为非成员函数或类的方法。 - **方法调用**:Objective-C采用消息传递的方式调用方法,例如`[object methodName]`。 #### 三、面向对象编程(OOP)特性 ##### 3.1 类...
4. 学习笔记:博主或其他学习者的总结和心得,有助于理解和记忆。 总之,掌握Objective-C是成为Mac和iOS开发者的基石。通过这个入门资源包,你可以系统地学习Objective-C,逐步建立起面向对象编程的思维,并熟悉...
Objective-C是一种简单的...Objective-C通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的ANSI C语言。类的语法和设计主要是基于Smalltalk,最早的面向对象编程语言之一。
**Object-C 学习笔记** Objective-C(简称Obj-C或Objective C)是苹果公司基于C语言开发的一种面向对象编程语言,主要用于iOS和macOS平台的应用程序开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,...
Objective-C是在C语言的基础上扩展的,增加了Smalltalk式的面向对象特性,使得它在编写复杂应用程序时具有更高的灵活性和可扩展性。 Objective-C的核心概念主要包括类、对象、消息传递和协议。以下是对这些概念的...
在学习Objective-C的同时,了解Cocoa Touch框架和UIKit非常重要,它们提供了大量用于构建iOS应用的类和工具。例如,`UIViewController`是所有视图控制器的基类,`UIView`负责显示界面元素,`UILabel`、`UIButton`等...
这篇学习笔记主要涉及了Objective-C的基础知识,包括对象创建、类的结构、文件导入、实例变量、接口与实现、内存管理和属性。 1. **对象创建**: - `string`方法创建的字符串对象是自动释放的,意味着系统会在适当...
- **头文件(.h)**:在 Objective-C 中,类定义以 `@interface` 开始,以 `@end` 结束,类似 C++ 的 `class` 关键字。例如,`Fraction` 类在头文件中声明了 `numerator` 和 `denominator` 两个成员变量,以及相关...
Objective-C 是苹果平台下开发 iOS 和 macOS 应用的主要编程语言之一,虽然 Swift 已经成为新宠,但Objective-C 的重要性仍然不可忽视,尤其是因为许多现有的类库和框架仍由 Objective-C 编写。以下是一份关于...
在学习Objective-C的过程中,掌握类的定义和对象的创建是基础,理解消息传递机制是关键。Objective-C的语法中,方法调用是通过发送消息的方式实现的,如`[receiver message]`,这与C++或Java的直接方法调用有所不同...