题目描述
某驾校对学车的学员做出以下设计:
(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函数,输出一个每个学员是否能否预约科目二,并输出相关提示信息
样例
输入:
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输出:
Wendy未达到学时要求不能预约!电话13209871920
Sarah达到学时要求可以预约!电话15081098293
张三未达到学时要求不能预约!电话15030120983
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
class CPerson {
protected:
string name;
char phone[12];
public:
CPerson(string n, char* p) :name(n)
{
int i;
for (i = 0; i < 11; i++)
{
phone[i] = p[i];
}
phone[i] = '\0';
}
};
class AS :public CPerson {
protected:
int Atime[12];
public:
AS(string n, char* p, int* a) :CPerson(n, p)
{
int i;
for (i = 0; i < 12; i++)
{
Atime[i] = a[i];
}
}
void check()
{
int cnt = 0;
int i;
for (i = 0; i < 12; i++)
{
if (Atime[i] >= 60)cnt++;
}
if (cnt >= 10)cout << name << "达到学时要求可以预约!电话" << phone << endl;
else cout << name << "未达到学时要求不能预约!电话" << phone << endl;
}
};
class BS :public AS {
int Btime[12];
public:
BS(string n, char* p, int* a, int* b) :AS(n, p, a) {
int i;
for (i = 0; i < 12; i++)
{
Btime[i] = b[i];
}
}
void check()
{
int cnt = 0;
int i;
for (i = 0; i < 12; i++)
{
if (Atime[i] >= 60)cnt++;
cnt += Btime[i] / 60;
}
if (cnt >= 10)cout << name << "达到学时要求可以预约!电话" << phone << endl;
else cout << name << "未达到学时要求不能预约!电话" << phone << endl;
}
};
int main()
{
int t,i;
cin >> t;
char k;
string na;
char phone[12];
int A[12], B[12];
while (t--)
{
cin >> k>>na;
for (i = 0; i < 11; i++)
{
cin >> phone[i];
}
phone[i] = '\0';
if (k == 'F')
{
for(i=0;i<12;i++)
{
cin >> A[i];
}
AS a(na, phone, A);
a.check();
}
else if (k == 'V')
{
for (i = 0; i < 12; i++)
{
cin >> A[i];
}
for (i = 0; i < 12; i++)
{
cin >> B[i];
}
BS b(na, phone, A,B);
b.check();
}
}
return 0;
}
ps:两个单继承,实现功能有所不同,分别定义不同类,对应不同学员,本题看上去复杂,但只是繁,没有很复杂。