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

Задача

Дана квадратная матрица. Вычислить сумму элементов главной или побочной диагонали в зависимости от выбора пользователя. Сумма элементов любой диагонали должна вычисляться в одной и той же функции.

Пояснение к задаче и алгоритм решения

В функцию следует передавать не только массив, но и информацию о том, что требуется вычислить, выраженную через тот или иной символ или число.

Если была выбрана сумма главной диагонали, то при определении ее элементов второй индекс матрицы будет равен первому и начинаться с первого элемента. В случае побочной диагонали второй индекс будет начинаться с последнего элемента и заканчиваться первым. Поэтому в теле функции перед проходом по матрице второму индексу присваивается либо 1 (или 0), либо размерность квадратной матрицы (N или N-1). При проходе второй индекс либо увеличивается на каждой итерации, либо уменьшается.

Исходный код на языке программирования Pascal

const N = 10;
type
    type_arr = array[1..N, 1..N] of byte;
 
var
    arr: type_arr;
    i, j: byte;
    sum: byte;
    ch: char;
 
function diagonal (var arr1: type_arr; c: char): byte;
    var
        sum1: byte;
        i, j: byte;
    begin
        sum1 := 0;
        if c = '1' then j := 1
        else j:= N;
        for i:=1 to N do begin
            sum1 := sum1 + arr1[i][j];
            if c = '1' then j := j + 1
            else j := j-1;
        end;
        diagonal := sum1;
    end;
 
begin
    randomize;
    for i:=1 to N do begin
        for j:=1 to N do begin
            arr[i,j] := random(10);
            write(arr[i,j]:4);
        end;
        writeln;
    end;
    write('Главная (1) или побочная (2): ');
    readln(ch);
    if (ch = '1') or (ch = '2') then begin
        sum := diagonal(arr, ch);
        writeln(sum);
    end;
end.

Особенности решения на языке программирования Pascal

Пример(ы) выполнения программы на языке Pascal:

   0   2   0   4   8   0   4   1   5   1
   1   7   7   0   1   7   8   4   7   7
   1   0   7   4   6   5   0   6   4   7
   1   5   3   3   0   4   6   7   8   0
   1   7   3   8   1   6   9   4   4   7
   8   5   7   7   1   7   8   8   8   4
   2   0   1   3   1   5   2   0   0   8
   4   8   3   7   5   6   5   1   3   9
   9   0   9   2   1   0   3   6   1   3
   8   3   7   5   8   8   9   5   1   1
Главная (1) или побочная (2): 2
41

Исходный код на языке программирования C

#include <stdio.h>
#define N 10
int diagonal(char c);
int a[N][N];
 
main() {
    int i, j, sum;
    char ch;
    srand(time(NULL));
    for (i=0; i<N; i++) {
        for (j=0; j<N; j++) {
            a[i][j] = rand() % 10;
            printf("%3d", a[i][j]);
        }
        printf("\n");
    }
    printf("Главная (1) или побочная (2): ");
    scanf("%c", &ch);
    sum = diagonal(ch);
    printf("%d\n", sum);
}
 
int diagonal(char c) {
    int s, i, j;
    s = 0;
    if (c == '1')
        for (i=0; i<N; i++)
            s += a[i][i];
    else
        for (i=0, j=N-1; i<N; i++,j--)
            s += a[i][j];
    return s;    
}

Исходный код на языке программирования Python

def diagonal(l,c):
    s = 0
    i = 0
    while i < N:
        if c == '1':
            s += l[i][i]
        else:
            s += l[i][N-i-1]
        i += 1
    return s
 
 
from random import random
N = 10
a = []
for i in range(N):
    b = []
    for j in range(N):
        n = int(random()*10)
        b.append(n)
        print("%3d" % n, end='')
    a.append(b)
    print()
 
ch = input("Главная (1) или побочная (2): ")
if ch == '1' or ch == '2':
    summa = diagonal(a,ch)
    print(summa)

Исходный код на языке программирования КуМир

цел N = 7
цел таб a[1:N,1:N]
алг
нач
  цел i, j, sum
  сим ch
  нц для i от 1 до N
    нц для j от 1 до N
      a[i,j] := int(rand(0,10))
      вывод a[i,j], " "
    кц
    вывод нс
  кц
  вывод "Главная (г) или побочная (п): "
  ввод ch
  если ch = "г" или ch = "п" то
    sum := diag(ch)
    вывод sum
  все
кон
 
алг цел diag(сим c)
нач
  цел s, i, j
  s := 0
  нц для i от 1 до N
    если c = "г" то
      s := s + a[i,i]
     иначе
      s := s + a[i,N-i+1]
    все
  кц
  знач := s
кон

Тема

Функции

Уровень сложности

Средний

Дата публикации