Опубликован: 23.10.2009 | Доступ: свободный | Студентов: 2822 / 108 | Оценка: 4.28 / 4.22 | Длительность: 17:27:00
Специальности: Программист
Лекция 4:

Процедурная парадигма

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
4.1.1.11. Оператор вызова процедуры/функции

Этот оператор является "основным" оператором процедурного программирования. Его синтаксис:

  • для вызова подпрограмм
    <имя подпрограммы>(<фактические параметры>)
    Листинг 4.12.
  • для вызова функции
    <переменная> = <имя функции>(<фактические параметры>)
    Листинг 4.13.

Здесь <имя подпрограммы> (<имя функции>) - имя, под которым процедура (подпрограмма или функция) встречается в программе, <переменная> - возвращаемое функцией значение переменной, а <фактические параметры> - список передаваемых программе параметров-констант и переменных (их значений).

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

[<тип>]<имя процедуры>(<формальные параметры>) <тело процедуры>
Листинг 4.14.

где <тип> - тип возвращаемого функцией результата (отсутствует при вызове подпрограммы), а <формальные параметры> - передаваемые через стек значения переменных. Синтаксис формальных параметров:

<формальные параметры> ::= <тип> <имя>{,<тип> <имя>}*
Листинг 4.15.

где <тип> - тип переменной - формального параметра (должен совпадать с типом фактического параметра), <имя> - имя переменной - формального параметра (может отличаться от имени/значения фактических параметров), остальные знаки - специальные символы РБНФ (не пишутся в образце).

Замечание: в языке Си есть разница между объявлением и описанием процедуры. При объявлении дается структура, указанная в формуле 4.14, но без тела функции. Описание функции представляет собой структуру [4.14], но содержащие операторы алгоритма в теле функции. Объявление функции должно предшествовать не только его описанию, но и использованию. В остальных языках, как правило, объявления и описания совпадают.
Замечание. Фактические параметры могут передаваться по значению и по ссылке. При передаче по значению значение переменной - фактического параметра заносится в стек, и формальный параметр принимает значение уже из стека. При выходе из процедуры значение переменной в стеке уничтожается. Передача данных по ссылке - это, фактически, передача "разыменованного указателя на переменную". При выходе из процедуры значение переменной - формального параметра сохраняется и передается фактическому параметру. Подробнее о передаче параметров смотри в "Другие типы данных" . Хотя передача параметров по ссылке выглядит предпочтительнее, ее использование ведет к усложнению машинного кода и снижению безопасности системы.
Примечание: "Джентльменское соглашение" о последовательности записи формальных параметров следующие:
  • Сначала идут передаваемые по значению переменные, потом - передаваемые по значению указатели, и в конце - передаваемые по ссылке переменные и указатели;
  • Вначале идут переменные с исходными значениями, затем - переменные, изменяющие значения исходных переменных, и лишь затем - счетчики, дескрипторы (файлов, областей памяти) и т.п.

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

Обозначение вызова процедуры на блок-схеме.

Рис. 4.7. Обозначение вызова процедуры на блок-схеме.
Замечание. Тип возвращаемого функцией значения может переопределяться (см. раздел "Другие типы данных" ).
4.1.1.12. Операторы ввода-вывода

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

Здесь автор отмечает, что ввод-вывод данных может быть прямым (сразу на консоль или в файл), буферизированным, или "потоковым" (через определенный буфер, связанный с файлом либо устройством и расположенный в оперативной памяти компьютера) и, наконец, "графическим", через заранее определенный GUI API ("программный интерфейс приложения для графического пользовательского интерфейса"). Для каждого из этих типов вывода существуют свои API (функции и библиотеки). Подробнее о функциях ввода-вывода смотри [59, 31, 51, 74, 86-91].

Вид операторов ввода и вывода данных на блок-схеме представлен на рис. 4.8.

Обозначение операторов ввода-вывода на блок-схеме.

Рис. 4.8. Обозначение операторов ввода-вывода на блок-схеме.
4.1.1.13. Составной оператор

Блок операторов представляет собой допустимую последовательность операторов, заключенных в скобки (например, в Си/C++ это фигурные скобки: "{…}") или между лексемами: "Begin … End" (как в Паскале и Алголе).

На блок-схеме такие операторы никак не выделяются, а представляют собой просто последовательности операторов.

