首页 > 代码库 > OC_语法入门_day1_类的定义

OC_语法入门_day1_类的定义

H:/Objective-C/OC_day0/00-OC经典入门.m
/*================第一段代码(start)========================== = 
#import <Foundation/Foundation.h>
// 1,类的声明
	@interface Car : NSObject
	{	
		// 所有成员变量,默认初始值均为0
		@public
		int wheels;
		int speed;
	}
	// 对象的方法
	// 1,前面固定写减号-
	// 2,不同于函数,小括号()仅用来括住数据类型
	// 3,参数和返回值,都必须用小括号包起来(void)
	- (void)run;
	@end
// 2,类的实现,专门用来实现成员方法
	@implementation Car
	// - (void)run;把声明复制过来,结尾的分号换成一对大括号
	- (void)run
	{
		NSLog(@"I am driving~");
		// 成员方法内直接访问成员变量
		NSLog(@"I have %d个wheels~",wheels);
	}
	@end
	
int main(){
	// 3,执行Car类的new行为,返回new出来的对象地址
	Car *p = [Car new];
	// 4,类似结构体访问,给成员赋值
	p->wheels = 4;
	// 5,打印其成员值
	NSLog(@"车轮个数是:%d",p->wheels);
	// 6,执行行为,OC中对象仅能通过指针访问,
	// 给指针p所指向的对象,发送一条run消息,消息机制
	[p run];
	return 0;
}
================第一段代码(end)========================== = */
/*================第2段代码(start)========================== = 
#import <Foundation/Foundation.h>
// 定义枚举(类型前要有空格),类型为性别
typedef enum{
	SexBoy,SexGirl,SexUnknow
} Sex;
// 定义枚举(类型前要有空格),类型为颜色
typedef enum{
	ColorRed,ColorGreen,ColorBlue
} Color;
// 定义结构体(类型前要有空格),类型为日期时间型
typedef struct{
	int year;
	int month;
	int day;
} Date;
// 定义字符串类型,仿Java
typedef char *String;
// 1,喵类的声明
	@interface Cat : NSObject
	{	
		// 所有成员变量,默认初始值均为0
		@public
		String name;		
		Color furColor;
	}
	// 对象的方法
	// 1,前面固定写减号-
	// 2,不同于函数,小括号()仅用来括住数据类型
	// 3,参数和返回值,都必须用小括号包起来(void)
	- (void)eat;
	@end
// 2,类的实现,专门用来实现成员方法
	@implementation Cat
	// - (void)eat;把声明复制过来,结尾的分号换成一对大括号
	- (void)eat
	{
		// 成员方法内直接访问成员变量
		NSLog(@"喵名:%s,毛色:%d,喵正在吃东西~",name,furColor);
	}
	@end

// 1,人类的声明
	@interface Person : NSObject
	{	
		// 所有成员变量,默认初始值均为0
		@public
		String name;
		Sex sex;
		int age;
		Date birthday;
		Color favouriteColor;
		// 对象的成员变量还是对象,OC任何对象都是指针指过去的~
		Cat *cat;
	}
	// 对象的方法
	// 1,前面固定写减号-
	// 2,不同于函数,小括号()仅用来括住数据类型
	// 3,参数和返回值,都必须用小括号包起来(void)
	- (void)toString;
	- (void)feedCat;
	// 4,带0个参数的方法声明
	- (double)getPI;
	// 5,带1个参数的方法声明,方法名为square:
	- (int)square:(int)a;
	// 6,带2个参数的方法声明,方法名为sumWithA:andB:
	- (int)sumWithA:(int)a andB:(int)b;
	// 7,参数为指向另一个对象的指针
	- (int)compareAgeWithOtherPerson:(Person *)other;
	@end
// 2,类的实现,专门用来实现成员方法
	@implementation Person
	// - (void)toString;把声明复制过来,结尾的分号换成一对大括号
	- (void)toString
	{
		// 成员方法内直接访问成员变量
		NSLog(@"姓名:%s,性别:%d,年龄:%d,生日:%d-%d-%d,喜欢的颜色:%d~",name,sex,age,birthday.year,birthday.month,birthday.day,favouriteColor);
	}
	- (void)feedCat
	{
		// 间接执行成员变量cat的eat行为,完成喂喵操作~
		[cat eat];
	}
	// 4,带0个参数的方法实现
	- (double)getPI
	{
		NSLog(@"%.5f",3.14159);
		return 3.14159;
	}
	// 5,带1个参数的方法实现
	- (int)square:(int)a
	{
		NSLog(@"%d",a*a);
		return a*a;
	}
	
	// 6,带2个参数的方法实现
	- (int)sumWithA:(int)a andB:(int)b
	{
		NSLog(@"%i",a+b);
		return a+b;
	}
	// 7,参数为指向另一个对象的指针
	- (int)compareAgeWithOtherPerson:(Person *)other
	{
		NSLog(@"年龄差距为:%i",age-other->age);
		return age-other->age;
	}
	@end
	
int main(){
	// 3,执行Car类的new行为,返回new出来的对象地址
	Person *p = [Person new];
	// 4,类似结构体访问,给成员赋值
	p->name = "pre_eminent";
	p->sex = SexBoy;
	p->age = 24;
	// 下面是错误的,结构体大括号这种赋值,只有在定义变量的时候才可以,类似的还有数组
	// p->birthday = {1990,6,7};
	Date d = {1990,6,7};
	// 同基本数据类型一样,结构体间可整体赋值(传值)
	p->birthday = d;
	// 指针访问结构体成员用->,结构体变量访问其成员用.
	p->birthday.month = 7;
	p->birthday.day = 6;
	p->favouriteColor = ColorBlue;
	// 6,执行行为,OC中对象仅能通过指针访问,
	// 给指针p所指向的对象,发送一条toString消息,消息机制
	[p toString];
	// 7,为成员变量cat赋值
	Cat *c = [Cat new];
	c->name = "Cafee";
	c->furColor = ColorGreen;
	// 将8个字节长的地址给了成员变量cat指针
	p->cat = c;
	[p feedCat];
	// 9,执行方法示例,参数和参数之前要有空格,1个参数对应1个冒号
	[p getPI];
	[p square:16];
	[p sumWithA:6 andB:7];
	Person *other = [Person new];	
	other->age = 19;
	[p compareAgeWithOtherPerson:other];
	return 0;
}
================第2段代码(end)========================== = */
/*============第3段代码start=======================
#import <Foundation/Foundation.h>
// 定义枚举(类型前要有空格),类型为性别
typedef enum{
	SexBoy,SexGirl,SexUnknow
} Sex;
// 定义枚举(类型前要有空格),类型为颜色
typedef enum{
	ColorRed,ColorGreen,ColorBlue
} Color;
// 定义结构体(类型前要有空格),类型为日期时间型
typedef struct{
	int year;
	int month;
	int day;
} Date;
// 定义字符串类型,仿Java
typedef char *String;
// 1,喵类的声明
	@interface Cat : NSObject
	{	
		// 所有成员变量,默认初始值均为0
		// @public 以后所有成员变量均只通过set和get方法访问,且成员变量以_开头
		String _name;		
		Color _furColor;
	}
	// 类的方法注意事项:
	// 1,+号
	// 2,只能类调用,不能对象调用,因为+_号不同
	// 3,允许类方法与对象方法重名,因为还有+_号可以区分它俩
	// 4,同Java一样,类方法无法访问对象成员变量,因为类加载的时候,对象还没创建,而成员变量仅存在对象内存空间
	// 注:类内存空间只保存方法列表,即类的,对象的~
	+ (void)showClassName;
	// 对象的方法
	// 1,前面固定写减号-
	// 2,不同于函数,小括号()仅用来括住数据类型
	// 3,参数和返回值,都必须用小括号包起来(void)
	- (void)eat;
	// 4,_name的set方法
	- (void)setName:(String)name;
	// 5,_furColor的set方法
	- (void)setFurColor:(Color)furColor;
	// 6,_name的get方法,同Java不同,get方法名就是成员变量名
	- (String)name;
	// 7,_furColor的get方法,同Java不同,get方法名就是成员变量名
	- (Color)furColor;
	@end
// 2,类的实现,专门用来实现成员方法
	@implementation Cat
	// 类的方法实现
	+ (void)showClassName
	{
		NSLog(@"我是喵类");
	}
	// - (void)eat;把声明复制过来,结尾的分号换成一对大括号
	- (void)eat
	{
		// 成员方法内直接访问成员变量
		NSLog(@"喵名:%s,毛色:%d,喵正在吃东西~",_name,_furColor);
	}
	// _name的set方法
	- (void)setName:(String)name
	{
		_name = name;
	}
	// _furColor的set方法
	- (void)setFurColor:(Color)furColor
	{
		_furColor = furColor;
	}
	// _name的get方法
	- (String)name
	{
		return _name;
	}
	// _furColor的get方法
	- (Color)furColor
	{
		return _furColor;
	}
	@end

	
int main(){
	// 类的方法注意事项:
	// 1,+号
	// 2,只能类调用,不能对象调用,因为+_号不同
	// 3,允许类方法与对象方法重名,因为还有+_号可以区分它俩
	// 4,同Java一样,类方法无法访问对象成员变量,因为类加载的时候,对象还没创建,而成员变量仅存在对象内存空间
	// 注:类内存空间只保存方法列表,即类的,对象的~
	[Cat showClassName];

	Cat *c = [Cat new];
	[c setName:"Cafee"];
	[c setFurColor:ColorGreen];
	[c eat];
	NSLog(@"喵大名是:%s---颜色是:%d",[c name],[c furColor]);
	// 1,创建OC字符串方式一
	NSString *url = @"http:// www.baidu.com";
	char *email = "admin@g.fr";
	NSLog(@"url is %@,email is %s",url,email);
	// 2,创建OC字符串方式二,类方法
	NSString *info = [NSString stringWithFormat:@"---url is %@,email is %s",url,email];
	NSLog(@"先写占位符号:%@",info);
	// 3,计算长度,OC中算字数,C语言算字节数
	NSString *str = @"你好中国";
	NSLog(@"%@的长度是:%ld",str,[str length]);
	//NSArray *arr=@[@"beyond1",@"beyond2",@"beyond3"];
	NSArray *arr=[NSArray arrayWithObject:@"beyond"];
	//NSLog(@"%@",[arr ObjectAtIndex:0]);
	return 0;
}
============第3段代码ends===========*/
#import <Foundation/Foundation.h>
// 遍历文件夹下面所有的文件,含子文件夹,输出里面所有的.c文件内容
/*
 path : 文件的全路径(可能是文件夹、也可能是文件)
 返回值 void
 */
