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


#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <cmath>
#include <limits>

using namespace std;

// Функция для округления (для C++98)
double myRound(double x) {
    if (x >= 0) return floor(x + 0.5);
    else return ceil(x - 0.5);
}

// Функция для очистки экрана
void clearScreen() {
    system("cls");
}

// Функция для паузы
void pause() {
    cout << "\n------------------------------------------¬\n";
    cout << "¦ Нажмите Enter для продолжения... ¦\n";
    cout << "L------------------------------------------";
    cin.ignore();
    cin.get();
}

// Функция для проверки диапазона
void checkRange(int &minVal, int &maxVal) {
    if (minVal > maxVal) {
        cout << "\n? Ошибка: минимум не может быть больше максимума!\n";
        cout << "Меняю их местами.\n";
        int temp = minVal;
        minVal = maxVal;
        maxVal = temp;
    }
}

void checkRange(double &minVal, double &maxVal) {
    if (minVal > maxVal) {
        cout << "\n? Ошибка: минимум не может быть больше максимума!\n";
        cout << "Меняю их местами.\n";
        double temp = minVal;
        minVal = maxVal;
        maxVal = temp;
    }
}

void checkRange(char &minVal, char &maxVal) {
    if (minVal > maxVal) {
        cout << "\n? Ошибка: минимум не может быть больше максимума!\n";
        cout << "Меняю их местами.\n";
        char temp = minVal;
        minVal = maxVal;
        maxVal = temp;
    }
}

