Сайт Льва Волкова
  
· Мех белого медведя обладает свойством превращать в тепло до 95% падающих на него солнечных лучей.
 
      На главную  
 Личное
  Статьи
  Задачи 
 Ссылки
 АТ-531
www.levvol.ru    
 

Суммы в двумерных массивах

Двумерный массив - прямоугольная таблица однотипных данных. Адресация элементов двумерного массива осуществляется указанием сначала номера строки, а затем номера столбца.

Объявление двумерного массива может быть осуществлено например так:



Const n=10;
Var x:array [1..n,1..n] of integer;

Здесь объявлен квадратный двумерный массив (квадратная целочисленная матрица).

Ввод данных в двумерный массив:


for i:=1 to n do
for j:=1 to n do x[i,j]:=random(100);

В массив вводятся случайные целые числа от 0 до 99.

Вывод двумерного массива вещественных чисел размером n строк, m столбцов:



for i:=1 to n do begin
for j:=1 to m do write(x[i,j]:5:2);
writeln;
end;
  1. Сумма всех элементов квадратной матрицы:


  2. sum:=0;
    for i:=1 to n do
    for j:=1 to n do sum:=sum+x[i,j];
    writeln('Сумма=',sum);

  3. Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):

    sum:=0;
    for i:=1 to n do sum:=sum+x[i,i];
    writeln('Сумма=',sum);

  4. Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т.е. i+j=n+1 или j=n+1-i:

    sum:=0;
    for i:=1 to n do sum:=sum+x[i,n+1-i];
    writeln('Сумма=',sum);
  5. Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):

    sum:=0;
    for i:=1 to n do
    for j:=1 to n do if i>j then sum:=sum+x[i,j];
    writeln('Сумма=',sum);

    Можно не просматривать весь массив, а брать только нужные элементы:


    sum:=0;
    for i:=2 to n do
    for j:=1 to i-1 do sum:=sum+x[i,j];
    writeln('Сумма=',sum);

  6. Сумма элементов выше и на главной диагонали квадратной матрицы:

    sum:=0;
    for i:=1 to n do
    for j:=1 to n do
    if i<=j then sum:=sum+x[i,j];
    writeln('Сумма=',sum);

    Здесь также можно не просматривать весь массив, а брать только нужные элементы:


    sum:=0;
    for i:=1 to n do
    for j:=i to n do sum:=sum+x[i,j];
    writeln('Сумма=',sum);
    Квадратная матрица
    Рис.1
  7. Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже, рис.1) :

    sum:=0;
    for i:=1 to n do
    for j:=1 to n do
    if i+j>n+1 then sum:=sum+x[i,j];
    writeln('Сумма=',sum);

    Можно не просматривать весь массив, а брать только нужные элементы:


    sum:=0;
    for i:=2 to n do
    for j:=n+2-i to n do sum:=sum+x[i,j];
    writeln('Сумма=',sum);
  8. Если надо посчитать сумму элемсентов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре толко нужных элементов применить такой код:

    sum:=0;
    for i:=1 to n do
    for j:=n+1-i to n do sum:=sum+x[i,j];
    writeln('Сумма=',sum);
  9. При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали (рис. 2) возможно применине такого кода:
    Квадратная матрица
  10. Рис.2


    sum:=0;
    for i:=1 to n do
    for j:=1 to n do
    if (i<=j) and (i+j<=n+1) then
    sum:=sum+x[i,j];
    writeln('Сумма=',sum);
  11. Подсчет сумм элементов по строкам:

    for i:=1 to n do begin
    sum:=0;
    for j:=1 to n do sum:=sum+x[i,j];
    writeln('Сумма ',i,'-й строки',sum);
    end;
  12. Подсчет сумм элементов по столбцам:

    for j:=1 to n do begin
    sum:=0;
    for i:=1 to n do sum:=sum+x[i,j];
    writeln('Сумма ',j,'-го столбца ',sum);
    end;

    Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам:


    for i:=1 to n do zum[j]:=0;
    for i:=1 to n do
    for j:=1 to n do zum[j]:=zum[j]+x[i,j];
    {вывод сумм по столбцам}
    for i:=1 to n do write(zum[i]:4);
    writeln;

  13. Суммы элементов по диагоналям, параллельным главной диагонали.
    Квадратная матрица
  14. Рис.3

    Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив


    Var zum:array[-n+1..n-1] of integer;

    Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:

    for i:=-n+1 to n-1 do zum[i]:=0;
    for i:=1 to n do
    for j:=1 to n do z[i-j]:=z[i-j]+x[i,j];
    for i:=-n+1 to n-1 do write(z[i]);


  15. Суммы элементов по диагоналям, параллельным побочной диагонали.
    Квадратная матрица
  16. Рис.4

    Очевидно, что таких сумм тоже будет 2n-1. Кроме того, суммы индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду сумма «номер строки плюс номер столбца». Эти разности будут меняться от 2 для самой верхней диагонали s1, содержащей всего лишь один элемент, до 2n для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив


    Var zum:array[2..2*n] of integer;

    Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:

    for i:=2 to 2*n do zum[i]:=0;
    for i:=1 to n do
    for j:=1 to n do z[i+j]:=z[i+j]+x[i,j];
    for i:=2 to 2*n do write(z[i]);


  17. Суммы элементов по периметрам двумерного массива. Смысл задачи поясняется Рис.5,6.
    Квадратная матрица
  18. Рис.5
    Квадратная матрица
    Рис.6

    Cледует различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2 при четном n и k=n div 2 +1 при нечетном значении n.

    Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1, т.е. начинается с элемена находящегося на главной диагонали и заканчивается элементом на побочной диагонали.

    Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1.

    Затем считаем элементы по двум паралельным столбцам i и n-i+1 (не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1,k+1].


    k:=n div 2;
    for i:=1 to k do begin
    sum:=0;
    {строки}
    for j:=i to n-i+1 do
    sum:=sum+x[i,j]+x[n-i+1,j];
    {столбцы}
    for j:=i+1 to n-i do
    sum:=sum+x[j,i]+x[j,n-i+1];
    writeln(sum); {вывод суммы}
    end;
    if n mod 2=1 then
    writeln(x[k+1,k+1]);





    Назад