福州大学研究生院怡山的同学们为了在国家对抗新冠疫情期间献出自己的一份力量,他们决定为奋战在一线的医护人员送去了演出。小黄作为研究生协会的会长,他让每位男同学均带去了若干只猫或狗去表演节目,而小李是研究生会的副会长,她让每位女同学唱歌或者跳舞。去医院前,每位同学都事先预计了表演要持续的时间。不过,在献爱心时,他们都不愿意输给同学,一旦发现自己的节目预期持续时间短于已经表演过的同类节目的最长时间,则会临时延长表演时间,至同类节目的最长时间。
精彩的表演过程被全程录下来,每个节目一段,医护人员们会不断地点播重放这些节目,增添了不少欢乐。
现给出以下基类框架:
class Group
{
protected:
int length; //时间长度
public:
virtual void play()=0;//重放节目
};
以Group为基类(如果觉得有必要,可以向Group类中加入若干成员函数),构建出BoyGroup和GirlGroup两个类,分别描述生物组和艺术组的表演。
要求主函数中有一个基类Group指针数组,数组元素不超过20个。
Group *g[20];
主函数根据输入的信息,相应建立BoyGroup或GirlGroup类对象,对于BoyGroup类对象要能给出参与表演的动物(cat/dog)及其数量,和表演的时间(以秒为单位); 对于GirlGroup类对象要能给出表演的类型(dance/sing),和表演的时间。
输入格式:
首先输入表演信息
每一行为一位同学的表演信息:
其中第1项为组别, B为男同学组,A为女同学组,如果输入为E,则表示结束输入表演信息。
对于所有男同学来说,接下来依次输入参与表演的动物(C或D, C指cat,D指dog), 动物的数量(不小于1的正整数),预期表演的时间长度T(正整数)。
对于所有女同学来说,接下来输入表演的形式(S或D, S指sing, D指dance),预期表演的时间长度T(正整数)
第一行的表演节目编号为1,第二行为2,依此类推。
接着输入点播要求:
点播要求为一行以空格隔开的若干个数字,最后一个数字是0。除0以外的每个数字均为节目编号(假设所给的节目编号对应的表演肯定存在)。
输出格式:
点播节目的信息。每行一个。按点播次序给出。
输入样例:
B C 2 5
B C 1 3
B D 2 2
A S 2
A S 8
A S 4
A D 1
B C 2 7
E
1 6 2 7 4 0
输出样例:
2 cats, 5 seconds
sing, 8 minutes
1 cat, 5 seconds
dance, 1 minute
sing, 2 minutes
说明:
节目1:B C 2 5意味着2只cats表演5秒
节目2: B C 1 3意味着1只cat表演3秒,但是以前cat类节目的最长时间为5秒,大于3秒,所以此时实际节目为1只cat表演5秒
节目3:B D 2 2意味着2只dogs表演2秒
节目4:A S 2意味着sing2分钟
节目5:A S 8意味着sing8分钟
节目6:A S 4意味着sing4分钟,但是此前sing类节目的最长时间为8分钟,大于4分钟,所以此时实际节目为sing8分钟。
节目7:A D 1意味着dance1分钟
节目8:B C 2 7意味着2只cats表演7秒
E意味着结束输入节目信息
1 6 2 7 4 0
意味着依次输出1,6,2,7,4节目的具体信息,每行一个节目。
虚函数、继承都没有太搞明白,就用老办法先写了,非常非常的麻烦。(太菜了😢
#include <bits/stdc++.h>
using namespace std;
ostream &sp(ostream &output);
void maxOflength(int &maxlength,int &length)
{
if(!maxlength)
maxlength = length;
else if(length < maxlength)
length = maxlength;
else
maxlength = length;
}
class BoyGroup
{
private:
string animal;
int length, nums;
static int cMaxLength;
static int dMaxLength;
string cOfLength;
int id;
public:
BoyGroup() {}
~BoyGroup() {}
BoyGroup(int a, int b) : nums(a), length(b) {}
void compare(char x);
void setVal(char x, int i);
void disp();
};
int BoyGroup::cMaxLength = 0;
int BoyGroup::dMaxLength = 0;
void BoyGroup::disp()
{
cout << nums << sp << animal << "," << sp << length << sp << cOfLength << endl;
}
void BoyGroup::setVal(char x, int i)
{
id = i;
compare(x);
if (length >= 2)
cOfLength = "seconds";
else
cOfLength = "second";
if (x == 'C')
animal = "cat";
else
animal = "dog";
if (nums >= 2)
animal += 's';
}
void BoyGroup::compare(char x)
{
if(x == 'C')
maxOflength(cMaxLength,length);
else
maxOflength(dMaxLength,length);
}
class GirlGroup
{
private:
int length;
string type, cOfLength;
static int sMaxLength;
static int dMaxLength;
int id;
public:
GirlGroup() {}
~GirlGroup() {}
GirlGroup(int a) : length(a) {}
void compare(char x);
void setVal(char x, int i);
void disp();
};
void GirlGroup::disp()
{
cout << type << "," << sp << length << sp << cOfLength << endl;
}
void GirlGroup::setVal(char x, int i)
{
id = i;
compare(x);
if (length >= 2)
cOfLength = "minutes";
else
cOfLength = "minute";
if (x == 'D')
type = "dance";
else
type = "sing";
}
int GirlGroup::sMaxLength = 0;
int GirlGroup::dMaxLength = 0;
void GirlGroup::compare(char x)
{
if(x == 'S')
maxOflength(sMaxLength,length);
else
maxOflength(dMaxLength,length);
}
int main()
{
BoyGroup *bg[20];
GirlGroup *gg[20];
char x, boyOrGirl;
int length, nums;
int id = 0;
vector<int> bgs;
vector<int> ggs;
vector<int> ans;
while (1)
{
cin >> boyOrGirl;
if (boyOrGirl == 'E')
break;
else if (boyOrGirl == 'B')
{
cin >> x >> nums >> length;
bg[id] = new BoyGroup(nums, length);
bg[id]->compare(x);
bg[id]->setVal(x, id);
bgs.push_back(id);
id++;
}
else
{
cin >> x >> length;
gg[id] = new GirlGroup(length);
gg[id]->compare(x);
gg[id]->setVal(x, id);
ggs.push_back(id);
id++;
}
}
int input;
while (1)
{
cin >> input;
if (!input)
break;
else
{
ans.push_back(input-1);
}
}
for (auto it : ans)
{
auto it1 = find(bgs.begin(),bgs.end(),it);
auto it2 = find(ggs.begin(),ggs.end(),it);
if(it1!=bgs.end())
bg[*it1]->disp();
else
gg[*it2]->disp();
}
return 0;
}
ostream &sp(ostream &output)
{
return output << " ";
}