Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
30.04.2013
Размер:
153.09 Кб
Скачать

А9. Поиск номера элемента, удовлетворяющего условию

Для решения данной задачи можно воспользоваться алгоритмом A8, вернув результат в переменной j, выполняющей функцию счетчика цикла и индекса элемента массива одновременно, и связав факт того, найден элемент или нет, со значением переменнойFlagFound.

Примеры использования типовых алгоритмов Пример 1. ”Сформировать массив ”с”, включив в него четные элементы массива ”а”, которые присутствуют в массиве ”в”.

В

Алг ”Выбор из массива”

нач

ввод-массивов-А-и-В

формирование-массива-С

вывод-массива-С

кон

начале запишем укрупненный алгоритм:

Анализируя этот алгоритм мы видим, что ”ввод-массивов-А-и-В” можно реализовать, применив дважды алгоритм А1 (поменяв при этом имена переменных и скорректировав тексты сообщений на экран), а ”вывод-массива-С” несложно обеспечить, воспользовавшись алгоритмом А2. Нам остается только разработать алгоритм ”формирование-массива-С”.

Приведем план решения этой задачи:

План ”формирование-массива-С ”

нач

nC := 0; {массив С пуст}

for i:=1 to nA do {повторить для каждого

элемента массива А}

if (A[i] четное) then begin

искать-A[i]-в-массиве-В {установить FlagFound}

if FlagFound then

добавить-A[i]-в-массив-C

{end if}

end; {if}

{end for}

кон

Теперь нужно раскрыть планы действий ”искать-A[i]-в-массиве-В ” и ”добавить-A[i]-в-массив-C”.

Первый план –это модификация алгоритма А8:

FlagFound := FALSE; {не найден пока}

j := 1;

while (j<=nB) and (not FlagFound) do

if (A[i] = B[j]) then {значение A[i] имеется в массиве В}

FlagFound := TRUE

else

j := j + 1;

{end if}

{end while}

В

План ”добавить-A[i]-в-массив-C”

нач

nC := nC + 1;

C[nC] := A[i];

кон

торой план (аналог телу цикла в алгоритме А7):

И

(A[i] mod 2) = 0

, наконец, выражение (A[i] четное) можно реализовать, проверив остаток от целочисленного деления числа A[i] на 2. На Паскале это выражение имеет вид:

(A[i] mod 2) = 0

Т

План ”формирование-массива-С ”

нач

nC := 0; {массив С пуст}

for i:=1 to nA do {повторить для каждого элемента массива А}

if (A[i] mod 2) = 0 then begin

{искать-A[i]-в-массиве-В {установить FlagFound}}

FlagFound := FALSE; {не найден пока} j := 1;

while (j<=nB) and (not FlagFound) do

if (A[i] = B[j]) then {значение A[i] имеется в В}

FlagFound := TRUE

else

j := j + 1;

{end if}

{end while}

if FlagFound then

{добавить-A[i]-в-массив-C}

begin

nC := nC + 1;

C[nC] := A[i];

end;

{end if}

end; {if}

{end for}

кон

еперь можно привести уточненный план формирования массива С:

Задача разработки отдельных фрагментов решена, и теперь остается только получить итоговый (детальный) алгоритм, выполнив подстановку отдельных планов в укрупненный алгоритм. Эту работу читателю предлагается выполнить самостоятельно.

Пример 2. ”Найти значение элемента, встречающегося в массиве наибольшее количество раз”.

В

План

нач

ввод-массива

вычисление-числа-повторений

вывод-результата

кон

начале представим укрупненный алгоритм:

При решении этой задачи можно воспользоваться алгоритмами ввода массива, выбора максимального числа и алгоритма подсчета числа элементов, удовлетворяющих условию.

П

План ”вычисление-числа-повторений”

Var

MaxCount : integer; {макс. число повторений}

Count : integer; {число повторений текущ. элемента}

Elem : integer; {величина элемента, встретившегося чаще всего}

A:array[1..10] оf integer;

n : integer; {число элементов в массиве А}

нач

MaxCount := 0;

for j:=1 to n do

begin

подсчет-числа-повторений–A[j]-в-массива-А

{результат записать в Count}

if Count>MaxCount then

begin

MaxCount := Count;

Elem := A[j];

end; {if}

end; {for}

кон

ланы ”ввод-массива” и ”вывод-результата” мы рассматривать не будем. Сосредоточимся на плане ”вычисление-числа-повторений”. При этом текст на псевдокоде запишем на псевдоПаскале. Это означает, что те операции алгоритма, для которых имеется однозначный аналог на Паскале, будем записывать полностью по правилам языка Паскаль, а остальные ан языке с русской лексикой. Итак, данный план на псевдоПаскале будет иметь следующий вид:

Р

План ”подсчет-числа-повторений–A[j]-в-массива-А”

нач

Count := 0;

for i:=1 to n do

if A[j]=A[i] then

Count := Count +1;

{end if}

{end for}

кон

аскроем план для подсчета числа повторений A[j] в массиве А (это модификация алгоритма А6):

Детальный алгоритм решения задачи читателю предлагается выполнить самостоятельно.

Соседние файлы в папке лекции