#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <list>
#include <vector>
#include <ctime>
#include <cmath>
#include <utility>
using namespace std;
typedef struct _Singer{
public:
string name;
double socre;
_Singer():name(""),socre(0){}
_Singer(string n,double s):name(n),socre(s){}
}Singer;
class Competion{
public:
Competion(){
srand(time(NULL));
}
~Competion(){m_map_singer.clear();}
void show_singer_infromaton();
//每队晋级编号和人名排名(有分数)、淘汰编号和人名(没有分数)
void first_competion();
//每队晋级编号和人名排名(有分数)、淘汰编号和人名(有分数)
void second_competion();
//输出编号和人名排名(有分数)
void fainal_competion();
private:
void generate_socre(int num);
map<int,Singer> m_map_singer;//编号 选手
multimap<double ,int> m_mmap_current_competion; // 成绩 编号
};
void Competion::generate_socre(int num){
vector<int> socres;
int average = 0;
for(int i = 0 ; i < 10;++i){
socres.push_back(rand()/40 + 60);
}
sort(socres.begin(),socres.end());
socres.pop_back();
for(vector<int>::iterator iter = ++socres.begin(); iter != socres.end();++iter){
average += *iter;
}
m_map_singer[num].socre = average/8.0;
}
void Competion::show_singer_infromaton(){
string str("ABCDEFGHIJKLMNOPQRSTUVWSYZ");
//random_shuffle ( RandomAccessIterator first, RandomAccessIterator last );
random_shuffle(str.begin(),str.end());
string s("singer");
for(int i = 0 ; i < 24;++i){
s += str[i];
m_map_singer.insert(pair<int ,Singer>(1000+i,Singer(s,0)));
s = "singer";
}
cout << "players infromation:" <<endl;
for(map<int,Singer>::iterator iter = m_map_singer.begin();
iter != m_map_singer.end();++iter){
cout << "numbering: " << iter->first << " player: " << iter->second.name << endl;
}
}
void Competion::first_competion(){
int count = 0;
vector<int> first_elimiation;//第一次淘汰的歌手id
cout << "第一次比赛:"<<endl;
for(map<int,Singer>::iterator iter = m_map_singer.begin();
iter != m_map_singer.end();++iter){
generate_socre(iter->first);
m_mmap_current_competion.insert(pair<double ,int>(iter->second.socre,iter->first));
++count;
if(count%6 == 0){
int c = 0;
cout << "第"<< count/6 << "组选手:"<<endl;
for(multimap<double ,int>::reverse_iterator it = m_mmap_current_competion.rbegin();
it != m_mmap_current_competion.rend();++it){
++c;
cout << "numbering: " << it->second
<< " player: " << m_map_singer[it->second].name
<< " score: " << it->first << endl;
if(c > 3){
first_elimiation.push_back(it->second);
}
}
cout << endl;
m_mmap_current_competion.clear();
}
}
cout << "第一次淘汰选手:"<<endl;
for(vector<int>::iterator iter = first_elimiation.begin();iter != first_elimiation.end();++iter){
cout << "numbering: " << *iter << " player: " << m_map_singer[*iter].name <<endl;
m_map_singer.erase(*iter);
}
cout << endl;
}
void Competion::second_competion(){
int count = 0;
multimap<double,int> second_elimiation;//第二次淘汰的歌手分数和id
cout << "第二次比赛:"<<endl;
for(map<int,Singer>::iterator iter = m_map_singer.begin();
iter != m_map_singer.end();++iter){
generate_socre(iter->first);
m_mmap_current_competion.insert(pair<double ,int>(iter->second.socre,iter->first));
++count;
if(count%6 == 0){
int c = 0;
cout << "第"<< count/6 << "组选手:"<<endl;
for(multimap<double ,int>::reverse_iterator it = m_mmap_current_competion.rbegin();
it != m_mmap_current_competion.rend();++it){
++c;
cout << "numbering: " << it->second
<< " player: " << m_map_singer[it->second].name
<< " score: " << it->first << endl;
if(c > 3){
second_elimiation.insert(pair<double ,int>(it->first,it->second));
}
}
cout << endl;
m_mmap_current_competion.clear();
}
}
cout << "第二次淘汰选手:"<<endl;
for(multimap<double,int>::reverse_iterator iter = second_elimiation.rbegin();
iter != second_elimiation.rend();++iter){
cout << "numbering: " << iter->second
<< " player: " << m_map_singer[iter->second].name
<< " score: " << iter->first
<< endl;
m_map_singer.erase(iter->second);
}
cout << endl;
}
void Competion::fainal_competion(){
cout << "第三次比赛:"<<endl;
for(map<int,Singer>::iterator iter = m_map_singer.begin();
iter != m_map_singer.end();++iter){
generate_socre(iter->first);
m_mmap_current_competion.insert(pair<double ,int>(iter->second.socre,iter->first));
}
for(multimap<double ,int>::reverse_iterator it = m_mmap_current_competion.rbegin();
it != m_mmap_current_competion.rend();++it){
cout << "numbering: " << it->second
<< " player: " << m_map_singer[it->second].name
<< " score: " << it->first << endl;
}
cout << endl;
m_mmap_current_competion.clear();
}
int main(){
Competion c;
c.show_singer_infromaton();
c.first_competion();
c.second_competion();
c.fainal_competion();
getchar();
return 0;
}
歌唱比赛C++
最新推荐文章于 2024-04-09 08:01:43 发布