Блок-схемы алгоритмов, содержащих команды обращения к вспомогательным алгоритмам

Часто при построении алгоритмов решения задач возникает необходимость организации в различных местах алгоритма одной и той же последовательности команд, которая выполняется каждый раз при различных наборах операндов. В таких случаях эти последовательности команд обычно оформляют специальным образом в виде вспомогательных (подчиненных) алгоритмов. А в главном (основном) алгоритме вместо этой последовательности команд записывают одну команду обращения к вспомогательному алгоритму. Алгоритмы, целиком включаемые в состав разрабатываемого алгоритма, называются вспомогательными (подчиненными).

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

Использование вспомогательных алгоритмов вызывает необходимость оформлять их специальным образом, чтобы иметь возможность в дальнейшем ссылаться на них в основном алгоритме. Формальные способы оформления таких алгоритмов широко применяются в языках программирования, а сами вспомогательные алгоритмы, записанные на языках программирования, называют подпрограммами или процедурами. При использовании блок-схем полная формализация в оформлении вспомогательных алгоритмов, как правило, не производится. Однако, будем придерживаться некоторых принципов оформления. В заголовке вспомогательного алгоритма (блок «начало») за именем вспомогательного алгоритма будем указывать в круглых скобках список так называемых формальных параметров. В списке формальных параметров укажем имена входных и выходных данных (аргументов (арг) и результатов (рез)) алгоритма. Это необходимо для того, чтобы при ссылке на подчиненный алгоритм в основном алгоритме можно было задать значения аргументов, а после исполнения вспомогательного алгоритма, воспользоваться результатами – значениями соответствующих данных. Например, если алгоритм нахождения большего из двух чисел необходимо оформить как вспомогательный, где a и b – аргументы, а z – результат, то блок начала этого алгоритма оформим так:

 


БИД – имя алгоритма (большее из двух).

Ссылка на вспомогательный алгоритм в основном алгоритме осуществляется с помощью специальной команды вызова вспомогательного алгоритма, в которой указывается имя вспомогательного алгоритма и список фактических параметров, которые должны быть подставлены вместо формальных параметров при исполнении вспомогательного алгоритма. Команда вызова вспомогательного алгоритма имеет вид:

<имя вспомогательного алгоритма> (<список фактических параметров>).

На блок-схеме вызов вспомогательного алгоритма изобразим в виде геометрической фигуры , внутри которой запишем команду вызова вспомогательного алгоритма. Например, если в основном алгоритме необходимо найти большее из данных k и l, где переменной k было присвоено значение 45, а переменной l – значение 21, и результат присвоить переменной y, то обращение к вспомогательному алгоритму запишем так: , где k, l, y – фактические параметры.

Исполнение команды вызова вспомогательного алгоритма эквивалентно исполнению вспомогательного алгоритма с фактическими параметрами. Команда вызова вспомогательного алгоритма исполняется как один шаг основного алгоритма.

Исполнение команды обращения к вспомогательному алгоритму разбивается на следующие этапы:

1. На время исполнения команды обращения к вспомогательному алгоритму выполнение основного алгоритма приостанавливается.

2. Формальным параметрам-аргументам вспомогательного алгоритма присваиваются значения фактических параметров, записанных в команде вызова вспомогательного алгоритма.

3. Исполняется вспомогательный алгоритм с полученными значениями аргументов.

4. Значения результатов-параметров вспомогательного алгоритма присваиваются соответствующим значениям параметров, записанных в команде вызова вспомогательного алгоритма.

5. Выполняется команда основного алгоритма, следующая за командой вызова вспомогательного алгоритма.

Замечание: Значения данных вспомогательного алгоритма, не переданные в основной алгоритм после исполнения вспомогательного алгоритма, становятся недоступными. Количество, порядок, тип параметров в команде вызова вспомогательного алгоритма должны соответствовать количеству, порядку, типу параметров в заголовке вспомогательного алгоритма.

Схематично передачу значений параметров при исполнении команды обращения к вспомогательному алгоритму можно изобразить так:

 

Задача 30.Наибольший общий делитель. Составьте блок-схему алгоритма нахождения z – наибольшего общего делителя четырех натуральных чисел a, b, c, d, используйте для решения задачи вспомогательный алгоритм нахождения наибольшего общего делителя t двух натуральных чисел m и n.

Решение. Смотри блок-схемы 1-2 алгоритма (задача 30).

Составим блок-схему вспомогательного алгоритма НОД, нахождения наибольшего общего делителя двух натуральных чисел m и n, значение наибольшего общего делителя двух натуральных чисел присвоим переменной t. Для решения поставленной задачи воспользуемся тремя предложениями (обозначим НОД (m,n) – наибольший общий делитель m и n):

1. НОД(m,n) = НОД(m-n,n), если m>n.

2. НОД(m,n) = НОД(m,n-m), если n>m.

3. НОД(m,n) = m, если m = n.

НОД(25,15) = НОД(10,15) (1);

НОД(10,15) = НОД(10,5) (2);

НОД(10,5) = НОД(5,5) (1);

НОД(5,5) = 5 (3) => НОД(25,15) = 5.

 

Блок-схема1 основного Блок-схема2вспомогательного

алгоритма (задача 30): алгоритма (задача 30):

       
   

 


 

Задача 31.Числа Мерсенна. Числа вида 2p-1, где p – простое число, называются числами Мерсенна[7]. Многие числа Мерсенна также являются простыми. Составьте алгоритм нахождения всех чисел Мерсенна, принадлежащих отрезку [2;n].