void listFiles(NSString *dir)
{
    // 1.获得文件管理者,单例
    NSFileManager *mgr = [NSFileManager defaultManager];    
    // 2.标记是否为文件夹
    BOOL isDir = YES; // 标记是否为文件夹
    // 标记这个路径是否存在
    BOOL exist = [mgr fileExistsAtPath:dir isDirectory:&isDir];    
    // 3.如果不存在,直接返回0
    if(!exist){
        NSLog(@"文件路径不存在!!!!!!%@",dir);
        return ;
    }    
    // 代码能来到着,说明路径存在        
    if (isDir){ // 文件夹
        // 获得当前文件夹path下面的所有内容(文件夹、文件)
        NSArray *array = [mgr contentsOfDirectoryAtPath:dir error:nil];       
        // 遍历数组中的所有子文件(夹)名
        for (NSString *filename in array){
            // 获得子文件(夹)的全路径
            NSString *fullPath = [NSString stringWithFormat:@"%@/%@", dir, filename];
			//关键,继续递归
            listFiles(fullPath);
        }
    }else{ // 文件
        // 判断文件的拓展名(忽略大小写)
        NSString *ext = [[dir pathExtension] lowercaseString];
        if (![ext isEqualToString:@"h"]
            && ![ext isEqualToString:@"m"]
            && ![ext isEqualToString:@"c"])
        {
            // 文件拓展名不是h,而且也不是m,而且也不是c
            return ;
        }
        // 加载文件内容
        NSString *content = [NSString stringWithContentsOfFile:dir encoding:NSUTF8StringEncoding error:nil];
        // 将文件内容切割为每一行
        //NSArray *array = [content componentsSeparatedByString:@"\n"];      
        // 输出文件内容
        NSLog(@"%@",content);
    }
}
int main(){
	NSString *dir=@"H:/PPT03-Objective-C/OC代码";
	listFiles(dir);
	return 0;
}