// ====================== ЦЕЛЫЕ ЧИСЛА ======================
void processIntegerArray() {
    int dimType;
    cout << "\n------------------------------------------¬\n";
    cout << "¦ РАБОТА С ЦЕЛЫМИ ЧИСЛАМИ ¦\n";
    cout << "+-----------------------------------------+\n";
    cout << "¦ 1. Одномерный массив ¦\n";
    cout << "¦ 2. Двумерный массив ¦\n";
    cout << "L------------------------------------------\n";
    cout << "Ваш выбор: ";
    cin >> dimType;

    if (dimType == 1) {
        int size;
        cout << "\n> Введите размер одномерного массива: ";
        cin >> size;

        int minVal, maxVal;
        cout << "> Введите диапазон случайных значений\n";
        cout << " Минимум: ";
        cin >> minVal;
        cout << " Максимум: ";
        cin >> maxVal;
        checkRange(minVal, maxVal);

        vector<int> arr(size);
        cout << "\n---------- СГЕНЕРИРОВАННЫЙ МАССИВ ---------¬\n";
        cout << "¦ ";
        for (int i = 0; i < size; i++) {
            arr[i] = minVal + rand() % (maxVal - minVal + 1);
            cout << setw(4) << arr[i] << " ";
        }
        cout << "¦\n";
        cout << "L------------------------------------------\n";

        int choice;
        do {
            cout << "\n---------------- МЕНЮ (1D массив) ---------------¬\n";
            cout << "¦ 1. Найти максимум и его позиции ¦\n";
            cout << "¦ 2. Найти минимум и его позиции ¦\n";
            cout << "¦ 3. Найти среднее значение (округлённое) ¦\n";
            cout << "¦ 0. Вернуться в главное меню ¦\n";
            cout << "L----------------------------------------------\n";
            cout << "Ваш выбор: ";
            cin >> choice;

            if (choice == 1) {
                int maxValArr = arr[0];
                for (int i = 0; i < size; i++) {
                    if (arr[i] > maxValArr) maxValArr = arr[i];
                }
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Максимум: " << setw(6) << maxValArr << " ¦\n";
                cout << "¦ Позиции (по порядку): ";
                for (int i = 0; i < size; i++) {
                    if (arr[i] == maxValArr) cout << i + 1 << " ";
                }
                cout << " ¦\n";
                cout << "L----------------------------------\n";
            }
            else if (choice == 2) {
                int minValArr = arr[0];
                for (int i = 0; i < size; i++) {
                    if (arr[i] < minValArr) minValArr = arr[i];
                }
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Минимум: " << setw(6) << minValArr << " ¦\n";
                cout << "¦ Позиции (по порядку): ";
                for (int i = 0; i < size; i++) {
                    if (arr[i] == minValArr) cout << i + 1 << " ";
                }
                cout << " ¦\n";
                cout << "L----------------------------------\n";
            }
            else if (choice == 3) {
                double sum = 0;
                for (int i = 0; i < size; i++) sum += arr[i];
                int avg = (int)myRound(sum / size);
                int count = 0;
                for (int i = 0; i < size; i++) if (arr[i] == avg) count++;
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Среднее (округл.): " << setw(5) << avg << " ¦\n";
                cout << "¦ Повторяется: " << setw(5) << count << " раз(а) ¦\n";
                cout << "L----------------------------------\n";
            }
        } while (choice != 0);
    }
    else if (dimType == 2) {
        int rows, cols;
        cout << "\n> Введите количество строк: ";
        cin >> rows;
        cout << "> Введите количество столбцов: ";
        cin >> cols;

        int minVal, maxVal;
        cout << "> Введите диапазон случайных значений\n";
        cout << " Минимум: ";
        cin >> minVal;
        cout << " Максимум: ";
        cin >> maxVal;
        checkRange(minVal, maxVal);

        vector<vector<int> > matrix(rows, vector<int>(cols));
        cout << "\n---------- СГЕНЕРИРОВАННАЯ МАТРИЦА ---------¬\n";
        for (int i = 0; i < rows; i++) {
            cout << "¦ ";
            for (int j = 0; j < cols; j++) {
                matrix[i][j] = minVal + rand() % (maxVal - minVal + 1);
                cout << setw(5) << matrix[i][j];
            }
            cout << " ¦\n";
        }
        cout << "L------------------------------------------\n";

        int choice;
        do {
            cout << "\n---------------- МЕНЮ (2D массив) ---------------¬\n";
            cout << "¦ 1. Найти максимум и его позиции ¦\n";
            cout << "¦ 2. Найти минимум и его позиции ¦\n";
            cout << "¦ 3. Среднее арифметическое по строкам/столбцам¦\n";
            cout << "¦ 4. Среднее значение (округлённое) ¦\n";
            cout << "¦ 0. Вернуться в главное меню ¦\n";
            cout << "L----------------------------------------------\n";
            cout << "Ваш выбор: ";
            cin >> choice;

            if (choice == 1) {
                int maxValArr = matrix[0][0];
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] > maxValArr) maxValArr = matrix[i][j];
                    }
                }
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Максимум: " << setw(5) << maxValArr << " ¦\n";
                cout << "¦ Позиции (строка,столбец): ";
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] == maxValArr) cout << "(" << i + 1 << "," << j + 1 << ") ";
                    }
                }
                cout << "¦\n";
                cout << "L----------------------------------\n";
            }
            else if (choice == 2) {
                int minValArr = matrix[0][0];
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] < minValArr) minValArr = matrix[i][j];
                    }
                }
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Минимум: " << setw(5) << minValArr << " ¦\n";
                cout << "¦ Позиции (строка,столбец): ";
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] == minValArr) cout << "(" << i + 1 << "," << j + 1 << ") ";
                    }
                }
                cout << "¦\n";
                cout << "L----------------------------------\n";
            }
            else if (choice == 3) {
                cout << "\n---------- СРЕДНЕЕ ПО СТРОКАМ ---------¬\n";
                for (int i = 0; i < rows; i++) {
                    double sum = 0;
                    for (int j = 0; j < cols; j++) sum += matrix[i][j];
                    cout << "¦ Строка " << setw(2) << i + 1 << ": " << fixed << setprecision(2) << setw(8) << sum / cols << " ¦\n";
                }
                cout << "+-----------------------------------------+\n";
                cout << "¦ СРЕДНЕЕ ПО СТОЛБЦАМ ¦\n";
                for (int j = 0; j < cols; j++) {
                    double sum = 0;
                    for (int i = 0; i < rows; i++) sum += matrix[i][j];
                    cout << "¦ Столбец " << setw(2) << j + 1 << ": " << fixed << setprecision(2) << setw(8) << sum / rows << " ¦\n";
                }
                cout << "L------------------------------------------\n";
            }
            else if (choice == 4) {
                double sum = 0;
                int total = rows * cols;
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) sum += matrix[i][j];
                }
                int avg = (int)myRound(sum / total);
                int count = 0;
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] == avg) count++;
                    }
                }
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Среднее (округл.): " << setw(5) << avg << " ¦\n";
                cout << "¦ Повторяется: " << setw(5) << count << " раз(а) ¦\n";
                cout << "L----------------------------------\n";
            }
        } while (choice != 0);
    }
}

