
информатика_книги / Информатика. Теория и практика_Острейковский В.А, Полякова И.В_2008 -608с
.pdfДетерминированность (определенность, обусловленность) означает, что набор указаний алгоритма должен быть однозначно и точно понят любым исполнителем. Это свойство определяет однозначность результата работы алгоритма при заданных исходных данных.
Массовость алгоритма предполагает возможность варьирования исходных данных в определенных пределах. Свойство массовости определяет пригодность использования алгоритма для решения множества задач данного класса и является основным фактором, обеспечивающим экономическую эффективность решения задач на ЭВМ. Из сказанною следует, что для задач, решение которых осуществляется один раз, целесообразность использования ЭВМ, как правило, диктуется внеэкономическими категориями.
Результативность алгоритма предполагает, что для любых допустимых исходных данных он должен через конечное число шагов (или итераций) завершить свою работу.
Дискретность алгоритма допускает разбиение определенного алгоритмического процесса на отдельные элементарные этапы, возможность реализации которых человеком или ЭВМ не вызывает сомнения, а результат выполнения каждого элементарного этапа вполне определен и понятен.
Конечность алгоритма означает, что он должен выполняться за конечное время.
Таким образом, алгоритм дает возможность чисто механи- чески решать любую конкретную задачу из некоторого класса однотипных задач и предполагает наличие определенных свойств:
—алгоритм состоит из отдельных шагов;
—каждый шаг выполняет обработку входных данных (аргументов), получая выходные данные (результаты);
—результат каждого шага однозначно определяется аргументами;
—количество шагов конечно;
—шаги алгоритма выполняются последовательно, в порядке написания (естественный порядок выполнения);
—существуют способы изменения естественного порядка выполнения (управляющие конструкции).
451
Ñпонятием алгоритма тесно связано понятие «данные».
Âалгоритмическом аспекте данные — это информация, несущая полезную смысловую нагрузку, представленная в формализованном виде, позволяющем собирать, передавать, вводить и обрабатывать эту информацию с помощью заданных алгоритмов. Реализация алгоритма на конкретных исходных данных решаемой задачи называется алгоритмическим про-
цессом.
Существует несколько способов описания алгоритмов: словесный, формульно-словесный, графический, средствами специального языка операторных схем, с помощью таблиц решений и др. Помимо требования обеспечения наглядности, выбор конкретного способа диктуется рядом факторов, из которых определяющими являются степень необходимой детализации представления алгоритма, степень его формализации, уровень логической сложности задачи и т. п.
Словесный способ описания алгоритма основан на записи содержания выполняемых действий средствами естественного языка. К достоинствам этого способа следует отнести его общедоступность, возможность описывать алгоритм с любой степенью детализации, а к главным недостаткам — довольно громоздкое описание (и как следствие — относительно низкую наглядность), отсутствие строгой формализации в силу неоднозначности восприятия естественного языка, вытекающего из свойств синонимии, омонимии, полисемии.
Формульно-словесный способ описания алгоритма основан на записи содержания выполняемых действий с использованием изобразительных возможностей языка математики, дополненного — с целью указания необходимых пояснений — средствами естественного языка. Обладая всеми достоинствами словесного способа, формульно-словесный способ вместе с тем более лаконичен, а значит, и более нагляден, имеет боˆльшую формализацию, однако также не является строго формальным.
Графический способ описания алгоритма — это такое изображение логико-математической структуры алгоритма, при котором все этапы процесса обработки данных представляются с помощью определенного набора геометрических фигур (блоков), имеющих строго определенную конфигурацию в соответствии с характером выполняемых действий.
452