H:/Objective-C/OC_day1/01-第1个OC程序.m
#include <stdio.h>

// OC程序的入口:main函数
int main()
{
    printf("第1个OC程序\n");
    return 0;
}

H:/Objective-C/OC_day1/02-第2个OC程序.m
/*
 1.#import的用途:
 1> 跟#include一样,拷贝文件的内容
 2> 可以自动防止文件的内容被重复拷贝
 
 2.#import <Foundation/NSObjCRuntime.h>
    NSObjCRuntime.h中有NSLog函数的声明
 
 3.Foundation框架头文件的路径
 1> 右击Xcode.app --> 显示包内容
 2> Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/Foundation.framework
 
 4.主头文件
 1> 主头文件:最主要的头文件,名字一般跟框架名称一样,包含了框架中的所有其他头文件
 2> Foundation框架的主头文件名称就是Foundation.h
 3> 只需要包含Foundation框架主头文件,就可以使用整个框架的东西
 
 
 5.运行过程
 1> 编写OC源文件:.m、.c
 2> 编译:cc -c xxx.m xxx.c
 3> 链接:cc xxx.o xxx.o -framework Foundation
   (只有用到了Foundation框架才需要加上-framework Foundation)
 4> 运行:./a.out
 */

#import <Foundation/Foundation.h>

int main()
{
    // NSLog输出内容会自动换行
    NSLog(@"第2个OC程序!!!");
    
    return 0;
}

H:/Objective-C/OC_day1/05-BOOL类型.m
#import <Foundation/Foundation.h>


BOOL test(BOOL mybool)
{
    return NO;
}

int main()
{
    BOOL b = YES;
    
    BOOL b2 = NO;
    
    BOOL b3 = 1; // YES
    
    BOOL b4 = 0; // NO
    
    
    //NSLog(@"%i", b);
    
    NSLog(@"%d", test(YES));
    return 0;
}

H:/Objective-C/OC_day1/06-类的设计_头脑风暴.m
1.类的设计:
1> 类名
* 类名的第一个字母必须是大写
* 不能有下划线
* 多个英文单词,用驼峰标识
2> 属性
3> 行为(功能)

2.植物大战僵尸的僵尸
* 类名:Zoombie
* 属性:life、speed、gongjili
* 行为:walk、bite、die

3.雷电的飞机
* 类名:Plane
* 属性:life、gongjili、speed、bombCount
* 行为:fly、bomb、shoot、die

4.电脑
* 类名:Computer
* 属性:band、expireDate
* 行为:open、close

H:/Objective-C/OC_day1/07-第1个OC的类.m
/*
 类名:Car
 属性:轮胎个数、时速(速度)
 行为:跑
 */

// 因为使用了NSObject
#import <Foundation/Foundation.h>

// 完整地写一个函数:函数的声明和定义(实现)
// 完整地写一个类:类的声明和实现

// 1.类的声明
// 声明对象的属性、行为
// : NSObject 目的是:让Car这个类具备创建对象的能力
@interface Car : NSObject
{// 用来声明对象属性(实例变量\成员变量,默认会初始化为0)
    // @public可以让外部的指针间接访问对象内部的成员变量
    @public
    int wheels; // 轮胎个数
    int speed; // 时速(xxkm/h)
}

// 方法(行为):方法名、参数、返回值(声明、实现)
// 只要是OC对象的方法,必须以减号 - 开头
// OC方法中任何数据类型都必须用小括号()扩住
// OC方法中的小括号():括住数据类型
- (void)run;

@end

