Я не знал по какому критерию отобрать лучшую команду ... в итоге просто брал среднее арифметическое длины прыжка сравнивал Вроде нужно брать у игрока только лучшую попытку?
| Код | #include <iostream> #include <string> #include <vector> #include <map>
const int RES_MAX = 3;
struct record { std::string name; std::string surname; std::string patronymic; std::string society; int try_res[RES_MAX]; record():name("N/A"),surname("N/A"),patronymic("N/A"),society("N/A") { for (int i=0; i<RES_MAX; ++i) try_res[i]=0; } record(const std::string& _name, const std::string& _surname, const std::string& _patronymic, const std::string& _society, const int* _try_res):name(_name),surname(_surname),patronymic(_patronymic),society(_society) { std::copy(_try_res,_try_res+3,try_res); } };
class manager { private: std::string m_winner;//Название команды-победителя std::vector<record*> m_PBase; //База игроков std::map<std::string,int> m_PlayersCount; //Таблица "Команда - количество игроков" public: void add() { std::string name; std::string surname; std::string patronymic; std::string society; int try_res[RES_MAX]; _flushall(); std::cout << "Enter name: "; std::getline(std::cin,name); std::cout << "Enter surname: "; std::getline(std::cin,surname); std::cout << "Enter patromynic: "; std::getline(std::cin,patronymic); std::cout << "Enter the name of a society: "; std::getline(std::cin,society); for (int i=0; i<RES_MAX; ++i) { std::cout << "Enter the result of the " << i << " try: "; std::cin >> try_res[i]; } ++m_PlayersCount[society]; m_PBase.push_back(new record(name,surname,patronymic,society,try_res)); } void display_all() { if (m_PBase.size()==0) { std::cout << "There are nothing to display"; } else { for (int i=0; i<m_PBase.size(); i++) { std::cout << "Name: " << m_PBase[i]->name << std::endl; std::cout << "Surname: " << m_PBase[i]->surname << std::endl; std::cout << "Patronymic: " << m_PBase[i]->patronymic << std::endl; std::cout << "Society: " << m_PBase[i]->society << std::endl; std::cout << "Results: "; for (int j=0; j<RES_MAX; ++j) { std::cout << j << ") " << m_PBase[i]->try_res[j] << " "; } std::cout << std::endl; } } } void display_society() { std::string society; _flushall(); std::cout << "Enter the name of society: "; std::getline(std::cin,society); if (m_PlayersCount[society]!=0) std::cout << "There are " << m_PlayersCount[society] << " in it"; else std::cout << "There are no such society"; } void display_winner() { if (m_winner.size()==0) { find_winner(); } if(m_winner.size()!=NULL) std::cout << "The winner is: " << m_winner; else std::cout << "There are no winner or it hasn`t been found yet"; } void find_winner() { std::map<std::string,int> ResSum; //Считаем общую длину прыжка for (int i=0; i<m_PBase.size(); ++i) { ResSum[m_PBase[i]->society]=m_PBase[i]->try_res[0]+m_PBase[i]->try_res[1]+m_PBase[i]->try_res[2]; } int max_average=0; //Ищем среднее арифметическое длины прыжка для каждой команды и сравниваем с бывшим наилучшим результатом for (std::map<std::string,int>::iterator iter = m_PlayersCount.begin(); iter!=m_PlayersCount.end(); ++iter) { int temp=ResSum[iter->first]/iter->second; if (max_average<temp) { max_average=temp; m_winner=iter->first; } } } ~manager() { for (int i=0; i<m_PBase.size(); ++i) { delete m_PBase[i]; } m_PBase.clear(); } };
int main(int argc, char* argv[]) { manager man; char choice; do { std::cout << "\nChoose action:\n" << "'a' - add player\n" << "'d' - display all players\n" << "'o' - show number of players in a society" << "'s' - show the winner\n" << "'q' - quit\n"; choice=_getch(); try { switch(choice) { case 'a':man.add(); break; case 'o':man.display_society(); break; case 'd':man.display_all(); break; case 's':man.display_winner(); break; case 'q':break; default:std::cout << "Incorrect choice\n"; break; } } catch (char* msg) { std::cout << msg; } catch (...) { std::cout << "Unhalded exception"; } }while(choice!='q'); return 0; }
|
Добавлено @ 21:59 Если я прав насчет лучшего прыжка, то тогда метод следующий надо заментить на этот:
| Код | void find_winner() { std::map<std::string,int> ResSum; //Считаем общую длину прыжка for (int i=0; i<m_PBase.size(); ++i) { int best_jump=0; for (int j=0; j<RES_MAX; ++j) if(best_jump<m_PBase[i]->try_res[j]) best_jump=best_jump<m_PBase[i]->try_res[j]; ResSum[m_PBase[i]->society]+=best_jump; } int max_average=0; //Ищем среднее арифметическое длины прыжка для каждой команды и сравниваем с бывшим наилучшим результатом for (std::map<std::string,int>::iterator iter = m_PlayersCount.begin(); iter!=m_PlayersCount.end(); ++iter) { int temp=ResSum[iter->first]/iter->second; if (max_average<temp) { max_average=temp; m_winner=iter->first; } } }
|
|