Для облегчения процесса разработки и восприятия графи- ческого изображения алгоритмов их составление осуществляется в соответствии с требованиями ГОСТ 19701—90 «Схемы алгоритмов, программ, данных и систем. Условные обозначе- ния и правила выполнения» и ГОСТ 19.003—80 «Схемы алгоритмов и программ. Обозначения условные графические».
По назначению и характеру |
|
|
отображаемых функций услов- |
Начало, конец |
|
ные графические изображения, |
||
|
||
называемые символами, делят- |
|
|
ся на основные и вспомогатель- |
Вычисления |
|
ные. Основные символы исполь- |
||
|
||
зуются для представления опе- |
|
|
раций, раскрывающих характер |
Ввод, вывод |
|
обработки данных в процессе |
|
|
решения задачи (рис. 6.1), вспо- |
Проверка |
|
могательные — для пояснения |
||
условия |
||
отдельных элементов схемы ал- |
||
|
||
горитма, а также обозначения |
|
|
связей между ними. |
Модификация |
|
Изображение схем алгорит- |
|
|
мов осуществляется по опреде- |
|
|
ленным правилам, призванным |
|
|
повысить их наглядность и од- |
Подпрограмма |
|
нозначность восприятия, что об- |
|
|
легчает обнаружение логических |
Ðèñ. 6.1. Основные графические |
|
ошибок в программах. В соот- |
обозначения блоков алгоритмов |
|
и программ |
||
ветствии с этими правилами каж- |
||
|
дая схема должна начинаться и заканчиваться соответствующими символами, обозначающими начало и окончание алгоритма.
Все блоки в схеме располагаются в последовательности сверху вниз и слева направо, объединяясь между собой линиями потока. Нормальным направлением линий потока, т. е. следования этапов процесса решения задачи, принято направление сверху вниз и слева направо. В этом случае направление линий потока не идентифицируется с помощью стрелок, в отличие от других направлений (рис. 6.2).
453

1 |
|
|
|
|
|
|
Необходимым усло- |
||
Начало |
|
|
|
вием корректности схем |
|||||
|
|
|
|
|
|
|
|
алгоритмов является не- |
|
|
|
|
|
|
|
|
|||
2 |
|
|
|
|
|
|
|
допустимость более чем |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
одного выхода из сим- |
||
|
|
|
|
|
|
|
|
волов, обозначающих |
|
|
|
|
|
|
|
|
|||
3 |
|
|
|
|
4 |
|
обрабатывающие бло- |
||
|
|
|
|
||||||
|
|
|
> |
ки, и не менее двух вы- |
|||||
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
ходов из символов, обо- |
||
|
|
|
|
|
|
|
|
значающих логические |
|
|
< |
|
|
|
операции по проверке |
||||
5 |
|
|
|
|
|
|
|
выполнения |
условий. |
Íåò |
|
|
|
|
|
|
|
С целью повышения |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
наглядности |
графиче- |
|
|
|
|
|
|
|
ские схемы алгоритмов |
||
6 |
|
|
|
|
|
|
|
могут сопровождаться |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
Комментарий кратким формульно- |
||
|
|
|
|
|
|
|
словесным описанием |
||
7 |
Äà |
|
|
|
|
внутри условного изо- |
|||
|
|
|
|
||||||
|
|
|
|
бражения блоков, рас- |
|||||
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
||
|
Конец |
|
|
|
|
крывающим содержание |
|||
|
|
|
|
|
|
|
|
выполняемой операции. |
Ðèñ. 6.2. Пример записи схемы алгоритма |
В случае необходимос- |
|
ти представления более |
||
|
||
|
развернутых пояснений |
к блокам или линиям потока используются комментарии, идентифицируемые в схемах с помощью специальных изобразительных средств. Для обозначения условий передачи управления от блоков логических операций над соответствующими линиями потока могут записываться специальные знаки операций отношения («>», «<», «=», «=>», «<=») или слова ДА либо НЕТ (рис. 6.2).
Для удобства работы со схемами алгоритмов все блоки на схеме идентифицируются с помощью цифр или их сочетаний с буквами. Идентификаторы блоков размещаются в верхней левой части условного изображения в разрыве их контуров (рис. 6.2, 6.3).
Для отражения связи между удаленными друг от друга блоками соответствующие им линии потока можно разрывать.
454

