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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

Задача 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? Можно ли без него обойтись и что при этом изменится?



Поделиться:


Последнее изменение этой страницы: 2016-12-30; просмотров: 290; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.141.202 (0.008 с.)