- •Программирование и алгоритмические языки
- •Основные понятия процедурного программирования. Области и процедуры
- •Способы обозначения и определения процедур
- •Языки блок-схем
- •Трассировка программы
- •Структурное программирование
- •Программы, как файловые процедуры
- •Итерационные и рекуррентные последовательности
- •Восходящее и нисходящее программирование
- •Язык программирования Pascal
- •Процедурный Паскаль Синтаксис Паскаль-программы
- •Основные операторы
- •Классификация типов Простые (скалярные) типы
- •Стандартные типы
- •Пользовательские скалярные типы данных
- •Алгоритмическое определение булевских операций
- •Стратегия вычисления условий
- •Вычисление кванторов
- •Символьный тип
- •Производные(структурные) типы Массивы
- •Операции над массивами
- •Расширенный синтаксис. Массивы размерности n.
- •Строки. Динамические массивы.
- •Комбинированные типы и записи
- •Оператор присоединения
- •Типизированные файлы.
- •Упорядоченные файлы
- •Поиск в упорядоченном файле
- •Арифметика упорядоченных файлов
- •Дихотомический поиск в упорядоченном массиве
- •Простые алгоритмы сортировки
- •Множества
- •Операции над множествами
- •Решето Эратосфена
- •Подпрограммы. Пользовательские процедуры и функции
- •Синтаксис обращения к процедурам
- •Синтаксис использования или обращения к процедурам.
- •Семантика
- •Правила построения модифицированного тела:
- •Пользовательские процедуры (продолжение)
- •Подпрограммы и функции
- •Описание функции
- •Обращение к функции
Способы обозначения и определения процедур
Мы определили операторы как изменения значений некоторых переменных, имена которых принадлежат состоянию, в зависимости от значений тех же переменных
<
Оператор
… …
Nm→Vm> Nm→Vm’>
где N – имена, V – значения.
В классической математике мы могли бы описать такое преобразование системой прямых определений через равенство
для некоторых функций f1 и fm.
В программировании подобное преобразование записывается в виде:
N1,…,Nm:=f1(N1,…,Nm),…,fm(N1,…Nm)
Программист работает с именами, а не значениями. Такая форма записи процедуры называется оператором кратного присваивания. В реальных языках программирования чаще встречается более простая форма присваивания:
Ni:=fi(N1,…,Nm)
Выполнение (вычисление) оператора присваивания может быть неопределенным в случае, когда либо не определен один из аргументов, либо значение самой функции.
Каждый язык процедурного программирования – язык определения операторов. Сами процедуры можно трактовать как определение оператора заданием способа его вычисления.
Традиционно такой язык определяется:
классом базовых операторов (в частности допустимых присваиваний);
классом операторных конструкций, порождающих путем кратного применения из базовых операторов все более сложные.
Процедурный, операционный, алгоритмический подход - не единственный, но первый успешный, состоявшийся на практике подход к программированию. Потому нам естественно рассматривать как начальный.
Языки блок-схем
В программировании важно отделять имена от значений. Очень похожие имена (формулы, языковые конструкции) могут обозначать разные вещи (функции), наоборот разные имена могут обозначать одну и ту же вещь.
В реальной жизни для того, чтобы отделить собственно имя от значения обычно используют кавычки:
‘Маша’ состоит из 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>}
Выходные потоки изменяют количество компонентов, в ходе выполнения программы. Такие типы данных называются динамическими.