// 2.类的实现
// 用来实现@inteface中声明的方法
@implementation Car
// 方法的实现(说清楚方法里面有什么代码)

- (void)run
{
    NSLog(@"车子跑起来了");
}

@end

int main()
{
    // 在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称]
    // 利用类来创建对象
    // 执行了Car这个类的new行为来创建新对象
    
    // 定义了一个指针变量p,p将来指向的是Car类型的对象
    // [Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)
    Car *p = [Car new];
    
    
    Car *p2 = [Car new];
    p2->wheels = 5;
    p2->speed = 300;
    [p2 run];
    
    // 给p所指向对象的wheels属性赋值
    p->wheels = 4;
    p->speed = 250;
    
    // 给p所指向对象发送一条run消息
    [p run];
    
    NSLog(@"车子有%d个轮子,时速位:%dkm/h", p->wheels, p2->speed);
    
    return 0;
}

H:/Objective-C/OC_day1/08-第2个OC的类.m
/*
 人
 类名:Person
 属性(成员变量\实例变量):体重、年龄
 行为(方法):走路、吃
 */
#import <Foundation/Foundation.h>
/*
 1.类的声明
    * 成员变量
    * 方法的声明
 */
@interface Person : NSObject
{
    @public
    int age;
    double weight;
}

- (void)walk;
- (void)eat;

@end


// 2.类的实现
@implementation Person

// 实现@interface中声明的方法
- (void)walk
{
    NSLog(@"%d岁、%f公斤的人走了一段路", age, weight);
}

- (void)eat
{
    NSLog(@"%d岁、%f公斤的人在吃东西", age, weight);
}

@end

int main()
{
    // 在使用类创建对象之前,会将类加载进内存
    Person *p = [Person new];
    p->age = 20;
    p->weight = 40;
    
    [p eat];
    [p walk];
    
    Person *p2 = [Person new];
    p2->age = 30;
    p2->weight = 60;
    [p2 eat];
    [p2 walk];
    
    /*
    Person *p2 = [Person new];
    p2->age = 30;
    p2->weight = 50;
    
    p = p2;
    
    p->age = 40;
    
    [p2 walk];
    */
    
    /*
    Person *p = [Person new];
    p->age = 20;
    
    Person *p2 = [Person new];
    p2->weight = 50.0;
    
    [p walk];
     */
     
    /*
    Person *p = [Person new];
    p->age = 20;
    p->weight = 50.0;
    [p walk];
    
    Person *p2 = [Person new];
    p2->age = 30;
    p2->weight = 60.0;
    [p2 walk];
    */
    return 0;
}

H:/Objective-C/OC_day1/09-OC对象跟函数.m
#import <Foundation/Foundation.h>

@interface Car : NSObject
{// 成员变量
    @public
    int wheels;
    int speed;
}

- (void)run;
@end

@implementation Car
- (void)run
{
    NSLog(@"%d个轮子,速度为%dkm/h的车子跑起来", wheels, speed);
}
@end


void test(int w, int s)
{
    w = 20;
    s = 200;
}

void test1(Car *newC)
{
    newC->wheels = 5;
}

void test2(Car *newC)
{
    Car *c2 = [Car new];
    c2->wheels = 5;
    c2->speed = 300;
    
    newC = c2;
    newC->wheels = 6;
}

int main()
{
    Car *c = [Car new];
    c->wheels = 4;
    c->speed = 250;
    
    //test(c->wheels, c->speed);
    //test1(c);
    test2(c);
    
    [c run];
    
    return 0;
}

H:/Objective-C/OC_day1/10-方法和函数_常见错误.m
/*
 方法
 1.对象方法都是以减号 - 
 2.对象方法的声明必须写在@interface和@end之间
   对象方法的实现必须写在@implementation和@end之间
 3.对象方法只能由对象来调用
 4.对象方法归类\对象所有
 
 函数
 1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
 2.函数调用不依赖于对象
 3.函数内部不能直接通过成员变量名访问某个对象的成员变量
 
 */

#import <Foundation/Foundation.h>

@interface Person : NSObject
@end

@implementation Person
@end

@interface Car : NSObject
{// 成员变量\实例变量
    //int wheels = 4; 不允许在这里初始化
    //static int wheels; 不能随便将成员变量当做C语言中的变量来使用
    @public
    int wheels;
}

- (void)run;
- (void)fly;
@end

int main()
{
    // wheels = 10;
    /*
    Car *c = [Car new];
    c->wheels = 4;
    //run();
    
    [c run];
    */
    
    void test2();
    
    test2();
    
    return 0;
}

@implementation Car

- (void) fly
{
    
}

/*
void test2()
{
    NSLog(@"调用了test2函数-%d", wheels);
}*/

void test()
{
    NSLog(@"调用了test函数");
}

- (void)run
{
    test();
    NSLog(@"%d个轮子的车跑起来了", wheels);
}
@end

H:/Objective-C/OC_day1/11-类的合理设计.m
#import <Foundation/Foundation.h>

typedef enum {
    SexMan,
    SexWoman
} Sex;

typedef struct {
    int year;
    int month;
    int day;
} Date;


typedef enum {
    ColorBlack,
    ColorRed,
    ColorGreen
} Color;

@interface Dog : NSObject
{
    @public
    double weight; // 体重
    Color curColor; // 毛色
}

- (void)eat;
- (void)run;
@end

@implementation Dog
- (void)eat
{
    // 每吃一次,体重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"狗吃完这次后的体重是%f", weight);
}

