Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ПАЯ (1-й семестр).doc
Скачиваний:
10
Добавлен:
20.11.2019
Размер:
1.23 Mб
Скачать

Способы обозначения и определения процедур

Мы определили операторы как изменения значений некоторых переменных, имена которых принадлежат состоянию, в зависимости от значений тех же переменных

<

Оператор

N1→V1 <N1→V1

… …

Nm→Vm> Nm→Vm’>

где N – имена, V – значения.

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

для некоторых функций f1 и fm.

В программировании подобное преобразование записывается в виде:

N1,…,Nm:=f1(N1,…,Nm),…,fm(N1,…Nm)

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

Ni:=fi(N1,…,Nm)

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

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

Традиционно такой язык определяется:

  1. классом базовых операторов (в частности допустимых присваиваний);

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

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

Языки блок-схем

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

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

‘Маша’ состоит из 4-х букв.

В языке блок-схем для этого используют рамку, например:

y:=succ(x)

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

Способы определения функций

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

φ(x)=f(g(x))

Функция φ – результат композиции функций f и g.

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

P1 → P2

Содержательный смысл композиции – последовательное выполнение фиксированного, явно заданного числа действий.

Предикат – условие, определяемое как функция.

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

ение 1 неявно, до начала работы операторов программы.

Для выходных потоков определен оператор записи write(f,e), где e – некоторое выражение.

{f→<a1, a2, …, an>, e→X}

write(f,e)

{f→<a2, …, an, X>}

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