实验目的
- 学习掌握Objective-C语法,掌握基础字符串操作。
- OO知识——多态与继承
实验内容
给定三个用户张三,李四,王五。
给定四种语言英语、日语、德语、西班牙语。
实现场景输出(log形式即可):随机选择一个用户和一种语言学习,从当前日期开始,随机产生时间进行学习,输出学习进度直至学习完毕。每个语言共8个tour,每个tour共4个unit,每次学习一个unit。
要求:
- 随机选定人名、语言后,一次性输出所有的结果。
- 随机时间指的是每次随机1-5天,每次学习时间在前一次的基础上加上刚刚随机出的天数。
- 需要用到多态。
输出例子: 张三 某年某月某日 学习日语 tour 1 unit 1。
代码
1. main函数
在main函数中要完成输出部分。输出的人物和语言都是随机的,学习日期也是随机的。每次学习1~5天,依次完成tour1到tour8的学习,并借用类中的函数。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Person.h"
#import "Language.h"
NSString * getDate(NSInteger sum_day) {
NSDate * date = [NSDate dateWithTimeIntervalSinceNow : sum_day * 24 * 60 * 60];
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy年MM月dd日";
NSString * day = [formatter stringFromDate : date];
return day;
}//获取每次开始学习的日期
int main(int argc, char * argv[]) {
int random1 = arc4random() % 4 + 1;
int random2 = arc4random() % 3 + 1;//获取随机数
Language * language;
Person * person;
switch (random1){
case 1:
language = [[English alloc] init];
break;
case 2:
language = [[Japanese alloc] init];
break;
case 3:
language = [[German alloc] init];
break;
default:
language = [[Spanish alloc] init];
}
switch (random2) {
case 1:
person = [[S1 alloc] init];
break;
case 2:
person = [[S2 alloc] init];
break;
case 3:
person = [[S3 alloc] init];
break;
}//随机选择人和语言
NSInteger random_study = 0;
NSInteger sum_day = 0;
while (![language isFinish]) {
[language learnOneUnit];
if ([language getTour] == 8)
break;
random_study = arc4random() % 5 + 1;//随机学习一到五天
NSString * day = getDate(sum_day);
sum_day += random_study;
NSLog(@"%@ %@ 学习%@ tour %ld unit %ld", [person getName], day, [language getName], [language getTour] + 1, [language getUnit]);
}//一直学习,直到学满8个tour
}
2. Person.h
#ifndef Person_h
#define Person_h
@interface Person : NSObject{
}
-(NSString *)getName;
@end
@interface S1 : Person{
}
@end
@interface S2 : Person{
}
@end
@interface S3 : Person{
}
@end
#endif /* Person_h */
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
3. Language.h
#ifndef Language_h
#define 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
#endif /* Language_h */
Language.m
该类负责语言的学习,专管四门语言,并定义了每门语言每个tour依次学习5个unit,并负责该次学习的语言,tour以及unit。
#import <Foundation/Foundation.h>
#import "Language.h"
@implementation Language
- (void)learnOneUnit{
unit++;
if (unit == 5) {
unit = 1;
tour++;
}
}//每个tour依次学习5个unit
-(NSInteger)getTour{
return tour;
}
-(NSInteger)getUnit{
return unit;
}
-(bool)isFinish{
if (tour == 8)
return YES;
return NO;
}//学满8个tour时,结束该语言学习
-(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
运行结果
总结与体会
这是我第一次用Object-C进行编程,之前在课堂上听老师讲相关知识时,觉得虽然该语言有自己很独特的地方,但是因为之前已经积累了很多c的编程经验,所以应该可以立即上手。但是真正实操起来才发现好难呀。或许因为是第一次用这门语言吧,读题时认为这道题不难,但是写起类来,我发现自己并不能很好地将方法整洁地归到各个类里面。。最后花了很多很多时间,还和身边的小伙伴一起讨论了一下,才顺利完成。希望经过这次实验对Object-C语言的熟悉,以后能够越来越好呀~加油!!