Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 6.


Изучая основные понятия алгоритмического языка (см. занятие 3), мы с вами, уважаемый подписчик, достаточно подробно рассмотрели пример некоторого абстрактного алгоритма. Разберёмся теперь с общим порядком записи алгоритмов на АЯ.

Отметим важный момент! Мы собираемся записывать алгоритмы на АЯ так, чтобы их потом легко можно было бы преобразовать в подпрограммы на языке Паскаль.

ОБЩИЙ ВИД АЛГОРИТМА НА АЯ

Существуют две основные формы записи алгоритмов на АЯ: алгоритмы в виде процедур (алгоритмы-процедуры) и алгоритмы в виде функций (алгоритмы-функции).

Как алгоритм-процедура может быть оформлен любой алгоритм.

Форма записи алгоритма-процедуры в общем виде такова:

алг <имя> (арг <перечень аргументов>; рез <перечень результатов>)

дано   <комментарий к аргументам>

надо   <комментарий к результатам>

нач <перечень промежуточных переменных>

<последовательность команд>

кон

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

Как уже отмечалось (см. занятие 3), алгоритм является именованным объектом. Служебное слово алг используется для выделения имени (названия) алгоритма. Имя алгоритма выбирается произвольно (см. занятие 4, правило “Имена, выбираемые произвольно”). Чаще всего это единое обозначение, которое в сокращённой форме или в виде аббревиатуры передаёт содержание алгоритма. Например, КвУр – название для алгоритма решения квадратного уравнения, НОД – название для алгоритма определения наибольшего общего делителя.

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

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

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

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

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

Рассмотрим пример заголовка алгоритма решения следующей задачи.

Пример 1. Заданы коэффициенты линейного уравнения a * x = b. Определить характер решения линейного уравнения и найти его корень в том случае, если он единственный.

алг ЛУр (арг a, b: вещ; рез x: вещ, z: нат)

дано  коэффициенты линейного уравнения a * x = b

надо  корень x и сообщение о характере решения z

Имя алгоритма ЛУр (Линейное Уравнение) соответствует смыслу решаемой задачи. Как известно, исходными данными для решения линейного уравнения являются его коэффициенты. Именно поэтому переменные a и b, обозначающие его коэффициенты, выбраны в качестве аргументов алгоритма. Если линейное уравнение имеет единственное решение, то соответствующим результатом является его корень, обозначенный переменной x. Все указанные переменные – вещественного типа. Известно также, что линейное уравнение имеет единственное решение не всегда. Характер его решения бывает и иным, а именно: в зависимости от значений коэффициентов решений может быть бесчисленное множество или не быть вовсе. Мы видим, что возможны три варианта исхода процесса решения уравнения, и только в одном из них мы можем получить конкретное значение для корня x. Таким образом, нужен дополнительный результат z, информирующий нас о характере решения. Варианты исхода процесса решения удобно условно пронумеровать. При этом переменная z должна принимать значение номера варианта и её тип может быть выбран натуральным.

Данный алгоритм демонстрирует использование переменной,  выполняющей сигнальные функции (переменная z сигнализирует о варианте решения). Такие переменные называют флажками. Флажок z помогает правильному использованию результатов решения задачи, получаемых от алгоритма. Если значение z не соответствует наличию единственного решения, то переменной x пользоваться нельзя. Например, нельзя включать её в какие-то дальнейшие вычисления, нельзя выводить её значение на печать и пр.

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

Рассмотрим пример заголовка алгоритма ещё одной задачи.

Пример 2. Заданы три произвольных числа. Определить, возможно ли существование треугольника, длины сторон которого равны заданным числам.     

алг СущТр (арг a, b, c: вещ; рез z: лог)

дано  произвольные числа a, b, c

надо  вывод z о возможности существования треугольника