Составной оператор применяется в следующих случаях:

  1. В операциях условия, цикла, ветвления, множественного выбора, когда вместо одного оператора необходимо выполнить несколько операций (блок);
  2. Необходимо определить "локальные переменные", определяемые лишь внутри блока;
  3. Нужно написать тело функции или процедуры.

Новые переменные определяются только в начале блока, и их действие заканчивается после выхода из блока.

4.1.1.14. Оператор выхода из процедуры

Этот оператор имеет следующий синтаксис:

return [<значение>]
Листинг 4.16.

где <значение> - выдаваемое после окончания функции ее значение (только для функций).

Оператор " return " может быть расположен в любом месте программы. На блок-схеме он обозначен как: "Конец [<значение>]" (см. рис. 4.9).

Изображение оператора: "выход из функции" на блок-схеме.

Рис. 4.9. Изображение оператора: "выход из функции" на блок-схеме.
4.1.1.15. Резюме

Итак, мы познакомились с основными алгоритмическими конструкциями, присутствующими в языках программирования процедурной парадигмы. Более подробно о синтаксисе этих конструкций в конкретных языках программирования смотри [59, 31, 51, 74, 92, 78]. Там же смотрите примеры программ.

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

4.1.2. Особенности метаязыка для процедурной парадигмы

Для визуализации алгоритмов, созданных с помощью процедурной парадигмы, используют:

  • блок-схемы;
  • "школьный" язык программирования, созданный Кушниренко.

Рассмотрим эти способы поподробнее:

4.1.2.1. Блок-схемы

Это "старый" способ визуализации алгоритмов. Его преимущества очевидны при "неструктурированном" программировании (например, на языке "Ассемблер"). Вот его составные части:

  1. Начало программы отмечается символом, указанным на рис. 4.9 a, а окончание отмечается изображением, указанным на рис. 4.9 b;
  2. Переход к следующему по-порядку оператору осуществляется при помощи линий со стрелками;
  3. Разрыв линий указывается с помощью фигуры на рис. 4.10;
    Фигуры, указывающие на "разрывы" линий, отмечающих последовательность операторов.

    Рис. 4.10. Фигуры, указывающие на "разрывы" линий, отмечающих последовательность операторов.
  4. Основные конструкции алгоритмов на блок-схемах представлены фигурами, изображенные на рисунках: 4.1 - 4.7;
  5. Операторы ввода-вывода данных представлены фигурами, изображенными на рис. 4.8.
  6. Все остальные операторы представлены прямоугольником, указанным на рис. 4.11.
    Обозначение операторов на блок-схеме.

    Рис. 4.11. Обозначение операторов на блок-схеме.

Ниже приведена блок-схема алгоритма нахождения наибольшего общего делителя по алгоритму Евклида.

[Пример 08]

Блок-схема алгоритма Евклида.

увеличить изображение
Рис. 4.12. Блок-схема алгоритма Евклида.
Примечание. Блок-схему алгоритма всегда следует прикладывать как приложение к тексту программы на "неструктурированных" языках программирования, таких как "Ассемблер" и "BasicA" (ранняя реализация Бейсика от Microsoft).
4.1.2.2. "Школьный" язык программирования

Этот "язык записи алгоритмов" был предложен в 1986 году Кушниренко [55] специально для обучения программированию в средних школах. Этот язык оказался настолько "мощным" для описания алгоритмов процедурной парадигмы, что он используется (с небольшими изменениями) до сих пор.

В приложении I представлены основные конструкции этого языка. В примере 09 представлена запись алгоритма из примера 08 на "школьном" языке.

[Пример 09]

В приложении II находятся требования к "описательной части" школьного языка программирования, не вошедшие в приложение III

4.1.2.3. Требования для "структурирования" алгоритма

Вот еще одно "неписанное правило" структурированного программирования:

"Каждый оператор внутри блока операторов должен выделяться дополнительным фиксированным отступом от левой границы текста на одну позицию табуляции (символ "\t"). При закрытии блока операторов позиция отступа "уменьшается назад" на одну позицию табуляции."

Для иллюстрации этого правила смотри Пример 09 на "школьном" языке программирования.

4.1.2.4. Резюме метаязыков

В предыдущих разделах мы ознакомились с основными "метаязыками" программирования, используемых при записи алгоритмов, вместе с их возможными областями применения. Вы получили представления о блок-схемах, "школьном языке программирования", познакомились с основными правилами "структурированной парадигмы". Более подробно о процедурной парадигме программирования смотри, например, [64].

4.2. Резюме процедурной парадигмы

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

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

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >