Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.95 KB | None | 0 0
  1. //Практика 1:
  2. // enum class
  3. // initializer_list и универсальные списки инициализации
  4. // auto
  5. // decltype
  6. // lambda functions
  7.  
  8. #include <string>
  9. #include <vector>
  10. #include <list>
  11. #include <deque>
  12. #include <map>
  13. #include <set>
  14. #include <iostream>
  15. #include <locale>
  16. #include <algorithm>
  17.  
  18. //Задание 1.
  19. void f1() {
  20.     enum class months : std::uint8_t { January, February, March/*...*/ };
  21.     enum class weekDays : std::uint8_t { Monday, Tuesday /*...*/ };
  22.  
  23. months m = months::January;
  24. //а) уберите проблемы
  25. // if (m == Monday) { /*...*/ }
  26. //б) оптимизируйте использование памяти
  27. months year[] = { months::January, months::February, months::March };
  28. size_t n = sizeof(year); //???
  29. std::cout << "SizeOF year " << n << std::endl;
  30. }
  31.  
  32. //Задание 2. Создайте и с помощью списка инициализации заполните значениями вектор с
  33. //элементами - string
  34. //С помощью range-based for преобразуйте все буквы в верхний регистр
  35. //а остальные символы должны остаться неизменными
  36. void f2() {
  37. std::vector<std::string> vs{ "123", "abc", "12345abc", "ABCDE", "abc_123_ABC" };
  38.  
  39. for (auto& str : vs) {
  40. std::cout << "Was: " << str << std::endl;
  41. std::locale loc;
  42. for (auto& ch : str) {
  43. ch = std::toupper(ch, loc);
  44. }
  45. std::cout << "Now: " << str << std::endl;
  46. }
  47. }
  48.  
  49. ///Задание 3. Создайте и с помощью списка инициализации заполните значениями
  50. //map таким образом, чтобы он содержал в качестве ключа букву, а в качестве значения
  51. //отсортированную по алфавиту совокупность слов (string), начинающихся с этой буквы
  52. //С помощью range-based for распечатайте содержимое, например: A: any, apple, away
  53. void f3() {
  54. std::map<char, std::set<std::string>> alphabetMap{ {'b', {"block", "bed", "book"} },{ 'a',{ "auto", "apple" } },{ 'c',{ "cow", "clock", "car" } } };
  55.  
  56. for (const std::pair<char, const std::set<std::string>>& elem : alphabetMap) {
  57. std::cout << "Char " << elem.first << ": ";
  58. for (const std::string& str : elem.second) {
  59. std::cout << str << ", ";
  60. }
  61. std::cout << std::endl;
  62. }
  63. }
  64.  
  65. ///Задание 4. создать функцию для вывода на печать элементов последовательностей
  66. template<typename T>
  67. void PrintAnyCont(const T& cont) {
  68. for (auto it = std::cbegin(cont); it != std::cend(cont); ++it) {
  69. std::cout << *it << ", ";
  70. }
  71. std::cout << std::endl;
  72. }
  73.  
  74. ///Задание 4а. создать функцию для инкремента элементов последовательностей, заданных ниже
  75. template<typename T>
  76. void IncAnyCont(T& cont) {
  77. for (auto it = std::begin(cont); it != std::end(cont); ++it) {
  78. (*it)++;
  79. std::cout << *it << ", ";
  80. }
  81. std::cout << std::endl;
  82. }
  83.  
  84. ///Задание 5.
  85. //создать функцию для "отрицания" значений, например:
  86. // было: {1, -2, 5}, стало: {-1, 2, -5})
  87. // изменение объектов типа std::string может выглядеть "aBc1" -> "AbC1"
  88. //элементов последовательностей, заданных ниже:
  89. std::string operator-(std::string& str) {
  90. std::locale loc;
  91. for (int i = 0; i < str.size(); ++i) {
  92. str[i] = std::isupper(str[i], loc) ? std::tolower(str[i], loc) : std::toupper(str[i], loc);
  93. }
  94. return str;
  95. }
  96.  
  97. template<typename T>
  98. void NegateAll(T& cont) {
  99. for (auto& elem : cont) {
  100. elem = -elem;
  101. std::cout << elem << ", ";
  102. }
  103. std::cout << std::endl;
  104. }
  105.  
  106. //Задание 5a. Реализовать функцию сортировки по модулю элементов последовательностей, заданных ниже
  107. //Собственно для сортировки можно использовать обобщенный алгоритм sort(),
  108. //а для задания условия - лямбда-функцию
  109. template<typename T>
  110. void absSort(T& cont) {
  111. std::sort(std::begin(cont), std::end(cont), [](const auto& l, const auto& r) { return abs(l) > abs(r); });
  112.  
  113. for (auto elem : cont) {
  114. std::cout << elem << ",";
  115. }
  116. std::cout << std::endl;
  117. }
  118.  
  119. //Задание 6.
  120. //напишите функцию, которая будет формировать и возвращать вектор, каждый элемент
  121. //которого является суммой элементов двух последовательностей
  122. //РАЗНОЙ длины и с элементами РАЗНОГО типа.
  123.  
  124. //Подсказка 1: так как последовательности могут быть разной длины, логично
  125. //сделать размер результирующего вектора максимальным из двух
  126.  
  127. //Подсказка 2: подумайте о возможности использования алгоритма transform(),
  128. //в котором трансформирующее действие удобно в свою очередь задавать лямбда-функцией
  129. template<typename T1, typename T2>
  130. auto SumCont(const T1& cont1, const T2& cont2) {
  131. std::vector<decltype(*(std::begin(cont1)) + *(std::begin(cont2)))> res;
  132. auto sum = [](const auto& a, const auto& b) { return a + b; };
  133. if (true) {
  134. res.assign(std::cbegin(cont1), std::cend(cont1));
  135. std::transform(std::cbegin(cont2), std::cend(cont2), std::cbegin(cont1), res.begin(), sum);
  136. }
  137. else {
  138. res.assign(std::cbegin(cont2), std::cend(cont2));
  139. std::transform(std::cbegin(cont1), std::cend(cont1), std::cbegin(cont2), res.begin(), sum);
  140. }
  141.  
  142. for (auto elem : res) {
  143. std::cout << elem << ",";
  144. }
  145. std::cout << std::endl;
  146.  
  147. return res;
  148. }
  149.  
  150. //Задание 7. Реализуйте функцию, которая принимает следующие парметры:
  151. //сформированную последовательность любого типа с элементами любого типа,
  152. //два (пустых) контейнера любого типа из vector, list, deque, set с элементами того же
  153. //типа, что и у сформированной последовательности
  154.  
  155. //Функция должна "разложить" значения заданной последовательности в два пустых контейнера
  156. //согласно заданному условию. Условие задать лябда-функцией
  157. //Исходная последовательность при этом не меняется
  158. template<typename T, typename C1, typename C2, typename P>
  159. void Separate(const T& src, C1& dst1, C2& dst2, const P& pred) {
  160.     for (const auto& elem : src) {
  161.         if ( pred(elem) ) {
  162.             dst1.insert(dst1.end(), elem);
  163.         }
  164.         else {
  165.                 dst2.insert(dst2.end(), elem);
  166.         }
  167.     }
  168.  
  169.     for (const auto& v : dst1) {
  170.         std::cout << v << ",";
  171.     }
  172.     std::cout << std::endl << "------------------------" << std::endl;
  173.     for (const auto& v : dst2) {
  174.         std::cout << v << ",";
  175.     }
  176. }
  177.  
  178. int main()
  179. {
  180. //Задание 1.
  181. //f1();
  182.  
  183. //Задание 2.
  184. {
  185. //f2();
  186.  
  187. }
  188.  
  189. ///Задание 3.
  190. {
  191. //f3();
  192. }
  193. /////////////////////////////////////////////////////////////////////
  194. ///Задание 4. создать функцию для вывода на печать элементов последовательностей, заданных ниже
  195. {
  196. std::vector<double> vd = { 1.1,2.2,3.3 };
  197. //PrintAnyCont(vd);
  198.  
  199. std::string s("abc");
  200. //PrintAnyCont(s);
  201.  
  202. int ar[] = { 1, 2, 3 };
  203. //PrintAnyCont(ar);
  204.  
  205. std::initializer_list<int> il{ 3,4,5 };
  206. //PrintAnyCont(il);
  207.  
  208. }
  209.  
  210. /////////////////////////////////////////////////////////////////////
  211. ///Задание 5.
  212. //создать функцию для "отрицания" значений
  213. {
  214. std::vector<double> vd{ 1.1,2.2,3.3 };
  215. //NegateAll(vd);
  216.  
  217. std::list<std::string> ls{ "aBc", "Qwerty", "n12" };
  218. //NegateAll(ls);
  219.  
  220. int ar[]{ 1, 2, 3 };
  221. //NegateAll(ar);
  222.  
  223. }
  224.  
  225.  
  226.  
  227.  
  228. ///Задание 4а. создать функцию для инкремента элементов последовательностей, заданных ниже
  229. {
  230. std::vector<double> vd = { 1.1, 2.2, 3.3 };
  231. //IncAnyCont(vd);
  232.  
  233.  
  234. int ar[] = { 1, 2, 3 };
  235. //IncAnyCont(ar);
  236.  
  237. std::string s("123");
  238. //IncAnyCont(s);
  239.  
  240. }
  241.  
  242. //////////////////////////////////////////////////////////////////////////////////
  243. //Задание 5a. Реализовать функцию сортировки по модулю элементов последовательностей, заданных ниже
  244. //Собственно для сортировки можно использовать обобщенный алгоритм sort(),
  245. //а для задания условия - лямбда-функцию
  246. {
  247. std::vector<double> vd = { -3.3, 2.2, -1.1 };
  248. //absSort(vd);
  249.  
  250.  
  251. int ar[] = { -3, 2, -1 };
  252. //absSort(ar);
  253.  
  254. }
  255.  
  256. //////////////////////////////////////////////////////////////////////////////////
  257. //Задание 6.
  258. //напишите функцию, которая будет формировать и возвращать вектор, каждый элемент
  259. //которого является суммой элементов двух последовательностей
  260. //РАЗНОЙ длины и с элементами РАЗНОГО типа.
  261. {
  262. std::vector<int> v{ 1,2,3,4 };
  263. std::list<double> l{ 1.1, 2.2, 3.3, 4.4, 5.5 };
  264.  
  265. //SumCont(v, l);
  266.  
  267.  
  268. std::list<int> ll{ 1, 2, 3, 4, 5, 6, 7, 8 };
  269. double ar[] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
  270. //SumCont(ar, ll);
  271.  
  272. }
  273.  
  274.  
  275.  
  276. //////////////////////////////////////////////////////////////////////////////////
  277. //Задание 7.
  278. {
  279. //Например:
  280.     std::vector<int> v{ 1,2,3,4,5 };
  281.     std::list<int> l; //сюда четные
  282.     std::deque<int> d; //а сюда нечетные
  283.     //Separate(v, l, d, [](auto val) { return !(val & 1); });
  284.  
  285. }
  286.  
  287.  
  288. //////////////////////////////////////////////////////////////////////////////////
  289. //Задание 8. C помощью алгоритма for_each()!!! (а не count_if()) посчитать сколько
  290. //букв в верхнем регистре
  291. // Использовать лямбда функцию
  292. {
  293.     char s[] = "Hello World!";
  294.     uint32_t count = 0;
  295.     std::for_each(std::cbegin(s), std::cend(s), [&count] (const auto& ch) { static std::locale loc; if ( std::isupper(ch, loc) ) count++; });
  296.     std::cout << count << std::endl;
  297.  
  298. }
  299.  
  300.  
  301. //////////////////////////////////////////////////////////////////////////////////
  302. //Задание 9a. Создайте класс, который должен быть "оберткой" для вектора с УНИКАЛЬНЫМИ значениями
  303. //любого типа.
  304. //Для хранения элементов используйте std::vector
  305.  
  306. //Реализуйте конструктор, который может принимать любое количество значений (значения могут повторяться)
  307. //Реализуйте метод добавления любого количества значений (значения могут повторяться)
  308. //Реализуйте метод удаления любого количества значений (значения могут повторяться)
  309. //Реализуйте метод сортировки, который будет принимать в качестве параметра признак по возрастанию / по убыванию
  310.  
  311.  
  312.  
  313.  
  314.  
  315. //Задание 9b. Модифицируйте класс из предыдущего задания (или создайте новый) таким образом,
  316. //чтобы значения не только были бы уникальными, но и находились в заданном диапазоне.
  317. //Замечание: такой класс в общем виде (для любых данных) смысла, наверно, не имеет, но его можно
  318. //использовать для таких типов данных, как целых, плавающих и тех пользовательских, для которых
  319. //имеют смысл операции сравнения (больше, меньше)
  320. //Подумайте: какие данные нужно добавить в класс и какие методы нужно модифицировать
  321.  
  322.  
  323. //////////////////////////////////////////////////////////////////////////////////
  324. //Задание 10*. Реализовать конвертацию enum в строковое представление - enumToString
  325. // и наоборот - stringToEnum
  326.  
  327. //Подсказки:
  328. //***********
  329. //1. Соответствующие именованным константам строки все равно нужно где-то хранить =>
  330. //1.1 Именованные константы в перечислении должны быть уникальными => соответствующие строки
  331. //тоже должны быть уникальными, => уникальные строки могут быть использованы в качестве
  332. //ключа в std::map
  333.  
  334. //1.2 а вот значения (соответствующие именованым константам)
  335. //могут быть любыми и даже могут повторяться (упрощаем задачу, считая, что значения НЕ повторяются)
  336. //=> подходит контейнер std::map<string,<значение> >
  337.  
  338. //1.3 Согласно стандарту С++11 переменные перечислимого типа могут быть разного размера и типа,
  339. //а хотелось бы обеспечить универсальную конвертацию
  340.  
  341. //***********
  342. //2. Так как типы перечислений разные, то enumToString и stringToEnum должны быть шаблонными
  343. //2.1 Пользователь может ошибиться или злонамеренно передать в функции значения, которым
  344. // ничего не соответствует => защита!
  345. //2.2 В функциях enumToString и stringToEnum (в зависимости от типа перечисления) нужно будет
  346. // анализировать соответствующий используемому типу перечисления контейнер
  347.  
  348.  
  349.  
  350. {
  351. //Например:
  352. /*
  353. COLORS c1;
  354. try {
  355. c1 = stringToEnum<COLORS>("blue");
  356. }
  357. catch (...)
  358. {
  359. //...
  360. }
  361.  
  362.  
  363. auto Str = enumToString(c1);
  364. */
  365. }
  366.  
  367. getchar();
  368.  
  369. return 0;
  370. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement