
- •Основные понятия языка программирования паскаль
- •Структурное программирование
- •Основные символы языка
- •Элементы языка
- •Интегрированная среда turbo pascal
- •Структура программы в turbo pascal
- •Определение типов
- •Операторы в программе
- •Операторные скобки
- •Операторы ввода
- •Оператор присваивания
- •Оператор условного перехода
- •Оперетор безусловного перехода
- •Организация циклов
- •Использование операторов условного и безусловного перехода
- •Цикл с параметром
- •Цикл с предусловием - цикл while
- •Цикл с постусловием - цикл repeat
- •Оператор выбора варианта
- •Концепция типов данных
- •Стандартные простые типы Целый тип
- •Операции над данными целого типа:
- •Действительный тип
- •Операции над данными действительного типа:
- •Логический тип
- •Символьный тип
- •Символьные строковые константы
- •Нестандартные простые типы (определяемые пользователем)
- •Перечисляемый тип
- •Ограниченный тип (диапазон, интервал)
- •Процедуры и функции
- •Описание процедур
- •Стандартные процедуры
- •Описание функций
- •Стандартные функции
- •Итерация и рекурсия
- •Побочный эффект рекурсии
- •Предварительное описание (ссылки вперед)
- •Регулярные типы Одномерный массив
- •Алгоритмы сортировки массивов
- •1. Метод пузырька (метод обменной сортировки с выбором)
- •Многомерные массивы
- •Упакованные массивы
- •Множественные типы
- •Свойства множеств
- •Операции над множествами
- •Комбинированные типы Описание записей и действия с ними
- •Оператор присоединения.
- •Записи с вариантами
- •Типизированная константа
- •Простая типизированная константа
- •Структурированная (сложная) типизированная константа Типизированная константа массива
- •Типизированная константа записи
- •Типизированная константа множества.
- •Преобразование типов
- •Неявные преобразования типов
- •Использование стандартных функций для преобразования
- •Явные преобразования типов
- •Эквивалентность типов
- •Совместимость типов
- •Файловые типы
- •Определение файлового типа
- •Структура файла
- •Имя файла
- •Описание файлового типа
- •Файловая переменная
- •Операции над файлами
- •Типизированные файлы
- •Ссылочные типы (указатели) Статические и динамические переменные
- •Ссылочные типы (указатели)
- •Удаление узла из стека:
- •Человек
- •Человек
- •Вставка
- •Динамические переменные
- •Процедуры создания и удаления динамических переменных
- •Динамические списковые структуры
- •Однонаправленные списки
- •Двунаправленные списки
- •Очереди
- •Деревья
- •Модульная система turbo pascal
- •Uses mod 1, mod 2, mod 3; (подключение трех модулей) Общая структура модуля
- •Использование идентификаторов модуля
- •Использование модуля в программе
- •Компиляция модулей
- •Системный файл turbo.Tpl
- •Стандартные модули
- •Модуль crt
- •Модуль dos
- •Модуль printer
- •Модуль overlay
- •Модуль string
- •Процедуры модуля graph
- •Графические процедуры
- •Координаты. Окна. Страницы
- •Линии и точки
- •Многоугольники
- •Дуги,окружности, эллипсы
Побочный эффект рекурсии
В теле подпрограммы известны, то есть доступны все объекты, описанные в объемлющем блоке, в том числе и имя самой подпрограммы. Внутри тела подпрограммы возможен вызов самой подпрограммы. Параметры и функции использующие вызовы “самих себя“, называются рекурсивными. Допустима также косвенная рекурсия, при которой параметр А вызывает параметр В, а тот, в свою очередь, вызывает С, который вызывает первоначальный параметр А.
Рекурсия достаточно широко применяется в программировании, что основано на рекурсивной природе многих математических алгоритмов. В языке программирования Паскаль нет никаких ограничений на рекурсивные вызовы подпрограмм, необходимо только понимать, что каждый очередной рекурсивный вызов приводит к образованию новой копии локальный объектов подпрограммы и все эти копии, соответствующие цепочке активизированных и не активизированных рекурсивных вызовов, существующих независимо друг от друга.
При выполнении функций возникает один неожиданный эффект, причиной которого является изменение значений нелокальных переменных в теле функции.
Если в некоторой функции имеются конструкции, например, операторы присваивания, изменяющие значения переменных, описанных в объемлющих блоках, то может возникнуть ситуация, при которой значения выражения, использующего вызов такой функции, зависит от порядка следования операторов, что является потенциальным источником ошибок и поэтому крайне нежелательно. Описанная ситуация называется побочным эффектом рекурсии.
Пример:
Program Side Effect;
Var a,z :integer;
Function change (x: integer): integer;
Begin
Z:=z-x; {изменяем значение нелокальной переменной}
Change:= sqr (x)
End;
Begin
Z:=10; a:=change (z); writeln(a,z);
Z:=10; a:=change (10)*change (z);
Writeln(a,z);
Z:=10; a:=change (z) * change(10);
Writeln (a,z)
End.
Выполнение этой программы приводит к следующему результату на дисплее:
100 0
10000 -10
0 0
Т.е. два последних присваивания переменной а дают различный результат, хотя правила вычисления выражений предлагают равноправные сомножители.
Следует всячески избегать такой зависимости функции от глобальных по отношению к ней переменных. Заметим, что современные языки, например, Ada содержит прямые запреты на подобные действия.
Предварительное описание (ссылки вперед)
Объявления констант и переменных в любом блоке располагаются перед скобками begin ...end (в этих скобках заключены сами операторы). Поэтому компилятору никогда не приходится иметь дело с оператором, содержащим константы и переменные, которых он не знает, это вызовет во время компиляции сообщение об ошибке. Все это справедливо и в отношении подпрограмм (т.е. функций и процедур). Программист обязан следить за правильным порядком следования определений (описаний).
Пример :
Program Demo;
Var a, b ,c : real ;
Procedure Ring (var s , l : real ; d : real);
Begin L:=3.14 *d; {длина окружности }
S:=cir (d) ; {компилятор еще не знает о функции cir}
End;
Function Cir (d: real): real; {площадь круга }
Begin cir:= 3.14* sqr(d) / 4;
End;
………………………………………………………………………
Очевидный выход – поменять порядок строк так, чтобы функция Cir была определена перед процедурой Ring(…) .Однако можно и иначе.
Действия:
1. Оставить подпрограмму (функцию cir) на своем месте, вычеркнув из ее заголовка все параметры: Function cir;
2. Вставить полный заголовок там, где ему надлежит бытью, т.е. перед подпрограммой, которая его вызывает.
Function cir (d: real): real;
После полного заголовка добавить слово Forward.