Objective-C学习笔记八:类的定义二

[url=http://sarin.iteye.com/blog/1761576]接上文[/url]
我们继续来扩展分数类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;
}

编译运行,我们得到如下结果:

[img]http://dl.iteye.com/upload/attachment/0078/8848/4ae23d21-04e0-30e1-807f-23fc3322a8a0.png[/img]

当然这里我们没有对分数进行化简。
当有方法定义的时候,就会涉及到局部变量的概念。在方法内部定义的变量就是局部变量,局部变量没有初始值,需要人为进行赋值操作。这些变量的作用域就是这个方法调用的生命周期,当方法返回结果后,本次局部变量就都消失了。也就是每次方法调用时,重新生成局部变量,赋值,使用,返回结果后它们就消失了。我们继续来编写分数化简的方法,其中使用到了局部变量,代码如下:

#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;
}

编译运行后,我们就得到如下的结果了:

[img]http://dl.iteye.com/upload/attachment/0078/8850/3c1dd9f5-7247-3198-a846-c2943527fd75.png[/img]

扩展我们说过的局部变量的含义,方法的参数也是局部变量,比如对于方法[b]-(double) add: (double) x[/b],那么调用这个方法时可以是这样的[b][data add: val][/b]。在方法中我们使用的是x变量,而传入的是val变量,val变量赋值给x后,val本身没有变化,而作为局部变量的x发生的所有变化都与val无关。
而上面我们传入对象参数时,则可以在方法中修改其实例变量的值,这是因为我们传递的是数据存储的引用位置,所以才能在方法中修改其中的值。
关键字static可以修饰变量,当static修饰局部变量时,那么这个值可以保存多次调用该方法所得到的值。而且它会在程序开始执行时初始化一次,因此需要对其先赋好值。如果static修饰的不是局部变量,那么所有的方法就都可以访问它们了。
对于分数化简的方法,我们继续探究。如何在add方法内调用reduce方法,那么在主函数中就不必再次调用该方法,而且分数做完加法后自动完成化简也是更佳的做法。那么问题就是如何在一个方法内调用本类定义的其它方法,关键字self就是完成这个功能的。self关键字用来指明对象是该方法的调用者,比如[b][self reduce][/b]。上述方法就可以改为:

-(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;
}

编译运行后,我们得到如下结果:

[img]http://dl.iteye.com/upload/attachment/0078/8852/0c1eea13-d347-3056-b084-19b09949f1cb.png[/img]

到目前为止,我们已经编写了一个功能相对完整的类Fraction,对于此时的头文件,完全可以作为我们处理分数的方法库,并且可以将我们编写的程序提供给他人使用。如果要添加新的方法而不修改已有方法,可以通过定义扩展类来实现该目的。
[url=http://sarin.iteye.com/blog/1768779]接下文[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告型管理页面显示所有公告型,在此页面既可以让管理员添加新的公告信息型,也能对已有的公告型信息执行编辑更新,失效的公告型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品型管理页面,此页面提供给管理员的功能有:新增药品型,修改药品型,删除药品型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值