Problem E: 点歌单
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 202 Solved: 99
[Submit][Status][Web Board]
Description
Yang要下海创业,开一家量贩式KTV。现在需要你来帮他编写一个C++程序来实现点歌的功能。至少需要定义如下类及其成员:
1. Song类:歌曲类,具有:
(1)歌曲名属性:一个不含空白符的字符串。
(2)static int getCntOfSongs():获得创建的歌曲的总数。
2. Pop类:是Song类的子类,具有static int getCntOfPops()方法,返回该类型的歌曲的总数。
3. Folk类:是Song类的子类,具有static int getCntOfFolks()方法,返回该类型的歌曲的总数。
4. Bel类:是Song类的子类,具有static int getCntOfBels()方法,返回该类型的歌曲的总数。
5. Singer类:歌手类,具有:
(1)歌手名属性:一个不含空白符的字符串。
(2)所演唱的歌曲列表。
(3)void addASong(string s, int t):添加一首该歌手演唱的歌曲,其中s为歌曲名,t为歌曲类型(1、2、3分别表示Pop、Folk和Bel类的歌曲)。
(4)void singASong(string):根据指定的歌曲名,演唱这首歌。分为两种情况:如果歌手所演唱的歌曲列表中有参数指定的歌曲名,则输出:
$ sings % in # style.
其中:$是歌手名字,%是歌曲名字,#是歌曲类型(为:popular、folk或Bel Canto之一)。
如果指定歌曲名不存在,则输出:
$ doesn’t sing %.
$、%含义同前。
(5)static int getCntOfSingers():获得创建的歌手的人数。
6.SingerList类:点歌单类,具有:
(1)歌手列表。
(2)重载的输入输出运算符。其中重载的输入运算符按照如下格式输入数据:
第1行N>0,表示有N名歌手。之后有N行。
之后的N行,每行是一个歌手及其演唱的歌曲,是一系列用空格分开的数据。每行的第一个字符串(不含空白符)是歌手的名字。第2个是整数M>0,表示该歌手演唱了M首歌曲。M后面有M组输入,每组输入包括1个整数K和1个不含空白符的字符串S,其中K=1、2或者3,分别对应于pop、folk和Bel Canto三种歌曲类型,S是歌曲名。
重载的输出运算符按照如下格式输出歌手及歌曲列表:
每个歌手及其演唱的歌曲占一行,每行的格式为:
$ : %1 %2 …
其中$为歌手名,%1、%2等为该歌手演唱的歌曲名列表,两两之间用1个空格隔开。
(3)void Choose(string s1, string s2)方法:根据参数指定的歌手名s1、歌曲名s2输出。分三种情况:
如果s1指定的歌手不存在,则输出:
Singer $ doesn't exist.
如果s1存在,但是该歌手没有演唱s2指定的歌曲,则输出:
$ doesn’t sing %.
如果s1、s2能够确定某首歌曲,则输出:
$ sings % in # style.
上述$、#和%的含义同前。
Input
输入分为2部分。
第1部分是按照SingerList类的要求输入的歌手及歌曲信息。
第2部分也有多行,每行包括2个字符串,分别是指定的歌手名和歌曲名。
假定所有的歌手名、歌曲名均不相同。
Output
见样例。
Sample Input
3
Tom 4 1 ChangJiu 2 DuanZan 3 Main 1 Object
Jack 1 1 Output
Mary 2 1 Input 3 GCC
Tom DuanZan
Jack Input
Mary GCC
CUI BIGDATA
Sample Output
In beginning, there are 0 singers, and 0 songs.
LiuHuan sings XiongDi in popular style.
LiuHuan sings SanGuo in folk style.
LiuHuan sings SongBie in Bel Canto style.
LiuHuan doesn't sing MeiYou.
Tom : ChangJiu DuanZan Main Object
Jack : Output
Mary : Input GCC
Now, there are 4 singers, and 10 songs. Including 5 pop songs, 2 folk songs, and 3 Bel Canto songs.
Tom sings DuanZan in folk style.
Jack doesn't sing Input.
Mary sings GCC in Bel Canto style.
Singer CUI doesn't exist.
HINT
Append Code
int main()
{
cout<<"In beginning, there are ";
cout<<Singer::getCntOfSingers()<<" singers, and ";
cout<<Song::getCntOfSongs()<<" songs."<<endl;
Singer liuh("LiuHuan");
liuh.addASong("XiongDi", 1);
liuh.addASong("SanGuo", 2);
liuh.addASong("SongBie", 3);
liuh.singASong("XiongDi");
liuh.singASong("SanGuo");
liuh.singASong("SongBie");
liuh.singASong("MeiYou");
SingerList lst;
string s1, s2;
cin>>lst;
cout<<lst;
cout<<"Now, there are ";
cout<<Singer::getCntOfSingers()<<" singers, and ";
cout<<Song::getCntOfSongs()<<" songs. Including ";
cout<<Pop::getCntOfPops()<<" pop songs, ";
cout<<Folk::getCntOfFolks()<<" folk songs, and ";
cout<<Bel::getCntOfBels()<<" Bel Canto songs."<<endl;
while(cin>>s1>>s2)
{
lst.Choose(s1, s2);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
class Song
{
public :
string nameSong;
static int numSongs;
Song(string arr):nameSong(arr){numSongs++;}
static int getCntOfSongs()
{
return numSongs;
}
virtual string gettype_() = 0;
};
class Pop:public Song
{
public :
static int numPops;
Pop(string arr):Song(arr){numPops++;}
static int getCntOfPops()
{
return numPops;
}
string gettype_()
{
string type_="popular";
return type_;
}
};
class Folk:public Song
{
public :
static int numFolks;
Folk(string arr):Song(arr){numFolks++;}
static int getCntOfFolks()
{
return numFolks;
}
string gettype_()
{
string type_="folk";
return type_;
}
};
class Bel:public Song
{
public :
static int numBels;
Bel(string arr):Song(arr){numBels++;}
static int getCntOfBels()
{
return numBels;
}
string gettype_()
{
string type_="Bel Canto";
return type_;
}
};
int Song::numSongs=0;
int Pop::numPops=0;
int Folk::numFolks=0;
int Bel::numBels=0;
class Singer
{
public :
string nameSinger;
static int numSingers;
vector<Song*> lists;//定义的是指针向量,调用每个单元的具体内容时必须用 ”->“
Song *S;//通过定义指针可以方便进行初始化内容
Singer(string arr):nameSinger(arr){numSingers++;}
void addASong(string s, int t)
{
if(t==1)
S=new Pop(s);
else if(t==2)
S=new Folk(s);
else if(t==3)
S=new Bel(s);
lists.push_back(S);//插入的必须是一个完整的类的对象。
}
void singASong(string arr)
{
int t=0;
for(int i=0; i<lists.size(); i++)
{
if(lists[i]->nameSong==arr)
t=i+1;
}
if(t!=0)
cout<<nameSinger<<" sings "<<arr<<" in "<<lists[t-1]->gettype_()<<" style."<<endl;
if(t==0)
cout<<nameSinger<<" doesn't sing "<<arr<<"."<<endl;
}
static int getCntOfSingers()
{
return numSingers;
}
};
int Singer::numSingers=0;
class SingerList
{
public :
vector<Singer*> Lists;
friend istream &operator>>(istream &is, SingerList &p)
{
int N; cin>>N;
for(int i=0; i<N; i++)
{
Singer *singer;
string names;
int num;
cin>>names>>num;
singer=new Singer(names);//定义歌手名
for(int j=0; j<num; j++)
{
string songname; int type_s;
cin>>type_s>>songname;
singer->addASong(songname, type_s);//添加歌手的歌曲列表
}
p.Lists.push_back(singer);//将初始化好的歌手添加到向量表中去。
}
return is;
}
friend ostream &operator<<(ostream &os, SingerList &p)
{
for(int i=0; i<p.Lists.size(); i++)
{
os<<p.Lists[i]->nameSinger<<" : ";//输出歌手名
for(int j=0; j<p.Lists[i]->lists.size(); j++)
{
if(j==0)
os<<p.Lists[i]->lists[j]->nameSong;//输出歌名
else
os<<" "<< p.Lists[i]->lists[j]->nameSong;//输出歌名
}
os<<endl;
}
return os;
}
void Choose(string s1, string s2)
{
int t1=0, i, j;
for(i=0; i<Lists.size(); i++)
if(s1==Lists[i]->nameSinger)
t1=i+1;
if(t1==0)
cout<<"Singer "<<s1<<" doesn't exist."<<endl;
else
{
int t2=0;
for(j=0; j<Lists[t1-1]->lists.size(); j++)
if(Lists[t1-1]->lists[j]->nameSong==s2)
t2=j+1;
if(t2==0)
cout<<s1<<" doesn't sing "<<s2<<"."<<endl;
else
cout<<s1<<" sings "<<s2<<" in "<<Lists[t1-1]->lists[t2-1]->gettype_()<<" style."<<endl;
}
}
};
int main()
{
cout<<"In beginning, there are ";
cout<<Singer::getCntOfSingers()<<" singers, and ";
cout<<Song::getCntOfSongs()<<" songs."<<endl;
Singer liuh("LiuHuan");
liuh.addASong("XiongDi", 1);
liuh.addASong("SanGuo", 2);
liuh.addASong("SongBie", 3);
liuh.singASong("XiongDi");
liuh.singASong("SanGuo");
liuh.singASong("SongBie");
liuh.singASong("MeiYou");
SingerList lst;
string s1, s2;
cin>>lst;
cout<<lst;
cout<<"Now, there are ";
cout<<Singer::getCntOfSingers()<<" singers, and ";
cout<<Song::getCntOfSongs()<<" songs. Including ";
cout<<Pop::getCntOfPops()<<" pop songs, ";
cout<<Folk::getCntOfFolks()<<" folk songs, and ";
cout<<Bel::getCntOfBels()<<" Bel Canto songs."<<endl;
while(cin>>s1>>s2)
{
lst.Choose(s1, s2);
}
return 0;
}