Задача. Определить, есть ли в заданном массиве элемент, равный 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? Можно ли без него обойтись и что при этом изменится?
Изменение значений некоторых элементов, удовлетворяющих заданному свойству
Задача. В массиве размерностью NxM к элементам четных столбцов прибавить элемент первого столбца соответствующей строки.
Procedure Izmenenie1(Var X: MyArray2; n, m: integer);
Var
i, j: integer;
Begin
for i:= 1 to n do
for j:= 1 to m div 2 do
Inc(X[i, 2*j], X[i, 1]);
End;
Вопрос. Какой смысл вложен в оператор цикла for j:= 1 to m div 2 do?
Задача. Заменить все отрицательные элементы на противоположные.
Procedure Izmenenie2(Var X: MyArray2; n, m: integer);
Var
i, j: integer;
Begin
for i:= 1 to n do
for j:= 1 to m do
X[i, j]:= Abs(X[i, j]);
End;