// ====================== ВЕЩЕСТВЕННЫЕ ЧИСЛА ======================
void processRealArray() {
    int precision;
    cout << "\n> Введите количество знаков после запятой: ";
    cin >> precision;

    int dimType;
    cout << "\n------------------------------------------¬\n";
    cout << "¦ РАБОТА С ВЕЩЕСТВЕННЫМИ ЧИСЛАМИ ¦\n";
    cout << "+-----------------------------------------+\n";
    cout << "¦ 1. Одномерный массив ¦\n";
    cout << "¦ 2. Двумерный массив ¦\n";
    cout << "L------------------------------------------\n";
    cout << "Ваш выбор: ";
    cin >> dimType;

    if (dimType == 1) {
        int size;
        cout << "\n> Введите размер одномерного массива: ";
        cin >> size;

        double minVal, maxVal;
        cout << "> Введите диапазон случайных значений\n";
        cout << " Минимум: ";
        cin >> minVal;
        cout << " Максимум: ";
        cin >> maxVal;
        checkRange(minVal, maxVal);

        vector<double> arr(size);
        cout << fixed << setprecision(precision);
        cout << "\n---------- СГЕНЕРИРОВАННЫЙ МАССИВ ---------¬\n";
        cout << "¦ ";
        for (int i = 0; i < size; i++) {
            arr[i] = minVal + (double)rand() / RAND_MAX * (maxVal - minVal);
            cout << setw(8) << arr[i] << " ";
        }
        cout << "¦\n";
        cout << "L------------------------------------------\n";

        int choice;
        do {
            cout << "\n---------------- МЕНЮ (1D массив) ---------------¬\n";
            cout << "¦ 1. Найти максимум и его позиции ¦\n";
            cout << "¦ 2. Найти минимум и его позиции ¦\n";
            cout << "¦ 0. Вернуться в главное меню ¦\n";
            cout << "L----------------------------------------------\n";
            cout << "Ваш выбор: ";
            cin >> choice;

            if (choice == 1) {
                double maxValArr = arr[0];
                for (int i = 0; i < size; i++) {
                    if (arr[i] > maxValArr) maxValArr = arr[i];
                }
                cout << fixed << setprecision(precision);
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Максимум: " << setw(8) << maxValArr << " ¦\n";
                cout << "¦ Позиции (по порядку): ";
                for (int i = 0; i < size; i++) {
                    if (arr[i] == maxValArr) cout << i + 1 << " ";
                }
                cout << " ¦\n";
                cout << "L----------------------------------\n";
            }
            else if (choice == 2) {
                double minValArr = arr[0];
                for (int i = 0; i < size; i++) {
                    if (arr[i] < minValArr) minValArr = arr[i];
                }
                cout << fixed << setprecision(precision);
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Минимум: " << setw(8) << minValArr << " ¦\n";
                cout << "¦ Позиции (по порядку): ";
                for (int i = 0; i < size; i++) {
                    if (arr[i] == minValArr) cout << i + 1 << " ";
                }
                cout << " ¦\n";
                cout << "L----------------------------------\n";
            }
        } while (choice != 0);
    }
    else if (dimType == 2) {
        int rows, cols;
        cout << "\n> Введите количество строк: ";
        cin >> rows;
        cout << "> Введите количество столбцов: ";
        cin >> cols;
        
        if (rows != cols) {
            cout << "\n? Для сравнения диагоналей нужна квадратная матрица!\n";
            return;
        }

        double minVal, maxVal;
        cout << "> Введите диапазон случайных значений\n";
        cout << " Минимум: ";
        cin >> minVal;
        cout << " Максимум: ";
        cin >> maxVal;
        checkRange(minVal, maxVal);

        vector<vector<double> > matrix(rows, vector<double>(cols));
        cout << fixed << setprecision(precision);
        cout << "\n---------- СГЕНЕРИРОВАННАЯ МАТРИЦА ---------¬\n";
        for (int i = 0; i < rows; i++) {
            cout << "¦ ";
            for (int j = 0; j < cols; j++) {
                matrix[i][j] = minVal + (double)rand() / RAND_MAX * (maxVal - minVal);
                cout << setw(9) << matrix[i][j];
            }
            cout << " ¦\n";
        }
        cout << "L------------------------------------------\n";

        int choice;
        do {
            cout << "\n---------------- МЕНЮ (2D массив) ---------------¬\n";
            cout << "¦ 1. Найти максимум и его позиции ¦\n";
            cout << "¦ 2. Найти минимум и его позиции ¦\n";
            cout << "¦ 3. Найти сумму по строкам и столбцам ¦\n";
            cout << "¦ 4. Сравнить сумму диагоналей ¦\n";
            cout << "¦ 0. Вернуться в главное меню ¦\n";
            cout << "L----------------------------------------------\n";
            cout << "Ваш выбор: ";
            cin >> choice;

            if (choice == 1) {
                double maxValArr = matrix[0][0];
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] > maxValArr) maxValArr = matrix[i][j];
                    }
                }
                cout << fixed << setprecision(precision);
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Максимум: " << setw(8) << maxValArr << " ¦\n";
                cout << "¦ Позиции (строка,столбец): ";
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] == maxValArr) cout << "(" << i + 1 << "," << j + 1 << ") ";
                    }
                }
                cout << "¦\n";
                cout << "L----------------------------------\n";
            }
            else if (choice == 2) {
                double minValArr = matrix[0][0];
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] < minValArr) minValArr = matrix[i][j];
                    }
                }
                cout << fixed << setprecision(precision);
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Минимум: " << setw(8) << minValArr << " ¦\n";
                cout << "¦ Позиции (строка,столбец): ";
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (matrix[i][j] == minValArr) cout << "(" << i + 1 << "," << j + 1 << ") ";
                    }
                }
                cout << "¦\n";
                cout << "L----------------------------------\n";
            }
            else if (choice == 3) {
                cout << fixed << setprecision(precision);
                cout << "\n---------- СУММА ПО СТРОКАМ ----------¬\n";
                for (int i = 0; i < rows; i++) {
                    double sum = 0;
                    for (int j = 0; j < cols; j++) sum += matrix[i][j];
                    cout << "¦ Строка " << setw(2) << i + 1 << ": " << setw(10) << sum << " ¦\n";
                }
                cout << "+-----------------------------------------+\n";
                cout << "¦ СУММА ПО СТОЛБЦАМ ¦\n";
                for (int j = 0; j < cols; j++) {
                    double sum = 0;
                    for (int i = 0; i < rows; i++) sum += matrix[i][j];
                    cout << "¦ Столбец " << setw(2) << j + 1 << ": " << setw(10) << sum << " ¦\n";
                }
                cout << "L------------------------------------------\n";
            }
            else if (choice == 4) {
                double mainDiag = 0, secondaryDiag = 0;
                for (int i = 0; i < rows; i++) {
                    mainDiag += matrix[i][i];
                    secondaryDiag += matrix[i][rows - 1 - i];
                }
                cout << fixed << setprecision(precision);
                cout << "\n----------- РЕЗУЛЬТАТ ----------¬\n";
                cout << "¦ Главная диагональ: " << setw(8) << mainDiag << " ¦\n";
                cout << "¦ Побочная диагональ: " << setw(7) << secondaryDiag << " ¦\n";
                cout << "+---------------------------------+\n";
                if (mainDiag > secondaryDiag)
                    cout << "¦ ? Главная диагональ БОЛЬШЕ ¦\n";
                else if (secondaryDiag > mainDiag)
                    cout << "¦ ? Побочная диагональ БОЛЬШЕ ¦\n";
                else
                    cout << "¦ ? Диагонали РАВНЫ ¦\n";
                cout << "L----------------------------------\n";
            }
        } while (choice != 0);
    }
}

// ====================== СИМВОЛЬНЫЙ ТИП ======================
void processCharArray() {
    int rows, cols;
    cout << "\n> Введите количество строк: ";
    cin >> rows;
    cout << "> Введите количество столбцов: ";
    cin >> cols;
    
    if (rows != cols) {
        cout << "\n? Для символьных операций нужна квадратная матрица!\n";
        return;
    }

    char minVal, maxVal;
    cout << "> Введите диапазон случайных символов\n";
    cout << " Минимум (например, A): ";
    cin >> minVal;
    cout << " Максимум (например, Z): ";
    cin >> maxVal;
    checkRange(minVal, maxVal);

    vector<vector<char> > matrix(rows, vector<char>(cols));
    cout << "\n---------- СГЕНЕРИРОВАННАЯ МАТРИЦА ---------¬\n";
    for (int i = 0; i < rows; i++) {
        cout << "¦ ";
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = minVal + rand() % (maxVal - minVal + 1);
            cout << " " << matrix[i][j] << " ";
        }
        cout << " ¦\n";
    }
    cout << "L------------------------------------------\n";

    int choice;
    do {
        cout << "\n---------------- МЕНЮ (СИМВОЛЫ) -----------------¬\n";
        cout << "¦ 1. Отобразить только диагонали ¦\n";
        cout << "¦ 2. Главная диагональ + элементы ПОД ней ¦\n";
        cout << "¦ 3. Главная диагональ + элементы НАД ней ¦\n";
        cout << "¦ 4. Побочная диагональ + элементы ПОД ней ¦\n";
        cout << "¦ 5. Побочная диагональ + элементы НАД ней ¦\n";
        cout << "¦ 0. Вернуться в главное меню ¦\n";
        cout << "L-----------------------------------------------\n";
        cout << "Ваш выбор: ";
        cin >> choice;

        cout << "\n---------- РЕЗУЛЬТАТ ---------¬\n";
        if (choice == 1) {
            for (int i = 0; i < rows; i++) {
                cout << "¦ ";
                for (int j = 0; j < cols; j++) {
                    if (i == j || i + j == rows - 1)
                        cout << " " << matrix[i][j] << " ";
                    else
                        cout << " ";
                }
                cout << " ¦\n";
            }
        }
        else if (choice == 2) {
            for (int i = 0; i < rows; i++) {
                cout << "¦ ";
                for (int j = 0; j < cols; j++) {
                    if (i == j || i > j)
                        cout << " " << matrix[i][j] << " ";
                    else
                        cout << " ";
                }
                cout << " ¦\n";
            }
        }
        else if (choice == 3) {
            for (int i = 0; i < rows; i++) {
                cout << "¦ ";
                for (int j = 0; j < cols; j++) {
                    if (i == j || i < j)
                        cout << " " << matrix[i][j] << " ";
                    else
                        cout << " ";
                }
                cout << " ¦\n";
            }
        }
        else if (choice == 4) {
            for (int i = 0; i < rows; i++) {
                cout << "¦ ";
                for (int j = 0; j < cols; j++) {
                    if (i + j == rows - 1 || i > j)
                        cout << " " << matrix[i][j] << " ";
                    else
                        cout << " ";
                }
                cout << " ¦\n";
            }
        }
        else if (choice == 5) {
            for (int i = 0; i < rows; i++) {
                cout << "¦ ";
                for (int j = 0; j < cols; j++) {
                    if (i + j == rows - 1 || i < j)
                        cout << " " << matrix[i][j] << " ";
                    else
                        cout << " ";
                }
                cout << " ¦\n";
            }
        }
        cout << "L----------------------------------\n";
    } while (choice != 0);
}