Имя алгоритма СущТр расшифровывается как Существование Треугольника. Заданные числа обозначены переменными a, b и c. Поскольку числа произвольные, то для них выбран вещественный тип. Вывод о существовании треугольника может быть двояким (ДА, может существовать, или НЕТ, не может существовать). Именно поэтому для результата – переменной z, значением которой должен быть один из этих двух возможных выводов, выбран логический тип.   

Некоторые алгоритмы рекомендуется оформлять как алгоритмы-функции.

Форма записи алгоритма-функции в общем виде такова:

алг <имя> ( <перечень аргументов> ) : <тип функции>

дано   <комментарий к аргументам>

надо   <комментарий к результатам>

нач <перечень промежуточных переменных>

<последовательность команд>

кон

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

Основная особенность алгоритма-функции состоит в том, что значение результата получает имя самого этого алгоритма. Для этого в состав команд основной части алгоритма-функции обязательно включают, по крайней мере, одну такую команду, с помощью которой имя алгоритма получает определённое значение. Именно поэтому тип, который указывается через знак препинания “:” после перечня параметров, является типом результата и называется типом функции.

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

Исключение составляет литерный тип, который является структурированным, но допустимым для типа функции.

Из алгоритмов-процедур, заголовки которых были приведены выше, как алгоритм-функцию целесообразно оформить только алгоритм из второго примера:

алг СущТр ( a, b, c: вещ ): лог

дано  произвольные числа a, b, c

надо  вывод о возможности существования треугольника

Значением логической функции СущТр может быть один из двух возможных выводов о существовании треугольника (ДА, может существовать, или НЕТ, не может существовать).

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

Причины такого подхода станут ясны из последующих занятий.

Рассмотрим ещё ряд примеров записи заголовков алгоритмов решения задач.

Отметим ещё один чрезвычайно важный момент! Умение правильно записывать заголовки алгоритмов есть немаловажная часть умения составлять алгоритмы решения задач в целом.

Пример 3. На координатной плоскости задана точка A. Принадлежит ли она кругу радиусом R с центром в начале координат?

алг ТочКр ( xA, yA, R: вещ ): лог

дано  координаты точки xA, yA и радиус круга R ³ 0

надо  значение логической функции (ДА – принадлежит, НЕТ – не принадлежит)

Алгоритм ТочКр (Точка в Круге) имеет аргументами координаты точки A(xA, yA) и радиус круга R. Для всех переменных выбран вещественный тип, поскольку соответствующие значения вполне могут быть дробными. Из условия задачи мы можем также заключить, что R ³ 0, так как прямо указано, что R – радиус круга.

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

Этот пример помогает избежать распространённой ошибки, когда в качестве аргумента пытаются указать переменную A.

Пример 4. Радиус шара равен R. Сторона куба равна 2*R. Чему равен суммарный объём указанных тел?

алг Объём ( R: вещ ): вещ

дано радиус шара R ³ 0

надо значение функции, равное суммарному объёму

Алгоритм Объём (суммарный Объём тел) использует в качестве аргумента переменную R, обозначающую радиус шара. Тип переменной R вещественный, поскольку значения радиуса вполне могут быть и дробными. Так как в условии задачи прямо сказано, что задан именно радиус шара, то  при построении алгоритма мы вправе считать, что отрицательные значения для R исключены. Об этом сделано указание в комментарии дано.

Для данного алгоритма возможно построение в виде функции. Это обусловлено тем, что при любом R ³ 0 вычисление объёмов обоих тел возможно. Случаи невозможности вычисления отсутствуют. При этом получается результат в виде единственного значения простого типа.

Данный пример помогает избежать распространённой ошибки, когда в качестве аргумента алгоритма пытаются указать также и выражение 2*R.

Пример 5. Стороны первого прямоугольника равны A и B. Стороны второго прямоугольника равны 2 и 3. Найти разность площадей этих прямоугольников.

алг РазнПл ( A, B: вещ ): вещ

дано  стороны первого прямоугольника A ³ 0 и B ³ 0

надо значение функции, равное разности площадей

