Задача. Определить, есть ли в заданном массиве элемент, равный 0.
Опишем логическую функцию, значение которой равно истине, если такой элемент есть, и ложь в противном случае. Самый простой способ – это просматривать элементы и, если найден искомый элемент, то присвоить функции значение True, иначе – False.
Function Check1(X : MyArray; n, m : integer) : Boolean;
Var
i, j : integer;
Flag : Boolean;
Begin
Flag := False; {Предполагаем, что искомого элемента в массиве нет}
i := 1;
while not(Flag) and (i<=n) do {элемент не найден и строки не закончились}
begin
j := 1;
while (j<=m) and (X[i, j]<>0) do {перебираем все элементы текущей строки, пропуская ненулевые элементы}
Inc(j);
Flag := not(j=m+1);{если искомый элемент найден, то переменной Flag присваиваем значение True}
Inc(i);
end;
Check1 := Flag;
End;
Задача. Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали.
В задачах подобного типа необходимо увидеть зависимость между индексами элементов массива. Для этого удобно представить массив в виде таблицы, обозначив элементы, например, буквой а и написав рядом их индексы.
а11
а 12
а 13
а 14
а 15
а 16
а 17
а 21
а 22
а 23
а 24
а 25
а 26
а 27
а 31
а 32
а 33
а 34
а 35
а 36
а 37
а 41
а 42
а 43
а 44
а 45
а 46
а 47
а 51
а 52
а 53
а 54
а 55
а 56
а 57
а 61
а 62
а 63
а 64
а 65
а 66
а 67
а 71
а 72
а 73
а 74
а 75
а 76
а 77
Заметим, что если массив является симметричным, то для него выполняется равенство A[i, j]=A[j, i] для всех i=1, ..., n и j=1, ..., n. Поэтому можно составить следующую функцию:
Function Check2(X : MyArray; n, m : integer) : Boolean;
Var
i, j : integer;
Flag : Boolean;
Begin
Flag := True; {Предполагаем, что матрица симметрична}
i := 2;
while Flag and (i<n) do
begin
j := 1;
while (j<i) and (X[i, j]=X[j, i]) do
Inc(j);
Flag := (j=i);
Inc(i);
end;
Check2 := Flag;
End;
Вопрос. Почему в функции употребляется условие i>j? Можно ли без него обойтись и что при этом изменится?