- (void)run
{
    weight -= 1;
    NSLog(@"狗跑完这次后的体重是%f", weight);
}
@end

/*
学生
成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色,吃、跑)
方法:吃、跑步、遛狗(让狗跑)、喂狗(让狗吃)
*/
@interface Student : NSObject
{
    @public
    Sex sex; // 性别
    Date birthday; // 生日
    double weight; // 体重(kg)
    Color favColor; // 最喜欢的颜色
    char *name;
    
    // 重点:狗
    Dog *dog;
}
- (void)eat;
- (void)run;
- (void)print;

- (void)liuDog;
- (void)weiDog;
@end

@implementation Student

- (void)liuDog
{
    // 让狗跑起来(调用狗的run方法)
    [dog run];
}

- (void)weiDog
{
    // 让狗吃东西(调用狗的eat方法)
    [dog eat];
}

- (void)print
{
    NSLog(@"性别=%d, 喜欢的颜色=%d, 姓名=%s, 生日=%d-%d-%d", sex, favColor, name, birthday.year, birthday.month, birthday.day);
}

- (void)eat
{
    // 每吃一次,体重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"学生吃完这次后的体重是%f", weight);
}

- (void)run
{
    weight -= 1;
    NSLog(@"学生跑完这次后的体重是%f", weight);
}
@end

int main()
{
    Student *s = [Student new];
    
    Dog *d = [Dog new];
    d->curColor = ColorGreen;
    d->weight = 20;
    s->dog = d;
    
    
    [s liuDog];
    
    [s weiDog];
    return 0;
}


void test()
{
    Student *s = [Student new];
    s->weight = 50;
    
    // 性别
    s->sex = SexMan;
    
    // 生日
    Date d = {2011, 9, 10};
    s->birthday = d;
    
    s->name = "Jack";
    
    /*
     s->birthday.year = 2011;
     s->birthday.month = 9;
     s->birthday.day = 10;
     */
    
    // 喜欢的颜色
    s->favColor = ColorBlack;
    /*
     [s eat];
     [s eat];
     
     [s run];
     [s run];
     */
    
    [s print];
}


H:/Objective-C/OC_day1/12-方法的声明和实现.m
#import <Foundation/Foundation.h>

/*
计算器类
 方法:
 1> 返回 π 
 2> 计算某个整数的平方
 3> 计算两个整数的和
*/

@interface JiSuanQi : NSObject

// 方法名:pi
- (double)pi;

// OC方法中,一个参数对应一个冒号
// 方法名:pingFang:(冒号也是方法名的一部分)
- (int)pingFang:(int)num;

//- (int)sum:(int)num1 :(int)num2;
// 方法名:sumWithNum1:andNum2:
- (int)sumWithNum1:(int)num1 andNum2:(int)num2;


//- (int)sumWithNum1:(int)num1 andNum2:(int)num2 andNum3:(int)num3;
@end

@implementation JiSuanQi

- (double)pi
{
    return 3.14;
}

- (int)pingFang:(int)num
{
    return num * num;
}

//- (int)sum:(int)num1 :(int)num2
- (int)sumWithNum1:(int)num1 andNum2:(int)num2
{
    return num1 + num2;
}
@end

int main()
{
    JiSuanQi *jsq = [JiSuanQi new];
    
    
    int a = [jsq sumWithNum1:20 andNum2:5];
    //int a = [jsq sum:10 :5];
    
    //int a =  [jsq pingFang:10];
    
    //double a = [jsq pi];
    NSLog(@"%i", a);
    
    return 0;
}

H:/Objective-C/OC_day1/13-练习.m
/*
设计一个方法,用来和其他车比较车速,返回车速的差距
 */

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    @public
    int speed;
}

- (int)compareSpeedWithOther:(Car *)other;

@end

@implementation Car

- (int)compareSpeedWithOther:(Car *)other
{
    // speed
    // other->speed
    // 返回当前这辆车和other这辆车的速度差距
    return speed - other->speed;
}

@end

int main()
{
    Car *c1 = [Car new];
    c1->speed = 300;
    
    Car *c2 = [Car new];
    c2->speed = 250;
    
    int a = [c1 compareSpeedWithOther:c2];
    
    NSLog(@"a=%d", a);
    
    return 0;
}

H:/Objective-C/OC_day1/14-匿名对象.m
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
    @public
    int speed;
}
- (void)run;
@end

@implementation Car

- (void)run
{
    NSLog(@"速度为%d的车子跑起来了", speed);
}

@end


int main()
{
    /*
    Car *c;
    c = [Car new];
    c->speed = 250;
    
    [c run];*/
    
    // 不要写类似匿名对象这样的代码
    // 只要求能说出输出结果
    [Car new]->speed = 300;
    
    [[Car new] run];
    
    //Car *c = [Car new];
    
    return 0;
}

H:/Objective-C/OC_day1/15-01-改错题-答案.m
第1题:类的声明和定义、对象的创建
//#import <Foundation.h>  前面要加上框架名称"Foundation/"
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    // @public能让外面的指针访问对象内部的成员变量
    @public
    int age;
    // 成员变量不能在类声明中进行初始化
    //double height = 1.55;
    double height;
    
    // 方法的声明不能写在{}中
    // - (void)study;
}
- (void)study;
// 每个@interface都必须和一个@end配对
@end

