Загрузка данных


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <clocale>
#include <cmath>
#include <ctime>
#include <cstdlib>

using namespace std;

// 1. Калькулятор базовых операций
void runCalculator() {
    cout << "\n--- КАЛЬКУЛЯТОР ---" << endl;
    double a = 0, b = 0;
    char op = '+';
    cout << "Введите первое число: ";
    cin >> a;
    cout << "Введите операцию (+, -, *, /): ";
    cin >> op;
    cout << "Введите второе число: ";
    cin >> b;

    if (op == '+') {
        cout << "Результат: " << (a + b) << endl;
    } else if (op == '-') {
        cout << "Результат: " << (a - b) << endl;
    } else if (op == '*') {
        cout << "Результат: " << (a * b) << endl;
    } else if (op == '/') {
        if (b != 0) {
            cout << "Результат: " << (a / b) << endl;
        } else {
            cout << "Ошибка: деление на ноль!" << endl;
        }
    } else {
        cout << "Неизвестная операция!" << endl;
    }
}

// 2. Работа с одномерным массивом (генерация, поиск мин/макс, сортировка, сумма)
void runArrayDemo() {
    cout << "\n--- РАБОТА С МАССИВОМ ---" << endl;
    int n = 0;
    cout << "Введите размер массива (от 1 до 100): ";
    cin >> n;

    if (n <= 0 || n > 100) {
        cout << "Некорректный размер, установлен размер по умолчанию: 10" << endl;
        n = 10;
    }

    vector<int> arr(n);
    srand(static_cast<unsigned int>(time(0)));

    cout << "Сгенерированный массив: ";
    int sum = 0;
    for (int i = 0; i < n; i++) {
        arr[i] = rand() % 100 - 20; // числа от -20 до 79
        cout << arr[i] << " ";
        sum += arr[i];
    }
    cout << endl;

    int minVal = arr[0];
    int maxVal = arr[0];
    for (int i = 1; i < n; i++) {
        if (arr[i] < minVal) minVal = arr[i];
        if (arr[i] > maxVal) maxVal = arr[i];
    }

    double avg = static_cast<double>(sum) / n;

    cout << "Сумма элементов: " << sum << endl;
    cout << "Среднее арифметическое: " << avg << endl;
    cout << "Минимум: " << minVal << ", Максимум: " << maxVal << endl;

    // Сортировка пузырьком (классика для лаб)
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

    cout << "Отсортированный массив: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

// 3. Работа с двумерным массивом (матрицей)
void runMatrixDemo() {
    cout << "\n--- РАБОТА С МАТРИЦЕЙ ---" << endl;
    int rows = 3, cols = 3;
    cout << "Введите количество строк и столбцов (например, 3 3): ";
    cin >> rows >> cols;

    if (rows <= 0 || rows > 20 || cols <= 0 || cols > 20) {
        cout << "Размер скорректирован до 3x3." << endl;
        rows = 3;
        cols = 3;
    }

    vector<vector<int>> matrix(rows, vector<int>(cols));
    srand(static_cast<unsigned int>(time(0)));

    cout << "\nИсходная матрица:\n";
    int mainDiagSum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = rand() % 50 + 1;
            cout << matrix[i][j] << "\t";
            if (i == j) {
                mainDiagSum += matrix[i][j];
            }
        }
        cout << endl;
    }

    if (rows == cols) {
        cout << "Сумма элементов главной диагонали: " << mainDiagSum << endl;
    }
}

// 4. Работа со строками
void runStringDemo() {
    cout << "\n--- РАБОТА СО СТРОКОЙ ---" << endl;
    cout << "Введите любую строку (на английском или русском): ";
    string text;
    cin >> ws; // Очистка пробелов и переводов строки из буфера
    getline(cin, text);

    cout << "Вы ввели: " << text << endl;
    cout << "Длина строки (в байтах/символах): " << text.length() << endl;

    string reversed = text;
    reverse(reversed.begin(), reversed.end());
    cout << "Строка наоборот: " << reversed << endl;
}

// 5. Решение квадратного уравнения ax^2 + bx + c = 0
void runQuadraticSolver() {
    cout << "\n--- КВАДРАТНОЕ УРАВНЕНИЕ (ax^2 + bx + c = 0) ---" << endl;
    double a = 0, b = 0, c = 0;
    cout << "Введите коэффициенты a, b, c через пробел: ";
    cin >> a >> b >> c;

    if (a == 0) {
        if (b != 0) {
            cout << "Это линейное уравнение. Корень x = " << (-c / b) << endl;
        } else {
            cout << "Некорректное уравнение (a = 0 и b = 0)." << endl;
        }
        return;
    }

    double d = b * b - 4 * a * c;
    cout << "Дискриминант D = " << d << endl;

    if (d > 0) {
        double x1 = (-b + sqrt(d)) / (2 * a);
        double x2 = (-b - sqrt(d)) / (2 * a);
        cout << "Два корня: x1 = " << x1 << ", x2 = " << x2 << endl;
    } else if (d == 0) {
        double x = -b / (2 * a);
        cout << "Один корень: x = " << x << endl;
    } else {
        cout << "Действительных корней нет (D < 0)." << endl;
    }
}

int main() {
    // Включаем поддержку русского языка в консоли
    setlocale(LC_ALL, "Russian");

    int choice = -1;
    while (choice != 0) {
        cout << "\n==========================================" << endl;
        cout << "      УНИВЕРСАЛЬНАЯ ПРОГРАММА НА C++      " << endl;
        cout << "==========================================" << endl;
        cout << "1. Калькулятор (+, -, *, /)" << endl;
        cout << "2. Одномерный массив (генерация, сортировка, сумма)" << endl;
        cout << "3. Двумерный массив / Матрица" << endl;
        cout << "4. Обработка строк" << endl;
        cout << "5. Решение квадратного уравнения" << endl;
        cout << "0. Выход из программы" << endl;
        cout << "------------------------------------------" << endl;
        cout << "Выберите пункт меню: ";

        if (!(cin >> choice)) {
            // Защита от ввода букв вместо цифр
            cin.clear();
            cin.ignore(10000, '\n');
            cout << "Ошибка ввода! Пожалуйста, введите число от 0 до 5." << endl;
            choice = -1;
            continue;
        }

        switch (choice) {
            case 1:
                runCalculator();
                break;
            case 2:
                runArrayDemo();
                break;
            case 3:
                runMatrixDemo();
                break;
            case 4:
                runStringDemo();
                break;
            case 5:
                runQuadraticSolver();
                break;
            case 0:
                cout << "Выход из программы..." << endl;
                break;
            default:
                cout << "Неверный пункт меню! Попробуйте снова." << endl;
                break;
        }
    }

    cout << "\nНажмите Enter, чтобы закрыть окно...";
    cin.ignore(10000, '\n');
    cin.get();

    return 0;
}