#include <iostream>
#include <vector>
#include <iomanip> // Для красивого вывода
using namespace std;
// Структура для возврата двух значений из функции
struct Averages {
double topRight;
double bottomLeft;
};
// Функция вычисления среднего арифметического заштрихованных областей
Averages calculateAverages(const vector<vector<int>>& matrix) {
int n = matrix.size();
if (n == 0) return {0.0, 0.0};
int m = matrix[0].size();
// Определяем границы четвертей
int midRow = n / 2;
int midCol = m / 2;
// Переменные для сумм и количества элементов
long long sumTopRight = 0;
int countTopRight = 0;
long long sumBottomLeft = 0;
int countBottomLeft = 0;
// Проходим по всей матрице
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// Проверяем: находится ли элемент в ВЕРХНЕЙ ПРАВОЙ области
// Условие: строка в верхней половине И столбец в правой половине
if (i < midRow && j >= midCol) {
sumTopRight += matrix[i][j];
countTopRight++;
}
// Проверяем: находится ли элемент в НИЖНЕЙ ЛЕВОЙ области
// Условие: строка в нижней половине И столбец в левой половине
// (Обратите внимание: для нечетных размеров остаток от деления
// лучше отнести к одной из областей, здесь мы используем строгое деление)
else if (i >= midRow && j < midCol) {
sumBottomLeft += matrix[i][j];
countBottomLeft++;
}
}
}
Averages result;
// Вычисляем среднее (с защитой от деления на ноль, если матрица слишком мала)
result.topRight = (countTopRight > 0) ? (double)sumTopRight / countTopRight : 0.0;
result.bottomLeft = (countBottomLeft > 0) ? (double)sumBottomLeft / countBottomLeft : 0.0;
return result;
}
int main() {
// Пример: матрица 4x4 (чтобы удобно делилась на 4 части)
// N = 4, M = 4
vector<vector<int>> matrix = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
cout << "Исходная матрица:" << endl;
for (const auto& row : matrix) {
for (int val : row) {
cout << setw(4) << val;
}
cout << endl;
}
// Вызов функции
Averages avg = calculateAverages(matrix);
cout << "\nРезультаты:" << endl;
cout << "Среднее арифметическое верхней заштрихованной области (правый верх): " << avg.topRight << endl;
cout << "Среднее арифметическое нижней заштрихованной области (левый низ): " << avg.bottomLeft << endl;
return 0;
}