【id:211】【10分】F. OOP驾考预约(单继承)
时间限制
1s
内存限制
128MB
题目描述
某驾校对学车的学员做出以下设计:
(1)定义CPerson类,包含数据成员:姓名,联系电话。由CPerson作为基类派生出学员类。
(2)学员类表示普通学员,他们可以在场地A练车,一天最多获得一个学时(即使练习时长超过一小时也只能按一个学时计算)
学员类新增一个数据成员Atime,长度为12的整数数组,表示连续12天,在A场地每天练习的时长,时长单位按分钟计算
学员类新增一个成员函数void check(),检查学员是否达到预约科目二考试资格的标准,并输出相应提示信息。
预约资格是:在每12天的周期内,总学时达到10小时可以预约。练习每一小时计一学时,不足一小时计0
(3)学员类派生出VIP学员类,他们可以在场地B练车,一天最多获得两个学时(即使练习时长超过两小时也只能按两个学时计算)。
VIP学员同样可以在A场地练车。A\B场地练车获得学时可以叠加,即VIP学员一天最多获得3个学时。
VIP学员类新增一个数据成员Btime,长度为12的整数数组,表示连续12天中,在B场地每天练习的时长,时长单位按分钟计算
VIP学员类重载函数void check(),功能也是检查预约资格,只是学时计算要包含A和B场地。
输入
测试样例有t学员
每个学员的第一行先输入学员信息:类型(普通学员用F表示,VIP学员用V表示),姓名,电话。
如果是普通学员,接着只包含一行数据,第二行输入A场地的12天来每天的练习时长(共12个整数,单位为分钟)
如果是VIP学员,接着包含两行数据,第二行输入A场地的12天练习时长,第三行输入B场地的12天练习时长,每行都是12个整数。
输出
输出t行
调用check函数,输出一个每个学员是否能否预约科目二,并输出相关提示信息
样例查看模式
正常显示
查看格式
输入样例1 <-复制
3
F Wendy 13209871920
30 30 40 60 60 40 60 70 100 80 30 40
V Sarah 15081098293
170 80 0 50 60 90 110 0 40 60 30 100
0 0 90 0 0 0 0 130 0 0 0 66
V 张三 15030120983
80 0 0 30 20 0 40 0 30 150 0 0
0 10 10 0 0 10 0 20 0 0 150 160
输出样例1
Wendy未达到学时要求不能预约!电话13209871920
Sarah达到学时要求可以预约!电话15081098293
张三未达到学时要求不能预约!电话15030120983
在使用构造函数时需要传递数组,使用固定格式:
*this->Atime = *new int[12];
for (int i = 0; i < 12; ++i) {
Atime[i]=atime[i];
}
否则数据出错
不能直接使用等号=
#include "iostream"
#include "vector"
using namespace std;
//定义 CPerson 类,包含数据成员:姓名,联系电话。由CPerson作为基类派生出学员类。
class CPerson {
protected:
string name;
string phone;
public:
CPerson(const string &name, const string &phone) : name(name), phone(phone) {}
};
//学员类表示普通学员,他们可以在场地A练车,一天最多获得一个学时(即使练习时长超过一小时也只能按一个学时计算)
//学员类新增一个数据成员Atime,长度为12的整数数组,表示连续12天,在A场地每天练习的时长,时长单位按分钟计算
//
// 学员类新增一个成员函数void check(),检查学员是否达到预约科目二考试资格的标准,并输出相应提示信息。
class Student : public CPerson {
public:
int Atime[12];//时长单位按分钟计算,一天最多获得一个学时
Student(const string &name, const string &phone, int *atime) : CPerson(name, phone) {
*this->Atime = *new int[12];
for (int i = 0; i < 12; ++i) {
Atime[i]=atime[i];
}
}
void check() {
//检查学员是否达到预约科目二考试资格的标准,并输出相应提示信息。
//预约资格是:在每12天的周期内,总学时达到10小时可以预约。练习每一小时计一学时,不足一小时计0
int sum = 0;
for (int i = 0; i < 12; ++i) {
if (Atime[i] >= 60) {
sum++;
}
}
if (sum >= 10) {
cout << name << "达到学时要求可以预约!电话" << phone << endl;
} else {
cout << name << "未达到学时要求不能预约!电话" << phone << endl;
}
}
};
//学员类派生出VIP学员类,他们可以在场地B练车,一天最多获得两个学时(即使练习时长超过两小时也只能按两个学时计算)。
//
// VIP学员同样可以在A场地练车。A\B场地练车获得学时可以叠加,即VIP学员一天最多获得3个学时。
//
// VIP学员类新增一个数据成员 Btime,长度为12的整数数组,表示连续12天中,在B场地每天练习的时长,时长单位按分钟计算
//
// VIP学员类重载函数void check(),功能也是检查预约资格,只是学时计算要包含A和B场地。
class VIP : public Student {
public:
int Btime[12];//时长单位按分钟计算
VIP(const string &name, const string &phone, int *atime, int *btime) : Student(name, phone, atime) {
*this->Btime = *new int[12];
for (int i = 0; i < 12; ++i) {
Btime[i]=btime[i];
}
}
void check() {
//功能也是检查预约资格,只是学时计算要包含A和B场地。
//检查学员是否达到预约科目二考试资格的标准,并输出相应提示信息。
//预约资格是:在每12天的周期内,总学时达到10小时可以预约。练习每一小时计一学时,不足一小时计0
int sum = 0;
for (int i = 0; i < 12; ++i) {
if (Atime[i] >= 60) {
sum++;
}
if (Btime[i] >= 120) {
sum += 2;
} else if (Btime[i] >= 60) {
sum++;
}
}
// cout << sum << endl;
if (sum >= 10) {
cout << name << "达到学时要求可以预约!电话" << phone << endl;
} else {
cout << name << "未达到学时要求不能预约!电话" << phone << endl;
}
}
};
int main() {
//测试样例有t学员
//
// 每个学员的第一行先输入学员信息:类型(普通学员用F表示,VIP学员用V表示),姓名,电话。
//
// 如果是普通学员,接着只包含一行数据,第二行输入A场地的12天来每天的练习时长(共12个整数,单位为分钟)
//
int t;
cin >> t;
while (t--) {
char type;
cin >> type;
switch (type) {
case 'F': {
string name;
string phone;
int *Atime = new int[12];
cin >> name >> phone;
for (int i = 0; i < 12; ++i) {
cin >> Atime[i];
}
Student student(name, phone, Atime);
student.check();
break;
}
case 'V': {
// 如果是VIP学员,接着包含两行数据,第二行输入A场地的12天练习时长,第三行输入B场地的12天练习时长,每行都是12个整数。
string name;
string phone;
int *Atime = new int[12];
int *Btime = new int[12];
cin >> name >> phone;
for (int i = 0; i < 12; ++i) {
cin >> Atime[i];
}
for (int i = 0; i < 12; ++i) {
cin >> Btime[i];
}
VIP vip(name, phone, Atime, Btime);
vip.check();
break;
}
}
}
}