Тренировочные задания: Двумерные массивы

Десять задач на двумерные массивы.

Задача 1. Ввод матрицы

Считать n и m, затем n × m чисел в матрицу.

Пример ввода:

2 3
1 2 3
4 5 6

Пример вывода:

Введена матрица 2 x 3
Решение
int n, m;
int a[MAX_SIZE][MAX_SIZE];

scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        scanf("%d", &a[i][j]);
    }
}
printf("Введена матрица %d x %d\n", n, m);

Задача 2. Вывод матрицы таблицей

Напечатать матрицу с выравниванием по ширине поля %4d.

Пример ввода:

2 3
1 2 3
4 5 6

Пример вывода:

   1   2   3
   4   5   6
Решение
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        printf("%4d", a[i][j]);
    }
    printf("\n");
}

Задача 3. Сумма всех элементов

Найти сумму всех элементов матрицы.

Пример ввода:

2 3
1 2 3
4 5 6

Пример вывода:

Сумма: 21
Решение
int sum = 0;
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        sum += a[i][j];
    }
}
printf("Сумма: %d\n", sum);

Задача 4. Произведение всех элементов

Найти произведение всех элементов матрицы.

Пример ввода:

2 2
2 3
4 5

Пример вывода:

Произведение: 120
Решение
long long product = 1;
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        product *= a[i][j];
    }
}
printf("Произведение: %lld\n", product);

Задача 5. Минимум и максимум поменять местами

Найти минимальный и максимальный элементы и поменять их местами. Если все элементы равны, обмен не требуется.

Пример ввода:

2 2
1 5
3 4

Пример вывода:

   5   1
   3   4
Решение
int mi = 0, mj = 0, xi = 0, xj = 0;
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        if (a[i][j] < a[mi][mj]) { mi = i; mj = j; }
        if (a[i][j] > a[xi][xj]) { xi = i; xj = j; }
    }
}
int tmp = a[mi][mj];
a[mi][mj] = a[xi][xj];
a[xi][xj] = tmp;

Задача 6. Положительные, отрицательные, нулевые

Посчитать, сколько в матрице положительных, отрицательных и нулевых элементов.

Пример ввода:

2 3
1 -2 0
3 -4 0

Пример вывода:

положительных: 2, отрицательных: 2, нулевых: 2
Решение
int pos = 0, neg = 0, zero = 0;
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        if (a[i][j] > 0)
        {
            pos++;
        }
        else if (a[i][j] < 0)
        {
            neg++;
        }
        else
        {
            zero++;
        }
    }
}
printf("положительных: %d, отрицательных: %d, нулевых: %d\n", pos, neg, zero);

Задача 7. Суммы строк

Напечатать сумму элементов каждой строки.

Пример ввода:

2 3
1 2 3
4 5 6

Пример вывода:

строка 1: 6
строка 2: 15
Решение
for (int i = 0; i < n; i++)
{
    int sum = 0;
    for (int j = 0; j < m; j++)
    {
        sum += a[i][j];
    }
    printf("строка %d: %d\n", i + 1, sum);
}

Задача 8. Суммы столбцов

Напечатать сумму элементов каждого столбца.

Пример ввода:

2 3
1 2 3
4 5 6

Пример вывода:

столбец 1: 5
столбец 2: 7
столбец 3: 9
Решение
for (int j = 0; j < m; j++)
{
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += a[i][j];
    }
    printf("столбец %d: %d\n", j + 1, sum);
}

Задача 9. Сумма главной диагонали

Найти сумму элементов главной диагонали. Матрица квадратная (n × n).

Пример ввода:

3 3
1 2 3
4 5 6
7 8 9

Пример вывода:

Сумма главной диагонали: 15
Решение
int sum = 0;
for (int i = 0; i < n; i++)
{
    sum += a[i][i];        /* главная диагональ: i == j */
}
printf("Сумма главной диагонали: %d\n", sum);

Задача 10. Транспонирование

Транспонировать квадратную матрицу на месте (строки становятся столбцами).

Пример ввода:

3 3
1 2 3
4 5 6
7 8 9

Пример вывода:

   1   4   7
   2   5   8
   3   6   9
Решение
for (int i = 0; i < n; i++)
{
    for (int j = i + 1; j < n; j++)   /* только выше диагонали */
    {
        int tmp = a[i][j];
        a[i][j] = a[j][i];
        a[j][i] = tmp;
    }
}

Подтверждение

—