Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Нахождение количества элементов с данным свойством




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

Задача 1. Найти максимальный элемент массива и его индексы.

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

Procedure Maximum(X: MyArray; n, m: integer; Var Max, Maxi, Maxj: integer);

Var

i, j: integer;

Begin

Max:= X[1, 1]; {Предположим, что максимумом является первый элемент}

Maxi:= 1; {в этом случае запомним первую строку}

Maxj:= 1; {и первый столбец}

for i:= 1 to n do

for j:= 1 to m do

if X[i, j] > Max {если среди элементов массива нашелся больший элемент, то}

then

begin

Max:= X[i, j];{внесем новое найденное значение в переменную Мах}

Maxi:= i; {и не забудем запомнить индексы строки}

Maxj:= j; {и столбца этого элемента}

end;

End;

Задача 2. Найти количество отрицательных элементов в каждой строке.

Рассмотрим несколько способов решения этой задачи.

Способ 1 – количество элементов каждой строки хранить в одномерном массиве (Y) соответствующей размерности. Тогда можно описать такую процедуру:

Procedure KolOtr1(X: MyArray2; n, m: integer; Var Y: MyArray1);

Var

i, j: integer;

Begin

for i:= 1 to n do

begin

Y[i]:= 0; {записываем начальное значение количества элементов в соответствующую столбцу ячейку}

for j:= 1 to m do

if X[i, j] < 0 {если отрицательный элемент найден}

then

Inc(Y[i]); {то увеличиваем текущее значение на единицу}

end;

End;

Способ 2 – использовать счетчик, находить количество элементов строки и выводить значение на экран.

Procedure KolOtr2(X: MyArray2; n, m: integer);

Var

i, j, k: integer;

Begin

for i:= 1 to n do

begin

k:= 0;

for j:= 1 to m do

if X[i, j] < 0

then

Inc(k);

writeln(i,' – ', k);

end;

End;

Вопрос. Сравните предложенные способы решения задачи. Какой способ Вам понравился больше и почему?

Определить, отвечает ли заданный массив некоторым требованиям

Задача. Определить, есть ли в заданном массиве элемент, равный 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;

Заполнение массива по правилу

Задача. Заполнить массив А размером NxM "змейкой" следующим образом:

1 2 3 4 5 6 7

8 9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

Для того, чтобы заполнить, надо вывести правило заполнения, а оно в данном случае будет таким:

если ряд нечетный, то A[i, j]=(i-1)*m+j;

если ряд четный, то A[i, j]=i*m-j+1.

По этому правилу и составляем процедуру заполнения:

Procedure FillArray(Var X: MyArray2; n, m: integer);

Var

i, j: integer;

Begin

for i:= 1 to n do

for j:= 1 to m do

if i mod 2 =1

then

A[i, j]=(i-1)*m+j

else

X[i, j]=i*m-j+1;

End;

Задание. Вставьте в программу-шаблон рассмотренные подпрограммы и организуйте выбор одной из них через меню. Дополните подпрограммы, не содержащие пояснений, соответствующими комментариями. Сохраните файл на дискете. Листинг сдайте учителю для проверки.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных