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


#include <iostream>
#include <cmath>

using namespace std;

int main() {
    // Настройка корректного отображения кириллицы в консоли
    setlocale(LC_ALL, "Russian");

    // ==========================================
    // ЧАСТЬ А (Одномерный массив в один проход)
    // ==========================================
    int size; 
    cout << "--- ЧАСТЬ А ---" << endl;
    cout << "Введите размер массива: ";
    cin >> size;

    double* mas = new double[size]; 

    cout << "Введите элементы массива через пробел: ";
    for (int i = 0; i < size; i++) {
        cin >> mas[i];
    }

    // Задание 1: Количество элементов, больших заданного числа
    double num; 
    cout << "Введите число для сравнения: ";
    cin >> num;
    
    int count = 0;
    for (int i = 0; i < size; i++) {
        if (mas[i] > num) {
            count++;
        }
    }
    cout << "1. Количество элементов больше " << num << ": " << count << endl;

    // Задание 2: Сумма элементов после минимального (в один проход)
    double min_el = mas[0]; 
    double sum = 0;         
    
    for (int i = 1; i < size; i++) {
        if (mas[i] < min_el) {
            min_el = mas[i];
            sum = 0; // Сбрасываем сумму, если нашли новый истинный минимум
        } else {
            sum += mas[i]; // Копим сумму элементов после текущего минимума
        }
    }
    cout << "2. Сумма элементов после минимального: " << sum << endl;

    // Задание 3: Сортировка по возрастанию модулей
    for (int i = 0; i < size - 1; i++) {
        for (int j = i + 1; j < size; j++) {
            if (abs(mas[j]) < abs(mas[i])) {
                double temp = mas[i]; 
                mas[i] = mas[j];
                mas[j] = temp;
            }
        }
    }

    cout << "3. Массив после сортировки модулей: ";
    for (int i = 0; i < size; i++) {
        cout << mas[i] << " ";
    }
    cout << endl << endl;

    delete[] mas; // Освобождаем память после Части А


    // ==========================================
    // ЧАСТЬ В (Циклический сдвиг ВСЕХ кругов матрицы)
    // ==========================================
    cout << "--- ЧАСТЬ В ---" << endl;
    
    int M, N, k;
    cout << "Введите число строк M и столбцов N матрицы (до 20): ";
    cin >> M >> N;

    double y[20][20]; // Статическая матрица по вашему первому образцу

    cout << "Введите элементы матрицы:" << endl;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            cin >> y[i][j];
        }
    }

    cout << "Введите величину сдвига k: ";
    cin >> k;

    // Вычисляем, сколько всего кругов (слоев) в матрице
    // Количество слоев равно половине от меньшей из сторон матрицы
    int num_layers = (M < N ? M : N) / 2;

    // Запускаем сдвиг для каждого слоя отдельно
    for (int layer = 0; layer < num_layers; layer++) {
        
        // Каждый слой сдвигаем ровно k раз
        for (int step = 0; step < k; step++) {
            // Текущие границы для выбранного слоя 'layer'
            int top = layer;
            int bottom = M - 1 - layer;
            int left = layer;
            int right = N - 1 - layer;

            // Запоминаем правый верхний угол текущего слоя
            double temp = y[top][right];

            // 1. Сдвигаем верхнюю строку слоя вправо
            for (int j = right; j > left; j--) {
                y[top][j] = y[top][j - 1];
            }

            // 2. Сдвигаем левый столбец слоя вверх
            for (int i = top; i < bottom; i++) {
                y[i][left] = y[i + 1][left];
            }

            // 3. Сдвигаем нижнюю строку слоя влево
            for (int j = left; j < right; j++) {
                y[bottom][j] = y[bottom][j + 1];
            }

            // 4. Сдвигаем правый столбец слоя вниз
            for (int i = bottom; i > top + 1; i--) {
                y[i][right] = y[i - 1][right];
            }

            // 5. Возвращаем сохраненный элемент на его новое место в правом столбце слоя
            y[top + 1][right] = temp;
        }
    }

    // Вывод итогового результата
    cout << "Матрица после контурного сдвига всех слоев:" << endl;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            cout << y[i][j] << "\t";
        }
        cout << endl;
    }

    return 0;
}