fork download
  1. #include <iostream>
  2. #include <array>
  3. #include <random>
  4. #include <numeric>
  5. #include <algorithm>
  6. #include <iterator>
  7.  
  8. template <class Result, class It>
  9. Result avg(It begin,
  10. It end)
  11. {
  12. auto sum = std::accumulate(begin,
  13. end,
  14. Result{});
  15. auto size = std::distance(begin, end);
  16. return sum / size;
  17. }
  18.  
  19. thread_local std::mt19937 gen{std::random_device{}()};
  20.  
  21. // https://d...content-available-to-author-only...q.cc/post/180/nie-uzywaj-rand-cxx-ma-random/
  22. template<typename T>
  23. T random(T min, T max) {
  24. using dist = std::conditional_t<
  25. std::is_integral<T>::value,
  26. std::uniform_int_distribution<T>,
  27. std::uniform_real_distribution<T>
  28. >;
  29. return dist{min, max}(gen);
  30. }
  31.  
  32. template <class It, class T = typename std::iterator_traits<It>::value_type>
  33. void fillWithRandomData(It begin,
  34. It end,
  35. T min,
  36. T max)
  37. {
  38. std::generate(begin, end, [&]() {
  39. return random(min, max);
  40. });
  41. }
  42.  
  43. template <class It, class UnaryPredicate>
  44. void print(It begin,
  45. It end,
  46. UnaryPredicate pred)
  47. {
  48. std::copy_if(begin,
  49. end,
  50. std::ostream_iterator<typename std::iterator_traits<It>::value_type>(std::cout, "\n"),
  51. pred);
  52. }
  53.  
  54. template <class It>
  55. void printMinMax(It begin,
  56. It end)
  57. {
  58. auto minmax = std::minmax_element(begin, end);
  59. std::cout
  60. << "Min: " << *(minmax.first) << "\n"
  61. << "Max: " << *(minmax.second) << "\n";
  62.  
  63. }
  64.  
  65. template <class It>
  66. void printMatrixMinMax(It begin,
  67. It end)
  68. {
  69. using Type = typename std::iterator_traits<It>::value_type;
  70. std::vector<typename Type::value_type> buffer;
  71. std::for_each(begin,
  72. end,
  73. [&](auto elem) {
  74. auto minmax = std::minmax_element(elem.begin(), elem.end());
  75. buffer.push_back(*(minmax.first));
  76. buffer.push_back(*(minmax.second));
  77. });
  78.  
  79. auto minmax = std::minmax_element(buffer.begin(), buffer.end());
  80. std::cout
  81. << "Min = " << *(minmax.first) << "\n"
  82. << "Max = " << *(minmax.second) << "\n";
  83. }
  84.  
  85. template <class Result, class It>
  86. Result sumDiagonalMatrix(It begin,
  87. It end)
  88. {
  89. Result result{};
  90. auto size = std::distance(begin, end);
  91. auto iter = begin;
  92. for (auto i = 0; i < size; ++i) {
  93. auto tmp = *iter;
  94. result += *(std::next(tmp.begin(), i));
  95. std::advance(iter, 1);
  96. }
  97. return result;
  98. }
  99.  
  100. int main()
  101. {
  102. // 1.
  103. std::array<int, 8> foo {1, 2, 3, 4, 5, 6, 7, 8};
  104. auto average = avg<double>(foo.begin(), foo.end());
  105. std::cout << "Avg = " << average << "\n";
  106. if (average < 5.0) {
  107. std::cout << "< 5.0\n";
  108. } else if (average > 5.0) {
  109. std::cout << "> 5.0\n";
  110. } else {
  111. std::cout << "== 5.0\n";
  112. }
  113.  
  114. // 2.
  115. std::array<int, 10> bar;
  116. fillWithRandomData(bar.begin(),
  117. bar.end(),
  118. 1,
  119. 500);
  120. print(bar.begin(),
  121. bar.end(),
  122. [](auto elem) {
  123. return elem % 6 == 0;
  124. });
  125.  
  126. // 3.
  127. std::array<int, 20> simple;
  128. fillWithRandomData(simple.begin(),
  129. simple.end(),
  130. 10,
  131. 50);
  132. printMinMax(simple.begin(), simple.end());
  133.  
  134. // 5.
  135. std::array<std::array<int, 3>, 3> matrix;
  136.  
  137. for (auto& elem : matrix) {
  138. fillWithRandomData(elem.begin(),
  139. elem.end(),
  140. 0,
  141. 100);
  142. }
  143.  
  144. printMatrixMinMax(matrix.begin(), matrix.end());
  145.  
  146. // 6.
  147. std::array<std::array<int, 3>, 3> matrix2;
  148.  
  149. for (auto& elem : matrix2) {
  150. fillWithRandomData(elem.begin(),
  151. elem.end(),
  152. 0,
  153. 100);
  154. }
  155.  
  156. auto sum = sumDiagonalMatrix<int>(matrix2.begin(),
  157. matrix2.end());
  158. std::cout << "Diagonal sum = " << sum << "\n";
  159. }
Success #stdin #stdout 0s 4476KB
stdin
Standard input is empty
stdout
Avg = 4.5
< 5.0
462
42
36
Min: 12
Max: 50
Min = 4
Max = 92
Diagonal sum = 204