Advertisement
NickAndNick

otvet.mail.ru/question/236606131

Jan 17th, 2024 (edited)
1,150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.22 KB | Software | 0 0
  1. #include <algorithm>
  2. #include <iomanip>
  3. #include <iostream>
  4. #include <random>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. template<typename T>
  10. T input(const char* prompt) {
  11.     cout << prompt;
  12.     T value{};
  13.     cin >> value;
  14.     cin.ignore(0x1000, '\n');
  15.     return value;
  16. }
  17.  
  18. template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
  19. double add(const T a, const T b) {
  20.     return a + b;
  21. }
  22.  
  23. template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
  24. double subtract(const T a, const T b) {
  25.     return a - b;
  26. }
  27.  
  28. template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
  29. double multiply(const T a, const T b) {
  30.     return a * b;
  31. }
  32.  
  33. template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
  34. double divide(const T a, const T b) {
  35.     return a / b;
  36. }
  37.  
  38. template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
  39. T divide_and_round(const T a, const T b) {
  40.     if (is_integral<T>::value) return a / b;
  41.     if (is_floating_point<T>::value) return round(a / b);
  42. }
  43.  
  44. static double factorial(integral auto n) {
  45.     return n <= 0 ? 1.0 : n * factorial(n - 1);
  46. }
  47.  
  48. template<typename T, typename = enable_if_t<is_integral<T>::value>>
  49. void from_to(T a, T b) {
  50.     if (a > b) swap(a, b);
  51.     for (auto x = a; x <= b; ++x) cout << x << ' ';
  52.     puts("");
  53. }
  54.  
  55. template<typename T, typename = enable_if_t<is_integral<T>::value>>
  56. void create_random_array(const size_t length, T a, T b) {
  57.     vector<T> sequence(length);
  58.     if (a > b) swap(a, b);
  59.     uniform_int_distribution<T> uid(a, b);
  60.     const auto bytes = sizeof(T);
  61.     if (bytes == 8) {
  62.         mt19937_64 gen{ random_device()() };
  63.         for (auto& value : sequence) {
  64.             auto next = uid(gen);
  65.             while (find(begin(sequence), end(sequence), next) != end(sequence)) {
  66.                 next = uid(gen);
  67.             }
  68.         }
  69.     } else {
  70.         mt19937 gen{ random_device()() };
  71.         for (auto& value : sequence) {
  72.             auto next = uid(gen);
  73.             while (find(begin(sequence), end(sequence), next) != end(sequence)) {
  74.                 next = uid(gen);
  75.             }
  76.             value = next;
  77.         }
  78.     }
  79.     for (auto value : sequence) cout << value << ' ';
  80.     const auto min = *min_element(begin(sequence), end(sequence));
  81.     cout << "\nМинимальное значение в массиве: " << min << '\n';
  82. }
  83.  
  84. static void qraw_rectangle(const size_t w, const size_t h, const char out, const char in = ' ') {
  85.     string top_bottom(w, out);
  86.     string left_rigth(w, in);
  87.     left_rigth.front() = left_rigth.back() = out;
  88.     cout << top_bottom << '\n';
  89.     if (h > 2) {
  90.         const auto count = h - 2;
  91.         for (size_t line = 1; line < count; ++line) cout << left_rigth << '\n';
  92.     }
  93.     cout << top_bottom << '\n';
  94. }
  95.  
  96. static void calc() {
  97.     while (true) {
  98.         puts("1. Сложение");
  99.         puts("2. Вычитание");
  100.         puts("3. Умножение");
  101.         puts("4. Деление");
  102.         puts("5. Деление без остатка");
  103.         puts("0. Назад");
  104.         bool flag = true;
  105.         const auto choice = input<int>("Ваш выбор: ");
  106.         if (!choice) return;
  107.         const auto a = input<double>("Первое число: ");
  108.         const auto b = input<double>("Второе число: ");
  109.         double result;
  110.         switch (choice) {
  111.         case 1: result = add(a, b); break;
  112.         case 2: result = subtract(a, b); break;
  113.         case 3: result = multiply(a, b); break;
  114.         case 4: result = divide(a, b); break;
  115.         case 5: result = divide_and_round(a, b); break;
  116.         default:
  117.             flag = false;
  118.             puts("\aОшибка выбора!");
  119.         }
  120.         if (flag) cout << "Результат: " << result << '\n';
  121.     }
  122. }
  123.  
  124. static void creat_rectangle() {
  125.     while (true) {
  126.         puts("1. Блок");
  127.         puts("2. Контур");
  128.         puts("3. С заполнителем");
  129.         puts("0. Назад");
  130.         const auto choice = input<int>("Ваш выбор: ");
  131.         if (!choice) return;
  132.         const auto width = input<size_t>("Ширина: ");
  133.         const auto height = input<size_t>("Высота: ");
  134.         char out, in;
  135.         switch (choice) {
  136.         case 1:
  137.             out = input<char>("Заполнитель: ");
  138.             qraw_rectangle(width, height, out, out);
  139.             break;
  140.         case 2:
  141.             out = input<char>("Контур: ");
  142.             qraw_rectangle(width, height, out);
  143.             break;
  144.         case 3:
  145.             out = input<char>("Контур: ");
  146.             in = input<char>("Заполнитель: ");
  147.             qraw_rectangle(width, height, out, in);
  148.             break;
  149.         default:
  150.             puts("\aОшибка выбора!");
  151.         }
  152.     }
  153. }
  154.  
  155. static void run() {
  156.     while (true) {
  157.         puts("1. Калькулятор");
  158.         puts("2. Факториал");
  159.         puts("3. Последовательность целых чисел");
  160.         puts("4. Прямоугольник");
  161.         puts("5. Массив случайных значений");
  162.         puts("0. Выход из программы");
  163.         const auto choice = input<int>("Ваш выбор: ");
  164.         switch (choice) {
  165.         case 0: return;
  166.         case 1: calc(); break;
  167.         case 2: {
  168.             auto n = input<unsigned>("Натуральное число: ");
  169.             cout << n << "! = " << factorial(n) << '\n';
  170.             break;
  171.         }
  172.         case 3: {
  173.             auto a = input<int>("Левое значение: ");
  174.             auto b = input<int>("Правое значение: ");
  175.             from_to(a, b);
  176.             break;
  177.         }
  178.         case 4: creat_rectangle(); break;
  179.         case 5: {
  180.             const auto length = input<size_t>("Размер массива: ");
  181.             auto max = input<int>("Максимальное значение: ");
  182.             auto min = (max - static_cast<int>(length)) >> 1;
  183.             create_random_array(length, min, max);
  184.             break;
  185.         }
  186.         default: puts("\aОшибка выбора!");
  187.         }
  188.     }
  189. }
  190.  
  191. int main() {
  192.     system("chcp 1251 > nul");
  193.     run();
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement