fork download
  1. #include <iostream>
  2. #include <ctime>
  3. #include <math.h>
  4. #include <cctype>
  5. #include <string>
  6. #include <malloc.h>
  7. #include <cwctype>
  8. #include <vector>
  9. #include <chrono>
  10. #include <stdlib.h>
  11. #include <locale>
  12. #include <ctime>
  13. #ifdef _WIN32
  14. #include <windows.h>
  15. #include <stdio.h>
  16. #include <stddef.h>
  17. #include <io.h>
  18. #include <fcntl.h>
  19. #include <stringapiset.h>
  20. #endif
  21.  
  22. std::wstring readWStringFromConsole()
  23. {
  24. std::wstring wstr;
  25. bool isFailed = false;
  26. int tryCount = 4;
  27. do
  28. {
  29. try
  30. {
  31. std::fflush(NULL);
  32. std::wcin.sync();
  33. std::wcin.ignore(std::wcin.rdbuf()->in_avail());
  34. }
  35. catch (...) {}
  36. const std::chrono::steady_clock::time_point timeStart = std::chrono::steady_clock::now();
  37. std::getline(std::wcin, wstr);
  38. const std::chrono::steady_clock::time_point timeEnd = std::chrono::steady_clock::now();
  39. isFailed = std::chrono::duration_cast<std::chrono::milliseconds>(timeEnd - timeStart).count() <= 10;
  40. if (tryCount <= 0)
  41. {
  42. std::wcout << L"Ошибка: не удалось ввести строку из консоли." << std::endl;
  43. break;
  44. }
  45. --tryCount;
  46. } while (isFailed && wstr.empty());
  47. std::fflush(NULL);
  48. return wstr;
  49. }
  50.  
  51. void waitForAnyKey()
  52. {
  53. std::fflush(NULL);
  54. #ifdef _WIN32
  55. system("pause");
  56. #else
  57. system("bash -c \'read -n 1 -s -r -p \"Нажмите любую клавишу чтобы продолжить...\"\'");
  58. #endif
  59. }
  60.  
  61. void clearConsole()
  62. {
  63. std::fflush(NULL);
  64. #ifdef _WIN32
  65. system("cls");
  66. #else
  67. system("clear");
  68. #endif
  69.  
  70. }
  71. class Human
  72. {
  73. public:
  74. Human() : m_name(L"Роман"), m_age(25){}
  75. Human(std::wstring name, int age) : m_name(name), m_age(age){}
  76. virtual ~Human(){}
  77. const std::wstring &name() const;
  78. const int &age() const;
  79. const std::wstring narration() const;
  80. virtual const std::wstring greeting(const Human &h1);
  81. virtual const std::wstring typeOfGroup() const;
  82. protected:
  83. std::wstring m_name;
  84. int m_age;
  85. };
  86. const std::wstring Human::narration() const
  87. {
  88. std::wstring ending;
  89. if(m_age % 10 == 1)
  90. {
  91. ending = L" год";
  92. }
  93. else if(m_age % 10 >= 2 && m_age % 10 <= 4)
  94. {
  95. ending = L" года";
  96. }
  97. else if(m_age % 10 >= 5)
  98. {
  99. ending = L" лет";
  100. }
  101. else
  102. {
  103. ending = L" лет";
  104. }
  105. return L"Меня зовут "+m_name+L", мой возраст "+std::to_wstring(m_age)+ending+L" и я "+typeOfGroup()+L".\n";
  106. }
  107. const std::wstring &Human::name() const
  108. {
  109. return m_name;
  110. }
  111.  
  112. const int &Human::age() const
  113. {
  114. return m_age;
  115. }
  116. const std::wstring Human::greeting(const Human &h1)
  117. {
  118. return L"Здравствуйте, "+h1.name()+L"!\n";
  119. }
  120. const std::wstring Human::typeOfGroup() const
  121. {
  122. return L"человек";
  123. }
  124. class Informal : public Human
  125. {
  126. public:
  127. Informal() : Human() {}
  128. Informal(std::wstring name, int age) : Human(name, age) {}
  129. const std::wstring greeting(const Human &h1) override;
  130. const std::wstring typeOfGroup() const override;
  131. protected:
  132. };
  133. const std::wstring Informal::greeting(const Human &h1)
  134. {
  135. return L"Привет, "+h1.name()+L"!\n";
  136. }
  137. const std::wstring Informal::typeOfGroup() const
  138. {
  139.  
  140. return L"неформал";
  141. }
  142. class Formal : public Human
  143. {
  144. public:
  145. Formal() : Human() {}
  146. Formal(std::wstring name, int age) : Human(name, age) {}
  147. const std::wstring greeting(const Human &h1) override;
  148. const std::wstring typeOfGroup() const override;
  149. protected:
  150. };
  151. const std::wstring Formal::greeting(const Human &h1)
  152. {
  153. return L"Здравствуйте, "+h1.name()+L"!\n";
  154. }
  155. const std::wstring Formal::typeOfGroup() const
  156. {
  157. return L"формалист";
  158. }
  159. class Realist : public Human
  160. {
  161. public:
  162. Realist() : Human() {}
  163. Realist(std::wstring name, int age) : Human(name, age) {}
  164. const std::wstring greeting(const Human &h1) override;
  165. const std::wstring typeOfGroup() const override;
  166. protected:
  167. };
  168. const std::wstring Realist::greeting(const Human &h1)
  169. {
  170. if(h1.age() > m_age + 5)
  171. {
  172. return L"Здравствуйте, "+h1.name()+L"!\n";
  173. }
  174. return L"Привет, "+h1.name()+L"!\n";
  175. }
  176. const std::wstring Realist::typeOfGroup() const
  177. {
  178. return L"реалист";
  179. }
  180. int main()
  181. {
  182. #ifdef _WIN32
  183. setlocale(LC_ALL, "");
  184. _setmode(_fileno(stdout), _O_U16TEXT);
  185. _setmode(_fileno(stderr), _O_U16TEXT);
  186. _setmode(_fileno(stdin), _O_U16TEXT);
  187. #else
  188. //Т.к. ввели автотранслитерацию с русского на английский,
  189. //возвращаем все обратно;
  190. std::ios_base::sync_with_stdio(false);
  191. std::wcout.imbue(std::locale("en_US.UTF-8"));
  192. std::wcin.imbue(std::locale("en_US.UTF-8"));
  193. #endif
  194. srand(time(NULL));
  195. std::vector<std::wstring> nameArr = {L"Александр", L"Андрей", L"Анастасия", L"Ирина", L"Наталья", L"Павел", L"Роман", L"Светлана", L"Сергей", L"Татьяна"};
  196. std::vector<Human*> humanArr;
  197. for(int i = 0;i<5;++i)
  198. {
  199.  
  200. int a = (rand() % 3) + 1;
  201. int b = rand() % nameArr.size();
  202. int c = rand() % (40 - 20 + 1) + 20;
  203. if(a == 1)
  204. {
  205. humanArr.push_back(new Informal(nameArr[b], c));
  206. nameArr.erase(nameArr.begin()+b);
  207. }
  208. if(a == 2)
  209. {
  210. humanArr.push_back(new Formal(nameArr[b], c));
  211. nameArr.erase(nameArr.begin()+b);
  212. }
  213. if(a == 3)
  214. {
  215. humanArr.push_back(new Realist(nameArr[b], c));
  216. nameArr.erase(nameArr.begin()+b);
  217. }
  218. }
  219. for(size_t i = 0;i<humanArr.size();++i)
  220. {
  221. std::wcout<<humanArr[i]->narration();
  222. }
  223. std::wcout<<std::endl;
  224. for(size_t i = 1;i<humanArr.size();++i)
  225. {
  226. std::wcout<<L"Приветствие №"<<i<<std::endl;
  227. std::wcout<<humanArr[0]->greeting(*humanArr[i]);
  228. std::wcout<<humanArr[i]->greeting(*humanArr[0])<<std::endl;
  229. }
  230. for(size_t i = 0;i<humanArr.size();++i)
  231. {
  232. delete humanArr[i];
  233. }
  234. humanArr.clear();
  235. return 0;
  236. }
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
Меня зовут Татьяна, мой возраст 23 года и я реалист.
Меня зовут Андрей, мой возраст 37 лет и я неформал.
Меня зовут Анастасия, мой возраст 24 года и я неформал.
Меня зовут Наталья, мой возраст 31 год и я неформал.
Меня зовут Сергей, мой возраст 24 года и я формалист.

Приветствие №1
Здравствуйте, Андрей!
Привет, Татьяна!

Приветствие №2
Привет, Анастасия!
Привет, Татьяна!

Приветствие №3
Здравствуйте, Наталья!
Привет, Татьяна!

Приветствие №4
Привет, Сергей!
Здравствуйте, Татьяна!