@implementation Person
- (void)study
{
    NSLog(@"年龄为%d的人在学习", age);
}
@end

int main()
{
    // 要利用指针变量来指向对象
    //Person p = [Person new];
    Person *p = [Person new];
    p->age = 10;
    p->height = 1.78f;
    [p study];
    return 0;
}
// 5处错误

第2题:方法的声明和实现
#import <Foundation/Foundation.h>
@interface Test : NSObject
// 一个参数对应一个冒号
//- (int)addNum1(int)num1 andNum2(int)num2;
- (int)addNum1:(int)num1 andNum2:(int)num2;

// 没有参数就不需要冒号
//- (double)pi:;
- (double)pi;

// 小括号()在方法中只用来括住具体类型
//- (void)test();
- (void)test;
@end

@implementation Test
//- (int)addNum1(int)num1 andNum2(int)num2()
- (int)addNum1:(int)num1 andNum2:(int)num2
{
    return num1 + num2;
}

//- (double)pi:
- (double)pi
{
    return 3.14;
}

//- (void)test()
- (void)test
{
    
}
@end

int main()
{
    return 0;
}

// 6处错误


第3题:方法和函数的区别
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
    @public
    int wheels;
}

- (void)run;
- (void)test;
@end

@implementation Car
- (void)test
{
    NSLog(@"测试一下车子:%i", wheels);
}

// OC方法的实现跟函数是不一样的
// void run()
- (void)run
{
    NSLog(@"%i个轮子的车跑起来了", wheels);
}
@end

// 方法不能独立于类存在,类外面只能定义函数
//- (void)haha
void haha()
{
    NSLog(@"调用了haha");
}

int main()
{
    Car *c = [Car new];
    [c run];
    [c test];
    
    // OC方法不能当做函数来调用,需要用对象来调用
    // test();
    haha();
    return 0;
}
// 3处错误

H:/Objective-C/OC_day1/15-02-分析题-答案-.m
第1题:对象的操作、对象作为函数参数
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    @public
    int age;
    double height;
}
- (void)print;
@end

void test1(int newAge, double newHeight);
void test2(Person *newP);
void test3(Person *newP);
void test4(Person *newP);

int main()
{
    Person *p = [Person new];
    p->age = 10;
    p->height = 1.5f;
    
    test1(p->age, p->height);
    [p print];
    
    test2(p);
    [p print];
    
    test3(p);
    [p print];
    
    test4(p);
    [p print];
    
    return 0;
}

@implementation Person
- (void)print
{
    NSLog(@"年龄=%d,身高=%f", age, height);
}
@end

void test1(int newAge, double newHeight)
{
    newAge = 10;
    newHeight = 1.6;
}

void test2(Person *newP)
{
    newP->age = 20;
    newP->height = 1.7;
}

void test3(Person *newP)
{
    Person *p2 = [Person new];
    p2->age = 40;
    p2->height = 1.8;
    newP = p2;
    
    newP->age = 30;
}

void test4(Person *newP)
{
    Person *p2 = newP;
    p2->age = 50;
    p2->height = 1.9;
    newP->age = 60;
}
====================================================
第1题:对象的操作、对象作为函数参数
年龄=10,身高=1.500000
年龄=20,身高=1.700000
年龄=20,身高=1.700000
年龄=60,身高=1.900000
====================================================

第2题:匿名对象
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    @public
    int age;
    double height;
}
- (void)print;
@end

@implementation Person
- (void)print
{
    NSLog(@"年龄=%d,身高=%f", age, height);
}
@end

int main()
{
    [Person new]->age = 10;
    [Person new]->height = 1.8;
    [[Person new] print];
    return 0;
}

=======================================
第2题:匿名对象
年龄=0,身高=0.000000
=======================================

H:/Objective-C/OC_day1/15-03-类的设计-Dog.m
/*
 设计一个”狗“类
 1> 属性
 * 颜色
 * 速度(单位是m/s)
 * 性别
 * 体重(单位是kg)
 
 2> 行为
 * 吃:每吃一次,体重增加0.5kg,输出吃完后的体重
 * 吠(叫):输出所有的属性
 * 跑:每跑一次,体重减少0.5kg,输出速度和跑完后的体重
 * 比较颜色:跟别的狗比较颜色,如果一样,返回YES,不一样,返回NO
 * 比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度)
*/

#import <Foundation/Foundation.h>

// 颜色
typedef enum {
    ColorBlack,
    ColorGreen,
    ColorBlue,
    ColoeRed
} Color;

// 性别
typedef enum {
    SexMan,
    SexWoman,
    SecUnknow
} Sex;

@interface Dog : NSObject
{
    @public
    Color color; // 颜色
    int speed; // 速度
    Sex sex; // 性别
    double weight; // 体重
}

- (void)eat; // 吃
- (void)bark; // 吠
- (void)run; // 跑
- (BOOL)isSameColorWithOther:(Dog *)other; // 比较是否为相同颜色
- (int)compareSpeedWithOther:(Dog *)other; // 比较速度差
@end

@implementation Dog
- (void)eat // 吃
{
    weight += 0.5;
    NSLog(@"狗吃完后的体重是%f公斤", weight);
}
- (void)bark // 吠
{
    NSLog(@"狗的颜色是%d,速度为%dkm/h,性别是%d,体重是%f公斤", color, speed, sex, weight);
}
- (void)run // 跑
{
    weight -= 0.5;
    NSLog(@"狗跑完后的体重是%f公斤", weight);
}
- (BOOL)isSameColorWithOther:(Dog *)other // 比较是否为相同颜色
{
    return color == other->color;
}
- (int)compareSpeedWithOther:(Dog *)other // 比较速度差
{
    return speed - other->speed;
}
@end

H:/Objective-C/OC_day1/15-04-类的设计-Person.m
/*
 2.结合前面的“狗”类,设计一个“人”类
 1> 属性
 * 姓名
 * 狗(养了一条狗)
 
 2> 行为
 * 喂狗:每喂一次,狗就会执行“吃”这个行为
 * 遛狗:每溜一次,狗就会执行“跑”这个行为
*/
#import <Foundation/Foundation.h>

// 颜色
typedef enum {
    ColorBlack,
    ColorGreen,
    ColorBlue,
    ColoeRed
} Color;

// 性别
typedef enum {
    SexMan,
    SexWoman,
    SecUnknow
} Sex;

/*********************狗********************/
@interface Dog : NSObject
{
@public
    Color color; // 颜色
    int speed; // 速度
    Sex sex; // 性别
    double weight; // 体重
}

- (void)eat; // 吃
- (void)bark; // 吠
- (void)run; // 跑
- (BOOL)isSameColorWithOther:(Dog *)other; // 比较是否为相同颜色
- (int)compareSpeedWithOther:(Dog *)other; // 比较速度差
@end

@implementation Dog
- (void)eat // 吃
{
    weight += 0.5;
    NSLog(@"狗吃完后的体重是%f公斤", weight);
}
- (void)bark // 吠
{
    NSLog(@"狗的颜色是%d,速度为%dkm/h,性别是%d,体重是%f公斤", color, speed, sex, weight);
}
- (void)run // 跑
{
    weight -= 0.5;
    NSLog(@"狗跑完后的体重是%f公斤", weight);
}
- (BOOL)isSameColorWithOther:(Dog *)other // 比较是否为相同颜色
{
    return color == other->color;
}
- (int)compareSpeedWithOther:(Dog *)other // 比较速度差
{
    return speed - other->speed;
}
@end

/*********************人********************/
@interface Person : NSObject
{
    @public
    char *name; // 姓名
    Dog *dog; // 狗
}
- (void)walkDog; // 遛狗
- (void)feedDog; // 喂狗
@end

@implementation Person
- (void)walkDog // 遛狗
{
    [dog run];
}
- (void)feedDog // 喂狗
{
    [dog eat];
}
@end

H:/Objective-C/OC_day1/15-05-类的设计-Studeng类1.m
/*
 3.设计一个”学生“类
 1> 属性
 * 姓名
 * 生日
 * 年龄
 * 身高(单位是m)
 * 体重(单位是kg)
 * 性别
 * C语言成绩
 * OC成绩
 * iOS成绩
 
 2> 行为
 * 跑步:每跑步一次,身高增加1cm,体重减小0.5kg,输出跑完后的体重
 * 吃饭:每吃一次,身高增加1cm,体重增加0.5kg,输出吃完后的体重
 * 学习:每学习一次,3可成绩各加1分,输出学习完后的3科成绩
 * 睡觉:输出所有的属性
 * 比较C语言成绩:跟另外一个学生比较C语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
 * 比较OC成绩:跟另外一个学生比较OC语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
 * 比较iOS成绩:跟另外一个学生比较iOS语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
 * 计算总分:算出3科成绩的总分
 * 计算平均分:算出3科成绩的平均分
*/

#import <Foundation/Foundation.h>
// 颜色
typedef struct {
    int year;
    int month;
    int day;
} Date;

// 性别
typedef enum {
    SexMan,
    SexWoman,
    SecUnknow
} Sex;

@interface Student : NSObject
{
    @public
    char *name; // 姓名
    Date birthday; // 生日
    int age; // 年龄
    double height; // 身高
    double weight; // 体重
    Sex sex; // 性别
    int cScore; // C语言成绩
    int ocScore; // OC成绩
    int iosScore; // iOS成绩
}

- (void)run; // 跑
- (void)eat; // 吃
- (void)study; // 学习
- (void)sleep; // 睡觉
- (int)compareCScoreWithOther:(Student *)other; // 比较C成绩
- (int)compareOcScoreWithOther:(Student *)other; // 比较OC成绩
- (int)compareIosScoreWithOther:(Student *)other; // 比较iOS成绩
- (int)totalScore; // 总分
- (int)averageScore; // 平均分
@end

@implementation Student
- (void)run // 跑
{
    height += 0.01;
    weight -= 0.5;
    NSLog(@"学生跑完后的体重是%f公斤", weight);
}
- (void)eat // 吃
{
    height += 0.01;
    weight += 0.5;
    NSLog(@"学生吃完后的体重是%f公斤", weight);
}
- (void)study // 学习
{
    cScore += 1;
    ocScore += 1;
    iosScore += 1;
}
- (void)sleep // 睡觉
{
    NSLog(@"姓名=%s,身高=%f米,体重=%f公斤,生日=%d-%d-%d,年龄=%d岁,性别=%d,C成绩=%d,OC成绩=%d,iOS成绩=%d", name, height, weight, birthday.year, birthday.month, birthday.day, age, sex,
          cScore, ocScore, iosScore);
}
- (int)compareCScoreWithOther:(Student *)other // 比较C成绩
{
    return cScore - other->cScore;
}
- (int)compareOcScoreWithOther:(Student *)other // 比较OC成绩
{
    return ocScore - other->ocScore;
}
- (int)compareIosScoreWithOther:(Student *)other // 比较iOS成绩
{
    return iosScore - other->iosScore;
}
- (int)totalScore // 总分
{
    return cScore + ocScore + iosScore;
}
- (int)averageScore // 平均分
{
    return (cScore + ocScore + iosScore) / 3;
}
@end

