实验目的
- 学习掌握Objective-C语法,掌握基础字符串操作。
- OO知识——多态与继承
实验内容
给定三个用户张三,李四,王五。
给定四种语言英语、日语、德语、西班牙语。
实现场景输出(log形式即可):随机选择一个用户和一种语言学习,从当前日期开始,随机产生时间进行学习,输出学习进度直至学习完毕。每个语言共8个tour,每个tour共4个unit,每次学习一个unit。
要求:
- 随机选定人名、语言后,一次性输出所有的结果。
- 随机时间指的是每次随机1-5天,每次学习时间在前一次的基础上加上刚刚随机出的天数。
- 需要用到多态。
输出例子: 张三 某年某月某日 学习日语 tour 1 unit 1。
代码
定义类Person,声明一个方法getName,并根据不同人的名称进行多态实现:
// Person.h
@interface Person : NSObject {
}
-(NSString *) getName;
@end
@interface S1 : Person {
}
@end
@interface S2 : Person {
}
@end
@interface S3 : Person {
}
@end
// Person.m
#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
- (NSString *)getName{
return @"";
}
@end
@implementation S1
- (NSString *)getName{
return @"张三";
}
@end
@implementation S2
- (NSString *)getName{
return @"李四";
}
@end
@implementation S3
- (NSString *)getName{
return @"王五";
}
@end
定义类Language:
- 每个语言共8个tour,每个tour共4个unit(成员变量)
- 包含:
- 每次学习1个unit的方法learnOneUnit;
- 获取tour和unit的方法getTour / getUnit;
- 判断当前语言是否全部学习完毕的方法isFinish;
- 获取语言名称的方法getName。
// Language.h
@interface Language : NSObject {
NSInteger tour;
NSInteger unit;
}
-(void) learnOneUnit;
-(NSInteger) getTour;
-(NSInteger) getUnit;
-(bool) isFinish;
-(NSString *) getName;
@end
@interface English : Language{
}
@end
@interface Japanese : Language{
}
@end
@interface German : Language{
}
@end
@interface Spanish : Language{
}
@end
// Language.m
#import <Foundation/Foundation.h>
#import "Language.h"
// 对于每一个tour,依次学习5个单元
@implementation Language
-(void) learnOneUnit{
unit++;
if(unit == 5) {
unit = 1;
tour ++;
}
}
-(NSInteger) getTour {
return tour;
}
-(NSInteger) getUnit {
return unit;
}
// 当tour=8时,表示当前语言学习完毕
-(bool) isFinish {
if(tour == 8) return YES;
return NO;
}
-(NSString *) getName{
return @"";
}
@end
@implementation English
-(NSString *) getName{
return @"英语";
}
@end
@implementation Japanese
-(NSString *) getName{
return @"日语";
}
@end
@implementation German
-(NSString *) getName{
return @"德语";
}
@end
@implementation Spanish
-(NSString *) getName{
return @"西班牙语";
}
@end
主函数:
- 计算学习日期
- 随机选择一个人和一门语言,从当前时间开始学习,每次学习1个unit,耗时1~5天。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Person.h"
#import "Language.h"
// 获取学习日期
NSString * getDate(NSInteger days) {
// 从现在开始加上已经学习的天数
NSDate * date = [NSDate dateWithTimeIntervalSinceNow:days*24*60*60];
// 使用NSDateFormatter进行日期的格式化
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy年MM月dd日";
NSString * resultDate = [formatter stringFromDate:date];
return resultDate;
}
int main(int argc, char * argv[]) {
Language * language;
Person * person;
// 随机选择一个人和一种语言
int randomNum1 = arc4random() % 3 + 1;
int randomNum2 = arc4random() % 4 + 1;
switch(randomNum1) {
case 1:
person = [[S1 alloc] init];
break;
case 2:
person = [[S2 alloc] init];
break;
case 3:
person = [[S3 alloc] init];
break;
}
switch(randomNum2){
case 1:
language = [[English alloc] init];
break;
case 2:
language = [[Japanese alloc] init];
break;
case 3:
language = [[German alloc] init];
break;
case 4:
language = [[Spanish alloc] init];
}
NSInteger randomDays = 0;
NSInteger sum = 0;
// 还未完成学习时
while(![language isFinish]) {
[language learnOneUnit];
if([language getTour] == 8)
continue;
NSString * date = getDate(sum);
// 每次随机学习1~5天
randomDays = arc4random() % 5 + 1;
sum += randomDays;
// 输出
NSLog(@"%@ %@ 学习%@ tour %ld unit %ld",[person getName],date,[language getName],[language getTour]+1,[language getUnit]);
}
}
运行结果
实验总结
本次实验第一次进行了objective-c语言的编程。初次接触,感觉objective-c相对来说是比较难的。一节课堂上就有许多的知识点,课下需要花时间进行理解。尤其是objective-c消息传递的性质,理解起来是有一定难度的。
在进行本次实验时,也遇到了一些困难。比如一开始对于多态性的理解不足,写Person类时直接将name作为成员变量,再使用property。这样下来发现思路非常复杂,而且难以实现要求。其实只需要将name的设置声明为一个方法并进行多态实现即可。
本次实验还用到了日期操作,在这个地方卡了比较久,最后终于找到可以参照的代码。其中NSDateFormatter可以用来进行日期的格式化。
总体来说,第一次objective-c编程的知识虽然不算多,但是比较重要。对于初步理解objective-c有很大的作用,收获也比较多。