// ====================== ГЛАВНАЯ ФУНКЦИЯ ======================
int main() {
    srand(time(NULL));
    setlocale(LC_ALL, "Russian");

    int dataType;
    do {
        clearScreen();
        cout << "\nг=============================================¬\n";
        cout << "¦ ГЛАВНОЕ МЕНЮ ПРОГРАММЫ ¦\n";
        cout << "¦=============================================¦\n";
        cout << "¦ 1. Работа с ЦЕЛЫМИ числами ¦\n";
        cout << "¦ 2. Работа с ВЕЩЕСТВЕННЫМИ числами ¦\n";
        cout << "¦ 3. Работа с СИМВОЛЬНЫМ типом ¦\n";
        cout << "¦ 0. ВЫХОД из программы ¦\n";
        cout << "L=============================================-\n";
        cout << "Ваш выбор: ";
        cin >> dataType;

        switch (dataType) {
            case 1: processIntegerArray(); break;
            case 2: processRealArray(); break;
            case 3: processCharArray(); break;
            case 0: 
                cout << "\n------------------------------------------¬\n";
                cout << "¦ Спасибо за использование программы! ¦\n";
                cout << "¦ До свидания! ¦\n";
                cout << "L------------------------------------------\n";
                break;
            default: 
                cout << "\n------------------------------------------¬\n";
                cout << "¦ ? Неверный выбор! Попробуйте снова ¦\n";
                cout << "L------------------------------------------\n";
                pause();
        }
        if (dataType != 0 && dataType >= 1 && dataType <= 3) pause();
    } while (dataType != 0);

    return 0;
}