Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iomanip>
- #include <iostream>
- #include <random>
- #include <vector>
- using namespace std;
- template<typename T>
- T input(const char* prompt) {
- cout << prompt;
- T value{};
- cin >> value;
- cin.ignore(0x1000, '\n');
- return value;
- }
- template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
- double add(const T a, const T b) {
- return a + b;
- }
- template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
- double subtract(const T a, const T b) {
- return a - b;
- }
- template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
- double multiply(const T a, const T b) {
- return a * b;
- }
- template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
- double divide(const T a, const T b) {
- return a / b;
- }
- template<typename T, typename = enable_if_t<is_arithmetic<T>::value>>
- T divide_and_round(const T a, const T b) {
- if (is_integral<T>::value) return a / b;
- if (is_floating_point<T>::value) return round(a / b);
- }
- static double factorial(integral auto n) {
- return n <= 0 ? 1.0 : n * factorial(n - 1);
- }
- template<typename T, typename = enable_if_t<is_integral<T>::value>>
- void from_to(T a, T b) {
- if (a > b) swap(a, b);
- for (auto x = a; x <= b; ++x) cout << x << ' ';
- puts("");
- }
- template<typename T, typename = enable_if_t<is_integral<T>::value>>
- void create_random_array(const size_t length, T a, T b) {
- vector<T> sequence(length);
- if (a > b) swap(a, b);
- uniform_int_distribution<T> uid(a, b);
- const auto bytes = sizeof(T);
- if (bytes == 8) {
- mt19937_64 gen{ random_device()() };
- for (auto& value : sequence) {
- auto next = uid(gen);
- while (find(begin(sequence), end(sequence), next) != end(sequence)) {
- next = uid(gen);
- }
- }
- } else {
- mt19937 gen{ random_device()() };
- for (auto& value : sequence) {
- auto next = uid(gen);
- while (find(begin(sequence), end(sequence), next) != end(sequence)) {
- next = uid(gen);
- }
- value = next;
- }
- }
- for (auto value : sequence) cout << value << ' ';
- const auto min = *min_element(begin(sequence), end(sequence));
- cout << "\nМинимальное значение в массиве: " << min << '\n';
- }
- static void qraw_rectangle(const size_t w, const size_t h, const char out, const char in = ' ') {
- string top_bottom(w, out);
- string left_rigth(w, in);
- left_rigth.front() = left_rigth.back() = out;
- cout << top_bottom << '\n';
- if (h > 2) {
- const auto count = h - 2;
- for (size_t line = 1; line < count; ++line) cout << left_rigth << '\n';
- }
- cout << top_bottom << '\n';
- }
- static void calc() {
- while (true) {
- puts("1. Сложение");
- puts("2. Вычитание");
- puts("3. Умножение");
- puts("4. Деление");
- puts("5. Деление без остатка");
- puts("0. Назад");
- bool flag = true;
- const auto choice = input<int>("Ваш выбор: ");
- if (!choice) return;
- const auto a = input<double>("Первое число: ");
- const auto b = input<double>("Второе число: ");
- double result;
- switch (choice) {
- case 1: result = add(a, b); break;
- case 2: result = subtract(a, b); break;
- case 3: result = multiply(a, b); break;
- case 4: result = divide(a, b); break;
- case 5: result = divide_and_round(a, b); break;
- default:
- flag = false;
- puts("\aОшибка выбора!");
- }
- if (flag) cout << "Результат: " << result << '\n';
- }
- }
- static void creat_rectangle() {
- while (true) {
- puts("1. Блок");
- puts("2. Контур");
- puts("3. С заполнителем");
- puts("0. Назад");
- const auto choice = input<int>("Ваш выбор: ");
- if (!choice) return;
- const auto width = input<size_t>("Ширина: ");
- const auto height = input<size_t>("Высота: ");
- char out, in;
- switch (choice) {
- case 1:
- out = input<char>("Заполнитель: ");
- qraw_rectangle(width, height, out, out);
- break;
- case 2:
- out = input<char>("Контур: ");
- qraw_rectangle(width, height, out);
- break;
- case 3:
- out = input<char>("Контур: ");
- in = input<char>("Заполнитель: ");
- qraw_rectangle(width, height, out, in);
- break;
- default:
- puts("\aОшибка выбора!");
- }
- }
- }
- static void run() {
- while (true) {
- puts("1. Калькулятор");
- puts("2. Факториал");
- puts("3. Последовательность целых чисел");
- puts("4. Прямоугольник");
- puts("5. Массив случайных значений");
- puts("0. Выход из программы");
- const auto choice = input<int>("Ваш выбор: ");
- switch (choice) {
- case 0: return;
- case 1: calc(); break;
- case 2: {
- auto n = input<unsigned>("Натуральное число: ");
- cout << n << "! = " << factorial(n) << '\n';
- break;
- }
- case 3: {
- auto a = input<int>("Левое значение: ");
- auto b = input<int>("Правое значение: ");
- from_to(a, b);
- break;
- }
- case 4: creat_rectangle(); break;
- case 5: {
- const auto length = input<size_t>("Размер массива: ");
- auto max = input<int>("Максимальное значение: ");
- auto min = (max - static_cast<int>(length)) >> 1;
- create_random_array(length, min, max);
- break;
- }
- default: puts("\aОшибка выбора!");
- }
- }
- }
- int main() {
- system("chcp 1251 > nul");
- run();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement