Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
теория информатика.doc
Скачиваний:
137
Добавлен:
24.09.2019
Размер:
5.2 Mб
Скачать

12.2. Свойства алгоритмов

 

Основные свойства алгоритмов:

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

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

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

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

 

12.3. Способы представления алгоритмов

 

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

Самый простой способ представления алгоритма – словесный, который содержит описание алгоритма на естественном языке (например, на русском). Выполнение предписаний алгоритма предполагается в естественной последовательности (в порядке записи), изменение порядка выполнения операций необходимо указать в явном виде, например, «перейти к шагу 3», в этом случае шаги алгоритма должны быть пронумерованы.

В формульно-словесном способе к словесному описанию добавляются формулы для определения значений переменных, при этом каждая переменная должна иметь уникальное имя – идентификатор. 

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

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

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

Псевдокод удобен для пошаговой разработки алгоритма.

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

Примером псевдокода является школьный алгоритмический язык в русской нотации – «Школьный АЯ».

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

Порядковый номер оператора, независимо от его типа, обозначается индексом. Операторы записываются в строку, для пояснения схемы переходов после логических операторов ставятся сверху или снизу горизонтальные стрелки, указывающие место перехода. Если операторы выполняются в естественном порядке, между ними не ставится разделитель, если после i-го оператора (i+1)-й не выполняется, между ними ставится разделитель – точка с запятой. Для логических операторов возможно указание условия, по которому программа разветвляется на ветви.

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

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

Такое графическое представление называется схемой алгоритма или блок-схемой. В блок-схеме каждому типу действий (вводу исходных данных, вычислению значений выражений, проверке условий и т.п.) соответствует геометрическая фигура, представленная в виде блочного символа. Блочные символы соединяются линиями переходов, определяющими очередность выполнения действий. Приведем символы, используемые для построения  блок-схем (таблица 12.3.1.).

Таблица 12.3.1. – Схемы алгоритмов, программ, данных и систем

Наименование

Символ

Функция

Терминатор

Начало или конец

Процесс

Обработка данных любого вида

Данные

Данные, носитель не определен, указывает ввод и вывод данных

Предопределенный процесс

Процедура или функция

Подготовка

Цикл с заданным числом повторений

Решение

Условный оператор или переключатель

Соединитель

Обрыв и продолжение линии

 

Комментарий

Пунктирные линии связаны с соответствующим символом

Линия

Поток управления

 

Символ «терминатор» отображает выход во внешнюю среду и вход из внешней среды. Используется для обозначения начала или конца программы или подпрограммы (процедуры или функции).

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

Символ «данные» отображает данные, носитель которых не определен. Используется для обозначения операций ввода и вывода данных.

Символ «предопределенный процесс» отображает предопределенный процесс, состоящий из одной или нескольких операций, которые определены в другом месте (в подпрограмме или модуле).

Символ «подготовка» отображает модификацию команды или группы команд. Используется для заголовков циклов с заданным числом повторений (циклов с параметром).

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

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

Символ «соединитель» применяется, если схема состоит из нескольких страниц.

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

Символ «линия» отображает поток данных или управления. При необходимости (направления влево или вверх) добавляются стрелки-указатели.

В блок-схеме для линий потока, направленных сверху вниз и справа налево, можно не ставить стрелки, для направлений влево и вверх стрелки обязательны.

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

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

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

Пример 12.3.1. Рассмотрим различные способы представления алгоритмов на примере алгоритма Евклида (III в. до н.э.) для нахождения наибольшего общего делителя (НОД) двух целых чисел. Наибольший общий делитель – наибольшее целое число, на которое делятся оба заданных числа. Например, для А=12 и В=20 НОД=4.

Словесный способ

Шаг 1. Задать 2 целых числа А и В.

Шаг 2. Если А=В, перейти к шагу 4.

Шаг 3. Вычесть меньшее число из большего и заменить большее из чисел А и В их разностью. Перейти к шагу 2.

Шаг 4. Положить НОД=А. Закончить.

Формульно-словесный способ

1. Начало.

2. Задать 2 целых числа А и В.

3. Если А=В, перейти к шагу 6, иначе к шагу 4.

4. Если А>B, положить А=А-В, иначе положить В=В-А.

5. Перейти к шагу 3.

6. Положить НОД=А.

7. Конец.

Приведем пример исполнения алгоритма Евклида, заданного формульно-словесным способом,  при А=12, В=20.

1. Шаг 2. Задаем А=12, В=20.

2. Шаг 3. А=В ложно, переходим к шагу 4.

3. Шаг 4. A>B ложно, полагаем В=В-А = 20-12=8. Теперь А=12, В=8.

4. Шаг 5. Переходим к шагу 3.

5. Шаг 3. А=В ложно,  переходим к шагу 4.

6. Шаг 4. А>B истинно, полагаем А=А-В=12-8=4. Теперь А=4, В=8.

7. Шаг 5. Переходим к шагу 3.

8. Шаг 3. А=В ложно, переходим к шагу 4.

9. Шаг  4. A>B ложно, полагаем В=В-А=8-4=4. Теперь А=4, В=4.

10. Шаг 5. Переходим к шагу 3.

11. Шаг 3. А=В истинно, переходим к шагу 6.

12. Полагаем НОД=А=4.

13. Заканчиваем процесс.

Приведенная форма исполнения алгоритма понятна, но длинна. В короткой форме исполнения алгоритма записываются только значения переменных:

А  12  4 .

В  20  8  4

 

 

Псевдокод

BEGIN

INPUT A,B

WHILE A<>B DO

  IF A>B

     A=A-B

  ELSE

     B=B-A

  ENDIF

ENDWHILE

PRINT “НОД=”, A

END.

Операторный способ

 

Рисунок 12.3.1 – Блок-схема алгоритм Евклида

 

Программа на алгоритмическом языке

В качестве алгоритмического языка для представления алгоритмов ранее употреблялся язык АЛГОЛ-60  (его английское написание ALGOL от ALGOrithmic Language – алгоритмический язык, язык описания алгоритмов). 

АЛГОЛ-60 служил также языком программирования. Были разработаны компиляторы для ЭВМ с языка АЛГОЛ-60.

В настоящее время разница между алгоритмическими  языками и языками программирования стирается, для представления алгоритмов чаще всего используется язык Паскаль, разработанный профессором Цюрихского института информатики Николаусом Виртом на основе языка АЛГОЛ-60.

Программа на языке Паскаль для описания алгоритма Евклида:

program nod;

var a,b:integer;

begin   read(a,b);

  while a<>b do

    if a>b then a:=a-b

    else b:=b-a;

  writeln(‘НОД=’, a); end.

В программе описаны переменные  a и b целого типа (integer), далее производится чтение значений этих переменных (оператор read), затем в цикле while (пока a не равно b) большему числу присваивается значение разности a и b. Когда числа a и b станут равными (а это обязательно произойдет!), цикл заканчивается и результат выводится на экран, после чего программа завершает работу.