7-6 小黄与研究生会(25分)

13 篇文章 0 订阅
9 篇文章 0 订阅

福州大学研究生院怡山的同学们为了在国家对抗新冠疫情期间献出自己的一份力量,他们决定为奋战在一线的医护人员送去了演出。小黄作为研究生协会的会长,他让每位男同学均带去了若干只猫或狗去表演节目,而小李是研究生会的副会长,她让每位女同学唱歌或者跳舞。去医院前,每位同学都事先预计了表演要持续的时间。不过,在献爱心时,他们都不愿意输给同学,一旦发现自己的节目预期持续时间短于已经表演过的同类节目的最长时间,则会临时延长表演时间,至同类节目的最长时间。

精彩的表演过程被全程录下来,每个节目一段,医护人员们会不断地点播重放这些节目,增添了不少欢乐。

现给出以下基类框架:

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 <iostream>
using namespace std;
class Group {
protected:
	int length;
	static int maxcat;
	static int maxdog;
	static int maxsing;
	static int maxdance;
public:
	virtual void play() = 0;
	Group(int len) { length = len; }
};
int Group::maxcat = 0;
int Group::maxdog = 0;
int Group::maxsing = 0;
int Group::maxdance = 0;
class BoyGroup :public Group {
private:
	string name;
	int number;
public:
	BoyGroup(char name, int num,int len ) :Group(len) {
		if (name == 'c' || name == 'C') {
			this->name = "cat";
			if (maxcat > len)  length = maxcat;
			else maxcat=len;
		}
		if (name == 'd' || name == 'D') {
			this->name = "dog";
			if (maxdog > len)  length = maxdog;
			else maxdog=len;
		}
		number = num;
	}
	void play() {
		cout << number<<" "<<name;
		if (number > 1) cout << "s, "; else cout << ", ";
		cout << length << " second";
		if (length > 1)cout << "s";
		cout << endl;
	}
};
class GirlGroup :public Group {
private:
	string name;
public:
	GirlGroup(char name, int len) :Group(len) {
		if (name == 'S' || name == 's') {
			this->name = "sing";
			if (maxsing > len)  length = maxsing;
			else maxsing=len;
		}
		if (name == 'D' || name == 'd') { 
			this->name = "dance"; 
			if (maxdance> len)  length = maxdance;
			else maxdance=len;
		}
	}
	void play() {
		cout << name << ", " << length << " minute";
		if (length > 1)cout << "s";
		cout << endl;
	}
};

int main() {
	Group* g[20];
	int len,num,i=0;
	char sex, type;
	while (cin >> sex,sex!='E')
	{
		if (sex == 'B') {
			cin >> type >> num >> len;
			g[i++] = new BoyGroup(type, num, len);
		}
		else if (sex == 'A')
		{
			cin >> type >> len;
			g[i++] = new GirlGroup(type, len);
		}
	}
	while (cin >> i,i!=0)
	{
		g[i - 1]->play();
	}
	return 0;
}
#include <iostream>
using namespace std;
class Group {
protected:
	int length;
public:
	virtual void play() = 0;
	virtual string getname() = 0;
	Group(int len) { length = len; }
	int getlen() { return length; }
	void setlen(int l) { length = l; }
};
class BoyGroup :public Group {
private:
	string name;
	int number;
public:
	BoyGroup(char name, int num,int len ) :Group(len) {
		if (name == 'c' || name=='C') this->name = "cat";
		if (name == 'd' || name == 'D')this->name = "dog";
		number = num;
	}
	void play() {
		cout << number<<" "<<name;
		if (number > 1) cout << "s, "; else cout << ", ";
		cout << length << " second";
		if (length > 1)cout << "s";
		cout << endl;
	}
	string getname() { return name; }
};
class GirlGroup :public Group {
private:
	string name;
public:
	GirlGroup(char name, int len) :Group(len) {
		if (name == 'S' || name == 's') this->name = "sing";
		if (name == 'D' || name == 'd')this->name = "dance";
	}
	void play() {
		cout << name << ", " << length << " minute";
		if (length > 1)cout << "s";
		cout << endl;
	}
	string getname() { return name; }
};
void check(Group* g[], int n) {
	for (size_t i = 0; i < n; i++)
	{
		if (g[n - 1]->getlen()<g[i]->getlen() && g[n - 1]->getname() == g[i]->getname()) {
			g[n - 1]->setlen(g[i]->getlen());
		}
	}
}
int main() {
	Group* g[20];
	int len,num,i=0;
	char sex, type;
	while (cin >> sex,sex!='E')
	{
		if (sex == 'B') {
			cin >> type >> num >> len;
			g[i++] = new BoyGroup(type, num, len);
			check(g, i);
		}
		else if (sex == 'A')
		{
			cin >> type >> len;
			g[i++] = new GirlGroup(type, len);
			check(g,i);
		}
	}
	while (cin >> i,i!=0)
	{
		g[i - 1]->play();
	}
	return 0;
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值