Решение. Смотри блок-схемы 1-3 алгоритма (задача 31).

Для решения задачи будем получать числа вида 2p-1, где p = 2, 3, … . Если p – простое, то 2p-1 – число Мерсенна. Рассмотрим, как можно получить следующего кандидата в числа Мерсенна, если известен предыдущий проверенный кандидат:

Кандидат = 2p-1,

где p = 2, 3, 4, 5, 6, …;

следующего кандидата обозначим Кандидат1:

Кандидат1 = 2p+1-1;

2p+1-1 = 2*2p-1 = 2*(2p-1) + 1; Кандидат1 = 2 * Кандидат + 1.

Нового кандидата в числа Мерсенна будем проверять осторожно, чтобы не было превышено n. Если проверяемых кандидатов на отрезке [2;n] больше нет, то флажку fl будем присваивать значение «да». До проверки первого кандидата флажку fl присвоим значение «нет». Найдем n1 = n/2:

если Кандидат£n1, то Кандидат1:=2*Кандидат, иначе fl:=да;

если Кандидат1<n, то Кандидат1:=Кандидат1+1, иначе fl:=да.

Легко проверить, что число 22-1, равное 3 – число Мерсенна. Проверку высказывания «p – число простое» оформим в виде одного из вспомогательных алгоритмов простое (арг a, рез fl1) или простое1 (арг a, рез fl1).

Составим блок-схему вспомогательного алгоритма простое1 (арг a, рез fl1), алгоритма проверки является ли число a простым числом. Заметим, что все четные числа, большие 2 являются составными. Проверим, имеет ли число а (нечетное, большее 2) делители, отличные от 1 и самого себя. Исследуем числа от 2 до [a/2]+1, где [a/2] – целая часть частного a/2 (a>0). На отрезке [[a/2]+1;a-1] не могут находиться делители числа a. Делителями нечетного числа а могут быть только нечетные числа k, меньшие [a/2]+1. Будем их получать так:

k:=[a/2]+1-2; k:=k-2

и т.д. до тех пор, пока k<>1. Проверку реализуем в виде цикла. Из цикла выйдем, если k является делителем числа а (k=1 или k<>1). По окончании цикла проверим значение k: если k=1, то число простое и fl1:=да, иначе число составное и fl1:=нет.

Числа Мерсенна: 3, 7, 31, 127, 2047, 8191, 131071, 524287, 8388607, 536870911, 2147483647, …

Задача 32.Наибольший элемент в массиве. Составьте алгоритм поиска наибольшего элемента t в линейной таблице из n чисел a(1:n), используя алгоритм БИД (нахождения большего из двух чисел), как вспомогательный.

Решение. Смотри блок-схемы 1-2 алгоритма (задача 32).

 

 

Блок-схема1 вспомогательного алгоритма (задача 32):

 


Блок-схема2 основного Блок-схема алгоритма

алгоритма (задача 32): (задача 33):

 


Задача 33.Близнецы. Два нечетных простых числа, отличающихся на два, называются близнецами. Близнецами являются, например, числа 5 и 7, 11 и 13, 17 и 19 и т.д. Составьте блок-схему нахождения близнецов на отрезке от 2 до n.

Решение. Смотри блок-схему алгоритма (задача 33).

Будем определять является ли число pÎ[2;n] простым, если p – простое, то проверяем простое ли число p+2, если p и p+2 простые, то их выводим; далее исследуем числа p+1 и p+3 и т.д. Для определения является ли число p простым воспользуемся вспомогательным алгоритмом простое (арг a, рез fl1) или простое1 (арг a, рез fl1) (стр. 60-61, задача 31).

Задача 34. Сумма чисел Фибоначчи. Представьте число m в виде суммы наибольших чисел Фибоначчи. Составьте блок-схему алгоритма решения поставленной задачи.

Решение. Смотри блок-схемы 1-2 алгоритма (задача 34).

Для решения поставленной задачи воспользуемся алгоритмом задачи 18, стр. 42, как вспомогательным.

Блок-схема1 вспомогательного Блок-схема2 основного

алгоритма (задача 34): алгоритма (задача 34):

       
   

 

 


Задача 35.Сдвиг1 элементов в массиве. Составьте алгоритм циклической перестановки элементов массива B(1:n) на заданное число k шагов так, чтобы элемент B(i) переместился на место B(i+k), а последние k элементов массива, которым «не хватило места», переместились, соответственно, на первые k мест, освободившихся при сдвиге. (Массив B(1), B(2), … , B(n) преобразовался в массив B(n-k+1), … , B(n-1), B(n), B(1), B(2), … , B(n-k).) Составьте блок-схему алгоритма решения поставленной задачи.

Решение. Смотри блок-схемы 1-2 алгоритма (задача 35).

Для решения поставленной задачи воспользуемся составленным алгоритмом задачи 26, стр. 51, как вспомогательным.

 

Задача 36. Кратные пары. Заданы два массива A(1:n) и B(1:n) натуральных чисел. Подсчитайте число k пар (ai,bi), 1£i£n, соответствующих друг другу кратных чисел этих массивов и найдите сумму частных от деления большего числа каждой такой пары на меньшее. Составьте блок-схему алгоритма решения поставленной задачи.

Решение. Смотри блок-схемы 1-2 алгоритма (задача 36).

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

Блок-схема1 основного алгоритма Блок-схема2 вспомогательного

(задача 36): алгоритма (задача 36):

       
   

 









Дата добавления: 2015-01-26; просмотров: 5737;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.018 сек.