Сумма элементов столбцов матрицы

Задача

Вариант 1. Вычислить сумму элементов каждого столбца матрицы (двумерного массива).

Вариант 2. Найти сумму элементов определенного столбца матрицы.

Решение

Матрицу можно представить как массив, в который вложены другие массивы. Эти другие массивы имеют одинаковую длину (например, M), а количество этих вложенных массивов - другое число (например, N). Так, если M = 7, а N = 5, то это значит, что матрица состоит из 5 одномерных массивов, в каждом из которых по 7 элементов.

Элементы одного вложенного массива обычно считают строкой матрицы. Столбцы же матрицы формируют элементы разных вложенных массивов, но имеющие в них одинаковые индексы (занимающие одинаковые позиции). Так, все первые элементы вложенных массивов, формируют первый столбец матрицы. Элементы с индексом 2 образуют второй столбец.

Если mat - это переменная-матрица, то выражение mat[i,j] обозначает обращение к элементу, имеющему номер строки i (это номер вложенного массива), и номер столбца j (это номер самого элемента во вложенном массиве).

Обычно матрицы заполняются по-строчно: во внешнем цикле перебираются строки, во внутреннем - элементы строк (формируют столбцы). Однако это не обязательно. Заполнять можно и по столбцам: во внешнем цикле перебирать столбцы, во внутреннем - обращаться к элементам разных вложенных массивов, но имеющих идентичный индекс.

В программе ниже заполнение двумерного массива происходит по-строчно (стандартно), затем вычисляется сумма элементов каждого столбца, и здесь обход происходит по столбцам. Обратите внимание, что в данном случае внешний цикл отсчитывает до M, а внутренний - до N. В разных итерациях вложенного цикла различна первая переменная-индекс (в данном случае i), обозначающая номер строки, а столбец остается постоянным.

const
    M = 7;
    N = 5;
var
    mat: array[1..N,1..M] of real;
    i, j: byte;
    sum: real;
begin 
    for i:=1 to N do begin // заполнение матрицы
        for j:=1 to M do begin
            mat[i,j] := random();
            write(mat[i,j]:6:2);
        end;
        writeln;
    end;
    writeln('Sum of col:');
    for j:=1 to M do begin // подсчет сумм
        sum := 0;
        for i:=1 to N do
            sum := sum + mat[i,j];
        write(sum:6:2);
    end;
    writeln;
end.

Пример выполнения кода программы:

  0.55  0.59  0.72  0.84  0.60  0.86  0.54
  0.85  0.42  0.62  0.65  0.38  0.44  0.30
  0.89  0.06  0.96  0.27  0.38  0.48  0.79
  0.81  0.53  0.48  0.57  0.39  0.93  0.84
  0.07  0.34  0.09  0.65  0.02  0.37  0.83
Sum of col:
  3.17  1.94  2.87  2.98  1.78  3.07  3.30

Когда поставлена задача нахождения суммы элементов только определенного столбца, то она решается проще, без вложенного цикла. Вместо переменной j используется конкретное число, обозначающее столбец, сумму которого следует посчитать. Например, для вычисления суммы элементов третьего столбца код будет таким:

    ...
    sum := 0;
    for i:=1 to N do
        sum := sum + mat[i,3];
    writeln(sum:6:2);
    ...

Тема

Матрицы

Уровень

Комбинированные задачи

Комментарии

Составить программу, которая в двумерном массиве подсчитывает сумму столбцов и столбец с наименьшей суммой элементов обнуляет.

const N = 5; M = 7;
var
    matrix: array[1..N,1..M] of byte;
    col: array[1..M] of integer;
    id: byte;
    i,j: byte;
begin
    randomize;
    for i:=1 to N do begin
        for j:=1 to M do begin
            matrix[i,j] := random(10);
            write(matrix[i,j]:3);
        end;
        writeln;
    end;
 
    for i:=1 to M do begin
        col[i] := 0;
        write('---');
    end;
    writeln;
    // сумма столбцов
    for j:=1 to M do begin
        for i:=1 to N do
            col[j] := col[j] + matrix[i,j];
        write(col[j]:3);
    end;
    writeln;
    // номер столбца с min суммой
    id := 1;
    for i:=2 to M do
        if col[i] < col[id] then
            id := i;
    writeln('Минимальная сумма в столбце ', id);
    // обнуление столбца
    for i:=1 to N do
        matrix[i,id] := 0;
    // новая матрица
    for i:=1 to N do begin
        for j:=1 to M do begin
            write(matrix[i,j]:3);
        end;
        writeln;
    end;
end.