В этом случае в конце и начале обрыва линии потока изображаются специальные символы:
— при отражении связей между блоками, расположенными на одной и той же странице, — внутристранич- ные соединители с идентификаторами, как правило, совпадающими с идентификаторами соответствующих блоков перехода (рис. 6.3);
2 |
3 |
B2
B B2
C2
C |
|
D2 |
Íåò |
D |
B2 |
|
|
|
Äà |
Ðèñ. 6.3. Пример координатной идентификации блоков алгоритма
—при отражении связей между блоками, расположенными на разных страницах, — межстраничные соединители, в которых, помимо идентификации блоков, отражаются также номера соответствующих им страниц.
Операторный способ записи алгоритма представляет собой изображение последовательности операций процесса обработки данных с помощью заданного набора символов, обозначающих ту или иную типовую операцию (например, А — вычисление,
— ввод, Р — проверка условия и т. п.). Последовательность выполнения операций алгоритма определяется расположением операторов в схеме (при чтении слева направо в соответствии с цифровой индексацией). Передача управления от оператора к оператору осуществляется в порядке следования в символической записи алгоритма. В случае отсутствия передачи управления от очередного оператора к последующему оператору в записи между ними ставится признак завершения ветви алгоритма — символ «точка с запятой». Нарушение естественного порядка выполнения операторов отражается с помощью символов передачи управления (стрелок), которые используются:
—для указания перехода от условного оператора (Р) при разветвлении алгоритма;
—в случае отражения безусловного перехода от последнего оператора, завершающего одну из ветвей алгоритма.
455
Использование операторного способа представления алгоритма значительно упрощает процесс его записи, так как каждому оператору схемы обычно соответствует определенная совокупность достаточно простых операций обработки информации. Однако из-за малой наглядности отображения процесса обработки информации использование языка операторных схем не нашло практического применения для разработки и отражения алгоритмов решения задач экономического характера.
Перечисленные способы описания алгоритмов имеют существенный недостаток, так как не обеспечивают наглядности представления многовариантных вычислительных процессов, что характерно для алгоритмов решения сложных задач с разветвленной логикой.
Òåìà 6.2
ОСНОВНЫЕ АЛГОРИТМИЧЕСКИЕ КОНСТРУКЦИИ.
ВСПОМОГАТЕЛЬНЫЕ АЛГОРИТМЫ
6.2.1. Основные типы алгоритмов
Рассмотрим три основных типа алгоритмов.
Линейный алгоритм — это простейший тип алгоритма, все шаги которого выполняются однократно и строго последовательно (рис. 6.4). Часто употребляется синоним понятия «линейный алгоритм» — «последовательное выполнение» — как одна из трех основных структур, применяемых при составлении алгоритмов, которая предполагает выполнение шагов алгоритма по порядку следования. При этом каждый шаг может быть простым (элементарным) и составным, который выполняется подпрограммой. Подпрограммой называется часть программы, оформленная специальным образом. К подпрограмме можно обращаться из других программ по мере необходимости. Она используется для замены часто повторяющихся фрагментов программы и для достижения большей ее компетентности. Во многих языках программирования понятие «подпрограмма» совпадает с понятием «процедура».
Разветвляющийся алгоритм (синонимы: ветвлящийся алгоритм, ветвление) — это алгоритм, который позволяет в зависи-
456

мости от условий выполнять различные ветви |
04 |
|
(рис. 6.5). В некоторых литературных источ- |
||
15 |
||
никах данная структура называется выбором. |
16 |
|
К ветвлению в языках программирования высо- |
||
|
||
кого уровня относятся такие команды, как if, |
|
|
then, else, case, of. |
17 |
|
Циклический алгоритм — ýòî: |
|
|
— схема выполнения части алгоритма, в ко- |
18 |
|
торой некоторые действия повторяются; |
||
|
||
— путь в графе, начинающийся от одного из |
|
|
узлов и заканчивающийся в нем; |
19 |
|
— оператор в процедурно-ориентированном |
||
|
||
языке программирования, обеспечивает выполне- |
|
|
ние части программы некоторое количество раз. |
06 |
|
Существуют три типа операторов цикла (на |
||
20 |
примере языка Паскаль):
— с известным заранее (до цикла) количеством повторений, например цикл for;
— с проверкой условия выполнения цикла перед выполнением тела цикла, так называемый цикл с предусловием, например цикл while;
— с проверкой условия выполнения цикла после выполнения тела цикла, так называемый цикл с постусловием, например цикл repeat.
Âодних языках программирования в цикле for проверка условий окончания цикла производится перед выполнением тела цикла, в других — после.
Âязыках программирования декларативного типа цикли- ческие конструкции выполняются с помощью рекурсивных построений.
Рекурсивный алгоритм — это алгоритм, который в своей структуре использует обращение к самому себе. Он имеет в своей основе рекурсивные функции. Рекурсивной называют функцию, если она в своем определении содержит вызов самой себя. Например, общеизвестное использование рекурсии — определение факториала (n!) произвольного числа n>=0: 0!=1, n!=n*(n–1)!.
Процедура — это часть программы для выполнения некоторых стандартных действий, зависящих в общем случае от входных параметров. Процедуру можно считать подпрограммой.
457