Алгоритм РазнПл (Разность Площадей прямоугольников) использует в качестве аргументов вещественные переменные A и B. Из условия задачи мы можем заключить, что ³ 0 и B ³ 0. Алгоритм можно построить в виде функции вещественного типа, так как случаи невозможности вычисления отсутствуют и мы имеем для алгоритма единственный результат простого типа.

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

Пример 6. Заданы вещественные числа A, B и C. Наибольшее из них заменить нулём.

алг Замена0 ( рез A, B, C: вещ )

дано произвольные числа A, B, C

надо те же числа, одно из которых изменено

Алгоритм Замена0 (Замена числом 0) имеет аргументами числа A, B и C вещественного типа. В условии задачи речь идёт о замене какого-то из них нулём. Отсюда следует, что именно изменённое число и должно быть результатом алгоритма. Но поскольку заранее не известно, какое из них будет изменено, то считать результатами следует сразу все заданные числа.  

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

Естественно, что алгоритм Замена0 следует представить в форме процедуры, поскольку он имеет не единственный результат.

Пример 7. Задано некоторое слово. Какое слово будет получено, если из данного слова удалить все буквы “а”? Сколько букв будет в новом слове? 

алг Слово ( арг X: лит; рез Y: лит, K: цел )

дано слово X

надо слово Y (то же, что X, но без букв “а”) и его длину K

Алгоритм Слово имеет аргументом переменную X, обозначающую некоторое заданное слово. Оформлен алгоритм в виде процедуры, поскольку предполагает получение двух результатов: нового слова Y и количества K букв в нём.

Интересно, что если бы в условии задачи речь шла о непосредственном удалении букв “а” из слова X, то мы были бы обязаны указать в качестве результата это же слово X.

Обратим внимание, что для второго результата выбран целый тип вместо натурального, хотя среди возможных его значений по смыслу задачи отрицательных не предполагается. Этим мы хотим подчеркнуть, что вопрос выбора между целым и натуральным типами в АЯ не является принципиальным. Тем более, что в данном алгоритме это не может быть источником ошибок. Забегая наперёд, отметим, что указанный вопрос важен только при программировании в тех довольно редких случаях, когда приходится принимать решения в отношении диапазона значений типов и занимаемых объёмов памяти. В большинстве же случаев целый тип считается удобнее натурального, поскольку позволяет не контролировать появление отрицательных значений. 

Пример 8. Вычислить значение функции y = 1 / x.

алг Функция ( арг x: вещ; рез y: вещ, z: лог )

дано значение переменной x

надо значение y и сообщение z о возможности его вычисления

Алгоритм Функция имеет аргументом переменную x. Основным результатом естественно считать значение заданной функции y. Возникает вопрос, почему же алгоритм Функция представлен в виде процедуры, а не в виде функции.

Обратим внимание на то, что условие задачи не предполагает каких-либо ограничений на значения аргумента x. Поэтому следует считать, что для x допустимы любые значения числового типа (в том числе и x = 0). Таким образом, при построении данного алгоритма возникает необходимость решения серьёзнейшей проблемы, связанной с тем, что значение функции y возможно вычислить не при любых значениях x.

Именно поэтому алгоритм Функция кроме числового результата y имеет также дополнительный результат z логического типа. Основное назначение дополнительного результата состоит в том, чтобы сигнализировать, удалось или не удалось вычислить результат y. Например, если в результате работы алгоритма было получено = ДА, то это значит, что функцию при данном x вычислить удалось, и результирующая переменная y не является неопределённой. В противном случае (= НЕТ) переменная y не определена и её нельзя использовать в процессе дальнейшей обработки информации.

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

Уважаемый подписчик! Чтобы получить более подробное изложение материала занятия №5 “Выражения числового типа”, перейдите по ссылке http://a-morgun.narod.ru/a06-01/a0006-0001-0004.html

При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru

С уважением, Александр.


В избранное