#include <stdio.h>

const int maxSize = 100;

void inputMatr(int matrix[maxSize][maxSize], int *n, int *m)
{
    do
    {
        printf("Введите кол-во строк в матрице: ");
        scanf("%d", &*n);
    } while (*n <= 0);
    do
    {
        printf("Введите кол-во столбцов в матрице: ");
        scanf("%d", &*m);
    } while (*m <= 0);

    printf("Введите значения матрицы: ");
    for (int i = 0; i < *n; i++)
        for (int j = 0; j < *m; j++)
            scanf("%d", &matrix[i][j]);
}
void outputMatr(int matrix[maxSize][maxSize], int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            printf("%d ", matrix[i][j]);
        printf("\n");
    }
}
int sumMatr(int matrix[maxSize][maxSize], int n, int m)
{
    int sum = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            sum += matrix[i][j];

    return sum;
}
double srArif(int matrix[maxSize][maxSize], int n, int m)
{
    double sum = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            sum += matrix[i][j];

    return sum / (n * m);
}
double srArifCh(int matrix[maxSize][maxSize], int n, int m)
{
    double sum = 0, count = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j += 2)
        {
            sum += matrix[i][j];
            count++;
        }

    return sum / count;
}
double srArifnaNechStr(int matrix[maxSize][maxSize], int n, int m)
{
    double sum = 0, count = 0;
    for (int i = 1; i < n; i += 2)
        for (int j = 0; j < m; j++)
        {
            sum += matrix[i][j];
            count++;
        }

    return sum / count;
}
int minElMatr(int matrix[maxSize][maxSize], int n, int m)
{
    int min = matrix[0][0];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (matrix[i][j] < min)
                min = matrix[i][j];

    return min;
}
int maxElMatr(int matrix[maxSize][maxSize], int n, int m)
{
    int max = matrix[0][0];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (matrix[i][j] > max)
                max = matrix[i][j];

    return max;
}
void zeroBelowSrAr(int matrix[maxSize][maxSize], int n, int m)
{
    int srAr = srArif(matrix, n, m);
    int matr[maxSize][maxSize];

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (matrix[i][j] < srAr)
                matr[i][j] = 0;
            else
                matr[i][j] = matrix[i][j];

    outputMatr(matr, n, m);
    printf("\n");
}
int strWithMinSum(int matrix[maxSize][maxSize], int n, int m)
{
    int str, minSum;

    for (int i = 0; i < n; i++)
    {
        int sum = 0;
        for (int j = 0; j < m; j++)
            sum += matrix[i][j];
        if (i == 0)
        {
            minSum = sum;
            str = i;
        }
        if (sum < minSum)
        {
            minSum = sum;
            str = i;
        }
    }

    return str;
}
int strWithMaxSum(int matrix[maxSize][maxSize], int n, int m)
{
    int str, maxSum;

    for (int i = 0; i < n; i++)
    {
        int sum = 0;
        for (int j = 0; j < m; j++)
            sum += matrix[i][j];
        if (i == 0)
        {
            maxSum = sum;
            str = i;
        }
        if (sum > maxSum)
        {
            maxSum = sum;
            str = i;
        }
    }

    return str;
}
void changeStr(int matrix[maxSize][maxSize], int n, int m, int str1, int str2)
{
    int matr[maxSize][maxSize];

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (i == str1)
                matr[str2][j] = matrix[i][j];
            else if (i == str2)
                matr[str1][j] = matrix[i][j];
            else
                matr[i][j] = matrix[i][j];

    outputMatr(matr, n, m);
    printf("\n");
}

int main()
{
    int matr[maxSize][maxSize], n, m;
    inputMatr(matr, &n, &m);

    outputMatr(matr, n, m);

    printf("Среднее арифметическое четных элементов: %f\n", srArifCh(matr, n, m));
    printf("Среднее арифметическое элементов, лежащих на нечётных строках: %f\n", srArifnaNechStr(matr, n, m));
    printf("Минимальный: %d, максимальный: %d\n", minElMatr(matr, n, m), maxElMatr(matr, n, m));

    printf("Матрица, в которой обнулены все значения, меньшие среднего арифметического:\n");
    zeroBelowSrAr(matr, n, m);

    printf("[%d] строка — минимальная по сумме элементов\n", strWithMinSum(matr, n, m));
    printf("[%d] строка — максимальная по сумме элементов\n", strWithMaxSum(matr, n, m));

    printf("Матрица, в которой поменяли местали строки с макс и мин суммой:\n");
    changeStr(matr, n, m, strWithMinSum(matr, n, m), strWithMaxSum(matr, n, m));

    printf("Сумма элементов матрицы: %d\n", sumMatr(matr, n, m));
}