Загрузка данных
#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;
}