|
|
|
|
|
|
|
|
|
|
|
|
Case i of |
|
|
|
|
|
|
|
|
|
|
|
|
1: |
|
|
|
|
|
|
|
|
|
|
|
|
2: |
B |
1 |
|
2 |
|
|
|
|
M |
|
. |
||
|
|
|
|
|
|
|
. |
|||||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
S1 |
|
S1 |
|
S2 |
|
... |
Sm |
. |
||||
|
|
|
|
|
|
|
|
|
. |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
... |
... |
|
M: |
|
|
|
|
|
|
|
|
|
|
|
|
|
End |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Оператор CASE |
|
|
||
Выполнение одной |
|
|
|
|
|
|
|
|
|
|
|
|
альтернативы |
|
|
|
|
|
|
|
|
|
|
|
Âõîä
Досрочный выход из цикла
F
B
«Нормальный»
T
S1
Go to
F
C
«Преждевременный»
T
S2 Выход
Ðèñ. 6.5. Дополнительные (вспомогательные) структуры управления
Процедуры разделяются на стандартные и пользовательские, внешние и внутренние относительно программы.
Стандартная процедура входит в состав языка программирования и поставляется в составе соответствующей библиотеки, à пользовательскую процедуру создает каждый разработчик самостоятельно.
Внешняя процедура хранится независимо от программы, в которой имеется обращение к этой процедуре, а внутренняя входит в состав программы.
Как правило, для задания алгоритма можно выделить семь характеризующих его независимых параметров:
458

—совокупность возможных исходных данных;
—совокупность возможных промежуточных результатов;
—совокупность результатов;
—правило начала;
—правило непосредственной переработки;
—правило окончания;
—правило извлечения результата.
На практике в программировании очень часто используется задание алгоритмов в виде блок-схем.
Блок-схема — это ориентированный граф, вершины которого могут быть одного из трех типов (рис. 6.5).
Функциональная вершина используется для представления функции f: X Y.
Предикатная вершина применяется для представления функции (или предиката) p: X (T, F), т. е. логического выражения, передающего управление по одной из двух возможных ветвей.
Объединяющая вершина представляет передачу управления от одной из двух входящих ветвей к одной выходящей ветви.
Важной особенностью приведенных структур является то, что они имеют один вход и один выход.
Структурное программирование — это процесс разработки алгоритмов с помощью структурных áëîê-ñõåì. Структурная блок-схема — ýòî блок-схема, которая может быть выражена как композиция из четырех элементарных áëîê-ñõåì (ðèñ. 6.6).
Любая программа для машины может быть представлена структурной блок-схемой.
B |
|
S1 |
|
T |
S1 |
|
|
S1 |
S2 |
S1 |
B |
S2 |
|
|
|
T |
|
|
|
|
B |
|
|
|
|
F |
|
|
Выбор |
|
Итерация |
Композиция |
|
|
(повторение) |
|
(альтернатива) |
|
|||
|
|
|||
|
|
|
Ðèñ. 6.6. Структуры управления программой
459
В более широком плане структурное программирование допускает большее разнообразие элементарных структур управления, чем предложенные четыре. Причиной для расширения множества структур является требование удобства и естественности.
6.2.2. Методы разработки алгоритма
Существует весьма большое количество всевозможных приемов и методов разработки алгоритмов. Однако среди них можно выделить небольшой набор основных методов, применяемых часто и лежащих в основе многих процедур и алгоритмов. Можно утверждать, что знание приведенных ниже методов необходимо для любого программиста.
Программирование сверху вниз. Это процесс пошагового разбиения алгоритма на все более мелкие части с целью получения таких элементов, для которых можно написать конкретные команды. Программирование сверху вниз ограничивается использованием структурных áëîê-ñõåì.
Метод частных целей. Этот метод имеет весьма общую формулировку: «Необходимо свести трудную задачу к последовательности более простых задач». Приведенная рекомендация выглядит столь естественной и разумной, что вряд ли вызовет у кого-нибудь возражения. Более того, любой человек очень часто использует метод частных целей для решения стоящих перед ним задач, при этом даже не догадываясь (или не отдавая себе отчета) о его названии. С другой стороны, нередко трудно указать способ разбиения конкретной сложной задачи на набор более простых задач. Здесь большое значение имеют опыт и искусство специалиста. Тем не менее данный метод лежит в основе решения многих задач и по своей сути составляет базу алгоритмизации и программирования. Именно с вопроса, можно ли данную задачу разбить на последовательность (набор) более простых, и нужно начинать разработку простого алгоритма.
Метод подъема. Этот метод, как и предыдущий, можно отнести к одному из общих «рецептов» разработки алгоритмов. Его суть заключается в следующей процедуре. Алгоритм начи- нается с принятия начального предположения или построения начального решения задачи. Затем начинается (насколько возможно) быстрое движение «вверх» от начального уровня по
460