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


#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

// ЗАДАНИЕ 1: Функция, формирующая массив минимальных по модулю элементов нечетных столбцов
int* getMinAbsOddCols(int** matrix, int N, int M, int& resSize) {
    // Вычисляем, сколько будет нечетных столбцов (индексы 0, 2, 4...)
    resSize = (M + 1) / 2; 
    int* result = new int[resSize]; // Создаем динамический массив под результат
    int resIndex = 0;

    for (int j = 0; j < M; j += 2) { // Шагаем по столбцам через один
        int minAbs = abs(matrix[0][j]); // Сначала считаем минимумом первый элемент столбца
        
        for (int i = 1; i < N; i++) { // Проходим по строкам этого столбца
            if (abs(matrix[i][j]) < minAbs) {
                minAbs = abs(matrix[i][j]); // Если нашли модуль меньше, обновляем минимум
            }
        }
        result[resIndex] = minAbs; // Сохраняем найденный минимум в массив
        resIndex++;
    }
    return result; // Возвращаем готовый массив
}

// ЗАДАНИЕ 2: Функция, возвращающая среднее арифметическое (+) и (-) в заштрихованной области
void getAverages(int** matrix, int N, int M, double& avgPos, double& avgNeg) {
    int sumPos = 0, countPos = 0;
    int sumNeg = 0, countNeg = 0;

    // Заштрихованная область - верхняя половина матрицы
    int halfN = N / 2;

    for (int i = 0; i < halfN; i++) { // Идем только до середины строк
        for (int j = 0; j < M; j++) { // Идем по всем столбцам
            if (matrix[i][j] > 0) {
                sumPos += matrix[i][j];
                countPos++;
            } else if (matrix[i][j] < 0) {
                sumNeg += matrix[i][j];
                countNeg++;
            }
        }
    }

    // Вычисляем среднее (сумма делится на количество). 
    // Проверяем, что счетчик больше нуля, чтобы не было деления на ноль.
    if (countPos > 0) avgPos = (double)sumPos / countPos;
    else avgPos = 0;

    if (countNeg > 0) avgNeg = (double)sumNeg / countNeg;
    else avgNeg = 0;
}

int main() {
    setlocale(LC_ALL, "Russian");
    srand((unsigned int)time(NULL));

    int N, M;
    cout << "Введите количество строк N: ";
    cin >> N;
    cout << "Введите количество столбцов M: ";
    cin >> M;

    // 1. Создание динамической матрицы NxM
    // Сначала создаем массив указателей (строки), потом под каждую строку выделяем память (столбцы)
    int** matrix = new int*[N];
    for (int i = 0; i < N; i++) {
        matrix[i] = new int[M];
    }

    cout << "\nСгенерированная матрица:\n";
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            matrix[i][j] = rand() % 41 - 20; // Числа от -20 до 20
            cout << matrix[i][j] << "\t";
        }
        cout << "\n";
    }

    // --- ВЫПОЛНЕНИЕ ЗАДАНИЯ 1 ---
    int resSize = 0;
    // Вызываем функцию. Она возвращает указатель на новый массив, а размер записывает в resSize
    int* minAbsArray = getMinAbsOddCols(matrix, N, M, resSize);
    
    cout << "\nМассив минимальных по модулю значений нечетных столбцов:\n";
    for (int i = 0; i < resSize; i++) {
        cout << minAbsArray[i] << " ";
    }
    cout << "\n";

    // --- ВЫПОЛНЕНИЕ ЗАДАНИЯ 2 ---
    double avgPos = 0, avgNeg = 0;
    // Передаем переменные, чтобы функция записала в них ответы напрямую (через ссылки)
    getAverages(matrix, N, M, avgPos, avgNeg);

    cout << "\nЗаштрихованная область (верхняя половина):\n";
    cout << "Среднее арифметическое положительных: " << avgPos << "\n";
    cout << "Среднее арифметическое отрицательных: " << avgNeg << "\n";

    // 2. Очистка памяти (очень важно для динамических структур!)
    delete[] minAbsArray; // Удаляем массив из первой задачи
    for (int i = 0; i < N; i++) {
        delete[] matrix[i]; // Удаляем каждую строку матрицы
    }
    delete[] matrix; // Удаляем массив указателей

    return 0;
}