fork download
  1. #include<iostream>
  2. #include<string>
  3. #define KST 20
  4.  
  5. using namespace std;
  6.  
  7. class WinStrategy;
  8. class SmallerBetterStrategy;
  9. class ChampionshipStrategy;
  10. class University;
  11. class SmallerBetter;
  12. class Championship;
  13.  
  14. class University {
  15. private:
  16. string universiada;
  17. string name;
  18. int win;
  19.  
  20. public:
  21. University(string name, string universiada) {
  22. this->name = name;
  23. this->universiada = universiada;
  24. win = 0;
  25. }
  26.  
  27. University(){}
  28.  
  29. int GetWin() {
  30. return win;
  31. }
  32.  
  33. string GetName() {
  34. return name;
  35. }
  36.  
  37. string GetUniversiada() {
  38. return universiada;
  39. }
  40.  
  41. void SetWin(int win) {
  42. this->win = win;
  43. }
  44. };
  45.  
  46. class SportUniver {
  47. private:
  48. WinStrategy* winStrategy; // вказівник на об'єкт з методом Win
  49.  
  50. protected:
  51. string NazvaUniver;
  52. string data;
  53.  
  54. public:
  55. static University universities[KST];
  56. static int uniCount;
  57.  
  58. int CompetitionType;
  59.  
  60. virtual void Input() = 0;
  61.  
  62. SportUniver();
  63.  
  64. void setStrategy(WinStrategy* strategy) {
  65. winStrategy = strategy;
  66. }
  67.  
  68. void GoWin(SportUniver** obj, int kst)
  69. {
  70. winStrategy->Win(obj, kst);
  71. }
  72.  
  73.  
  74. //virtual void Win(SportUniver** obj, int kst) = 0;
  75.  
  76. string GetNazvaUniver() {
  77. return NazvaUniver;
  78. }
  79.  
  80. string GetData() {
  81. return data;
  82. }
  83.  
  84. void AddWins(string team, string universiada) {
  85. int i = 0;
  86.  
  87. while (universiada.compare(universities[i].GetUniversiada()) != 0)// шукає по масиву університетів задану універсіаду
  88. i++;
  89.  
  90. while (team.compare(universities[i].GetName()) != 0)// тута шукає команду
  91. i++;
  92.  
  93. universities[i].SetWin(universities[i].GetWin() + 1);// дододає в ту команду перемогу
  94. }
  95.  
  96. void AddTeam(string player, string universiada) {
  97. for (int i = 0; i < uniCount; i++)// спочатку воно не заходить в фор, а одразу додає універ в масив, вже потім заходить в фор і там збільшується к-сть
  98. if (player.compare(universities[i].GetName()) == 0 && universiada.compare(universities[i].GetUniversiada()) == 0)
  99. return;//перевіряє чи в масиві університетів є цей універ. якщо є то виходимо з циклу, якщо нема-записуємо в масив
  100.  
  101. universities[uniCount++] = University(player, universiada);
  102. }
  103.  
  104. void Sort() {
  105. for (int i = 0; i < uniCount; i++) {
  106. for (int k = 0; k < uniCount; k++) {
  107. if ((universities[i].GetWin()) > (universities[k].GetWin())) {
  108.  
  109. University temp = universities[i];
  110. universities[i] = universities[k];
  111. universities[k] = temp;
  112. }
  113. }
  114. }
  115. }
  116.  
  117. void OutputRecords() {
  118. for (int i = 0; i < uniCount; i++)
  119. cout << universities[i].GetUniversiada() << " - " << universities[i].GetName() << " - " << universities[i].GetWin() << endl;
  120. }
  121. };
  122.  
  123. int SportUniver::uniCount;
  124. University SportUniver::universities[KST];
  125.  
  126. class Championship : public SportUniver {
  127. private:
  128. string komanda1;
  129. string komanda2;
  130. int goals1, goals2;
  131.  
  132. public:
  133. Championship(string NazvaUniver, string data, int CompetitionType) {
  134. this->NazvaUniver = NazvaUniver;
  135. this->data = data;
  136. this->CompetitionType = CompetitionType;
  137. }
  138.  
  139. Championship() {}
  140.  
  141. string GetKomanda1() {
  142. return komanda1;
  143. }
  144.  
  145. string GetKomanda2() {
  146. return komanda2;
  147. }
  148.  
  149. int GetGoals1() {
  150. return goals1;
  151. }
  152.  
  153. int GetGoals2() {
  154. return goals2;
  155. }
  156.  
  157. //void Win(SportUniver** obj1, int kst) override {
  158.  
  159. // Championship* obj = (Championship*)(*obj1);//привела до типу
  160.  
  161. // if (obj->goals1 > obj->goals2)
  162. // AddWins(obj->komanda1, obj->NazvaUniver);
  163. // else if (obj->goals1 < obj->goals2)
  164. // AddWins(obj->komanda2, obj->NazvaUniver);
  165. //}
  166.  
  167. void Input() override {
  168. cout << "Введіть команду 1" << endl;
  169. cin >> komanda1;
  170. cout << "Введіть команду 2" << endl;
  171. cin >> komanda2;
  172. cout << "Введіть к-сть голів 1 команди" << endl;
  173. cin >> goals1;
  174. cout << "Введіть к-сть голів 2 команди" << endl;
  175. cin >> goals2;
  176.  
  177. AddTeam(komanda1, NazvaUniver);
  178. AddTeam(komanda2, NazvaUniver);
  179. }
  180. };
  181.  
  182. class SmallerBetter : public SportUniver {
  183. private:
  184. string player;
  185. double runTime;
  186. double jumpLength;
  187. double swimmingTime;
  188.  
  189. bool checked = false;
  190.  
  191. public:
  192. SmallerBetter(string NazvaUniver, string data, int CompetitionType) {
  193. this->NazvaUniver = NazvaUniver;
  194. this->data = data;
  195. this->CompetitionType = CompetitionType;
  196. }
  197.  
  198. SmallerBetter() {}
  199.  
  200. void Input()override {
  201. cout << "Введіть учасник-університет" << endl;
  202. cin >> player;
  203. cout << "Введіть його результат з бігу" << endl;
  204. cin >> runTime;
  205. cout << "Введіть його результат з стрибків" << endl;
  206. cin >> jumpLength;
  207. cout << "Введіть його результат з плавання" << endl;
  208. cin >> swimmingTime;
  209.  
  210. AddTeam(player, NazvaUniver);
  211. }
  212.  
  213. string GetPlayer() {
  214. return player;
  215. }
  216.  
  217. double GetRunTime() {
  218. return runTime;
  219. }
  220.  
  221. double GetJumpLength() {
  222. return jumpLength;
  223. }
  224.  
  225. double GetSwimmingTime() {
  226. return swimmingTime;
  227. }
  228.  
  229. double GetChecked() {
  230. return checked;
  231. }
  232.  
  233. void SetChecked(bool checked) {
  234. this->checked = checked;
  235. }
  236.  
  237. //void Win(SportUniver** obj1, int kst) override {
  238.  
  239. // SmallerBetter** obj = (SmallerBetter**)obj1;
  240.  
  241. // if ((*obj)->checked == true)
  242. // return;
  243.  
  244. // SmallerBetter** pend = obj + kst;
  245. // SmallerBetter* leader = *obj;
  246.  
  247. // string univerToCheck = (*obj)->NazvaUniver; //ставимо назву універсіади першого об'єкту
  248.  
  249. // // Шукаємо найкращого бігуна певної універсіади
  250. // for (SmallerBetter** p1 = obj; p1 < pend; p1++) {
  251.  
  252. // if ((*p1)->NazvaUniver.compare(univerToCheck) == 0 && (*p1)->CompetitionType == 2) {
  253. // (*p1)->checked = true; // помічаємо гравця, щоб не розглядати його для іншої універсіади
  254. // //спочатку порівнюємо всіх з 1 універсіади і пропускаємо 2, а потім навпаки пропускаємо 1 бо ми її вже перевірили коли брали 1 об*єкт
  255. // if ((*p1)->runTime < leader->runTime)
  256. // leader = *p1;
  257. // }
  258. // }
  259. // AddWins(leader->player, leader->NazvaUniver);
  260.  
  261. // // Шукаємо найкращого стрибунця певної універсіади
  262. // for (SmallerBetter** p1 = obj; p1 < pend; p1++) {
  263. // if ((*p1)->CompetitionType == 2)
  264. // if ((*p1)->NazvaUniver.compare(univerToCheck) == 0 && (*p1)->jumpLength > leader->jumpLength)
  265. // leader = *p1;
  266. // }
  267. // AddWins(leader->player, leader->NazvaUniver);
  268.  
  269. // // Шукаємо найкращого плавця певної універсіади
  270. // for (SmallerBetter** p1 = obj; p1 < pend; p1++) {
  271. // if ((*p1)->CompetitionType == 2)
  272. // if ((*p1)->NazvaUniver.compare(univerToCheck) == 0 && (*p1)->swimmingTime < leader->swimmingTime)
  273. // leader = *p1;
  274. // }
  275. // AddWins(leader->player, leader->NazvaUniver);
  276. //}
  277. };
  278.  
  279.  
  280. class WinStrategy {
  281. public:
  282. WinStrategy() {};
  283. ~WinStrategy() {};
  284.  
  285. virtual void Win(SportUniver** obj, int kst) = 0;
  286. };
  287.  
  288. class ChampionshipStrategy : public WinStrategy {
  289. public:
  290. void Win(SportUniver** obj1, int kst) override {
  291. Championship* obj = (Championship*)(*obj1);//привела до типу
  292.  
  293. if (obj->GetGoals1() > obj->GetGoals2())
  294. obj->AddWins(obj->GetKomanda1(), obj->GetNazvaUniver());
  295. else if (obj->GetGoals1() < obj->GetGoals2())
  296. obj->AddWins(obj->GetKomanda2(), obj->GetNazvaUniver());
  297. }
  298. };
  299.  
  300. class SmallerBetterStrategy : public WinStrategy {
  301. public:
  302. void Win(SportUniver** obj1, int kst) override {
  303. SmallerBetter** obj = (SmallerBetter**)obj1;
  304.  
  305. if ((*obj)->GetChecked() == true)
  306. return;
  307.  
  308. SmallerBetter** pend = obj + kst;
  309. SmallerBetter* leader = *obj;
  310.  
  311. string univerToCheck = (*obj)->GetNazvaUniver(); //ставимо назву універсіади першого об'єкту
  312.  
  313. // Шукаємо найкращого бігуна певної універсіади
  314. for (SmallerBetter** p1 = obj; p1 < pend; p1++) {
  315.  
  316. if ((*p1)->GetNazvaUniver().compare(univerToCheck) == 0 && (*p1)->CompetitionType == 2) {
  317. (*p1)->SetChecked(true); // помічаємо гравця, щоб не розглядати його для іншої універсіади
  318. //спочатку порівнюємо всіх з 1 універсіади і пропускаємо 2, а потім навпаки пропускаємо 1 бо ми її вже перевірили коли брали 1 об*єкт
  319. if ((*p1)->GetRunTime() < leader->GetRunTime())
  320. leader = *p1;
  321. }
  322. }
  323. (*obj)->AddWins(leader->GetPlayer(), leader->GetNazvaUniver());
  324.  
  325. // Шукаємо найкращого стрибунця певної універсіади
  326. for (SmallerBetter** p1 = obj; p1 < pend; p1++) {
  327. if ((*p1)->CompetitionType == 2)
  328. if ((*p1)->GetNazvaUniver().compare(univerToCheck) == 0 && (*p1)->GetJumpLength() > leader->GetJumpLength())
  329. leader = *p1;
  330. }
  331. (*obj)->AddWins(leader->GetPlayer(), leader->GetNazvaUniver());
  332.  
  333. // Шукаємо найкращого плавця певної універсіади
  334. for (SmallerBetter** p1 = obj; p1 < pend; p1++) {
  335. if ((*p1)->CompetitionType == 2)
  336. if ((*p1)->GetNazvaUniver().compare(univerToCheck) == 0 && (*p1)->GetSwimmingTime() < leader->GetSwimmingTime())
  337. leader = *p1;
  338. }
  339. (*obj)->AddWins(leader->GetPlayer(), leader->GetNazvaUniver());
  340. }
  341. };
  342.  
  343.  
  344. int InputData(SportUniver* [], SportUniver* []);
  345.  
  346. void Input1(SportUniver** p1, string NazvaUniver, string data, int choice);
  347.  
  348. void Input2(SportUniver** p1, string NazvaUniver, string data, int choice);
  349.  
  350. void CountWin(SportUniver* [], int kst);
  351.  
  352. int main() {
  353. system("chcp 1251 & cls & color 70");
  354.  
  355. SportUniver* game[20];
  356.  
  357. int k = InputData(game, game + 19);
  358. CountWin(game, k);
  359.  
  360. game[0]->Sort();
  361. game[0]->OutputRecords();
  362.  
  363. for (int i = 0; i < k; i++)
  364. {
  365. delete game[i];
  366. }
  367.  
  368. system("pause");
  369. return 0;
  370. }
  371.  
  372.  
  373. int InputData(SportUniver* p1[], SportUniver* pend[])
  374. {
  375. string NazvaUniver, data;
  376. int k = 0;
  377. int choice = 0;
  378.  
  379. while (p1 < pend)
  380. {
  381. rewind(stdin);
  382.  
  383. cout << "Введіть назву Універсіади (пустий рядок - кінець)" << endl;
  384. getline(cin, NazvaUniver);
  385.  
  386. if (NazvaUniver[0] == '\0')
  387. break;
  388.  
  389. cout << "Введіть дату" << endl;
  390. cin >> data;
  391.  
  392. while (p1 < pend)
  393. {
  394. cout << endl << k + 1 << ". Виберіть тип змагань: по командах/між учасниками [1/2] (0 - кінець) -> ";
  395.  
  396. cin >> choice;
  397.  
  398. if (choice == 1)
  399. Input1(p1, NazvaUniver, data, choice);
  400. else if (choice == 2)
  401. Input2(p1, NazvaUniver, data, choice);
  402. else
  403. break;
  404.  
  405. p1++;
  406. k++;
  407. }
  408. }
  409.  
  410. return k;
  411. }
  412.  
  413. void Input1(SportUniver** p1, string NazvaUniver, string data, int choice) {
  414. *p1 = new Championship(NazvaUniver, data, choice); //заносимо в конструктор дані
  415. (*p1)->Input();
  416. }
  417.  
  418. void Input2(SportUniver** p1, string NazvaUniver, string data, int choice)
  419. {
  420. *p1 = new SmallerBetter(NazvaUniver, data, choice);
  421. (*p1)->Input();
  422. }
  423.  
  424. void CountWin(SportUniver* pstart[], int kst)
  425. {
  426. SportUniver** pend = pstart + kst;
  427.  
  428. for (SportUniver** p1 = pstart; p1 < pend; p1++) {
  429.  
  430. if (dynamic_cast<Championship*>(*p1) != nullptr) // якшо *p1 належить до класу Championship
  431. (*p1)->setStrategy(new ChampionshipStrategy());
  432. else
  433. (*p1)->setStrategy(new SmallerBetterStrategy());
  434. (*p1)->GoWin(p1, kst);
  435. //(*p1)->Win(p1, kst);//передаємо всі об*єкти
  436. }
  437. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In member function ‘void SportUniver::GoWin(SportUniver**, int)’:
prog.cpp:70:14: error: invalid use of incomplete type ‘class WinStrategy’
   winStrategy->Win(obj, kst);
              ^~
prog.cpp:7:7: note: forward declaration of ‘class WinStrategy’
 class WinStrategy;
       ^~~~~~~~~~~
prog.cpp: In function ‘int main()’:
prog.cpp:353:8: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result [-Wunused-result]
  system("chcp 1251 & cls & color 70");
  ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cpp:368:8: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result [-Wunused-result]
  system("pause");
  ~~~~~~^~~~~~~~~
stdout
Standard output is empty