H:/Objective-C/OC_day1/15-06-类的设计-成绩类.m
/*
 4.设计一个成绩类
 1> 属性
 * C语言成绩
 * OC成绩
 * iOS成绩
 
 2> 行为
 * 比较C语言成绩:跟另外一个成绩对象比较C语言成绩,返回成绩差(自己 - 其他成绩)
 * 比较OC成绩:跟另外一个成绩对象比较OC语言成绩,返回成绩差(自己 - 其他成绩)
 * 比较iOS成绩:跟另外一个成绩对象比较iOS语言成绩,返回成绩差(自己 - 其他成绩)
 * 计算总分:算出3科成绩的总分
 * 计算平均分:算出3科成绩的平均分
*/

#import <Foundation/Foundation.h>

@interface Score : NSObject
{
    @public
    int cScore; // C语言成绩
    int ocScore; // OC成绩
    int iosScore; // iOS成绩
}

- (int)compareCScoreWithOther:(Score *)other; // 比较C成绩
- (int)compareOcScoreWithOther:(Score *)other; // 比较OC成绩
- (int)compareIosScoreWithOther:(Score *)other; // 比较iOS成绩
- (int)totalScore; // 总分
- (int)averageScore; // 平均分
@end

@implementation Score
- (int)compareCScoreWithOther:(Score *)other // 比较C成绩
{
    return cScore - other->cScore;
}
- (int)compareOcScoreWithOther:(Score *)other // 比较OC成绩
{
    return ocScore - other->ocScore;
}
- (int)compareIosScoreWithOther:(Score *)other // 比较iOS成绩
{
    return iosScore - other->iosScore;
}
- (int)totalScore // 总分
{
    return cScore + ocScore + iosScore;
}
- (int)averageScore // 平均分
{
    return (cScore + ocScore + iosScore) / 3;
}
@end

H:/Objective-C/OC_day1/15-07-类的设计-Student类2.m
/*
 5.利用前面的成绩类,重新设计一个学生类
 1> 属性
 * 姓名
 * 学号
 * 成绩(包括3科成绩)
 
 2> 行为
 * 比较C语言成绩:跟另外一个学生比较C语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
 * 比较OC成绩:跟另外一个学生比较OC语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
 * 比较iOS成绩:跟另外一个学生比较iOS语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
 * 比较总分:跟另外一个学生比较总分,返回成绩差(自己的成绩 - 其他人的成绩)
 * 比较平均分:跟另外一个学生比较平均分,返回成绩差(自己的成绩 - 其他人的成绩)
*/

#import <Foundation/Foundation.h>
/****************成绩******************/
@interface Score : NSObject
{
    @public
    int cScore; // C语言成绩
    int ocScore; // OC成绩
    int iosScore; // iOS成绩
}

- (int)compareCScoreWithOther:(Score *)other; // 比较C成绩
- (int)compareOcScoreWithOther:(Score *)other; // 比较OC成绩
- (int)compareIosScoreWithOther:(Score *)other; // 比较iOS成绩
- (int)totalScore; // 总分
- (int)averageScore; // 平均分
@end

@implementation Score
- (int)compareCScoreWithOther:(Score *)other // 比较C成绩
{
    return cScore - other->cScore;
}
- (int)compareOcScoreWithOther:(Score *)other // 比较OC成绩
{
    return ocScore - other->ocScore;
}
- (int)compareIosScoreWithOther:(Score *)other // 比较iOS成绩
{
    return iosScore - other->iosScore;
}
- (int)totalScore // 总分
{
    return cScore + ocScore + iosScore;
}
- (int)averageScore // 平均分
{
    return (cScore + ocScore + iosScore) / 3;
}
@end

/********************学生********************/
@interface Student : NSObject
{
    @public
    char *name; // 姓名
    int no; // 学号
    Score *score; // 成绩
}

- (int)compareCScoreWithOther:(Student *)other; // 比较C成绩
- (int)compareOcScoreWithOther:(Student *)other; // 比较OC成绩
- (int)compareIosScoreWithOther:(Student *)other; // 比较iOS成绩
- (int)compareTotalScoreWithOther:(Student *)other; // 比较总成绩
- (int)compareAverageScoreWithOther:(Student *)other; // 比较平均成绩
@end

@implementation Student
- (int)compareCScoreWithOther:(Student *)other // 比较C成绩
{
    return [score compareCScoreWithOther:other->score];
}
- (int)compareOcScoreWithOther:(Student *)other // 比较OC成绩
{
    return [score compareOcScoreWithOther:other->score];
}
- (int)compareIosScoreWithOther:(Student *)other // 比较iOS成绩
{
    return [score compareIosScoreWithOther:other->score];
}
- (int)compareTotalScoreWithOther:(Student *)other // 比较总成绩
{
    return [score totalScore] - [other->score totalScore];
}
- (int)compareAverageScoreWithOther:(Student *)other // 比较平均成绩
{
    return [score averageScore] - [other->score averageScore];
}
@end