- •Начальные сведения
- •Алфавит
- •Лексемы, разделители и комментарии
- •Форма Бэкуса-Наура
- •Структура программы на Паскале
- •Типы данных
- •Базовые возможности Паскаля
- •Стандартные типы данных
- •Константы
- •Конструирование типов
- •Перечисления
- •Диапазоны (интервалы)
- •Массивы
- •Описание переменных и типов данных
- •Var a,b,c: Real; {описаны переменные вещественного типа}
- •I,j,k,l,m,n:Integer; {описаны переменные целого типа}
- •Оператор присваивания
- •Условные операторы
- •Оператор If
- •Оператор Case
- •Операторы цикла
- •Цикл While
- •Цикл Repeat-Until
- •Цикл For
- •Оператор безусловного перехода и метки
- •Пустой оператор
- •1: End; {конец тела цикла с помеченным пустым оператором}
- •Процедуры и функции
- •Описание
- •Список формальных параметров
- •Вызов процедур и функций
- •Локализация (области видимости) имен. Глобальные и локальные объявления.
- •Статическое и динамическое выделение памяти переменным
- •Рекурсия и опережающее описание
- •Стандартные функции
- •Стандартные процедуры
- •Стандартный ввод-вывод
- •Сложные типы данных и их использование
- •Квалификаторы
- •Конструкция записи, тип записи и переменная типа запись
- •Id:Person; {личные данные}
- •Id:Person; {личные данные}
- •Index: Ch; {Название/номер группы}
- •Использование записей в программе
- •Оператор With
- •Записи с вариантными полями
- •0:(I:Integer) {Два байта как одно поле Integer}
- •1:(Lo,hi:Char); {отдельно младш. И старш. Байты}
- •Var e: Integer; {в этой переменной будем менять байты}
- •Указатели и динамические структуры данных
- •Определение и описание
- •I:integer; {Информационное поле}
- •Var p,q:Point; {переменные-указатели на записи типа Rec}
- •Использование указателей и динамических переменных
- •Создание и уничтожение динамических переменных
- •Простейшие динамические структуры
- •Множества
- •Назначение и описание
- •Константы типа множество
- •Операции с множествами
- •Назначение и описание
- •Работа с файлами
- •Файлы типа Text
Вызов процедур и функций
Синтаксис вызова процедур и функций одинаков:
<вызов процедуры или функции>::= <имя процедуры или функции> ["(" <фактический параметр> {";" <фактический параметр> ")"].
Как отмечалось ранее, отличие состоит в том, что вызов процедуры – это отдельный оператор, а вызов функции – это частный случай фактора (сомножителя) в выражении.
Типы, количество и последовательность фактических параметров должны соответствовать описаниям в списке формальных параметров.
Пример. Если в программе описаны переменные V, D, h типа Real и функция CircleS из примера в предыдущем пункте, можно вычислить объем цилиндра диаметром 0,8 метров и высотой 1,2 метра следующим образом:
D:=0.8; h:=1.2; {Задаются исходные данные}
V:=h*CircleS(D/2); {Вычисляется объем цилиндра}
Во второй строке в функцию CircleS передается радиус, как диаметр, деленный пополам. Результат выполнения функции CircleS (площадь круга в основании цилиндра) умножается на высоту цилиндра h, и значение объема заносится в переменную V.
Локализация (области видимости) имен. Глобальные и локальные объявления.
Если в каком-то блоке определено имя программного элемента (константы, типа данных, переменной, процедуры или функции), это имя можно использовать для доступа к объекту от места, где оно определено, до конца соответствующего блока. В том числе, во всех блоках, вложенных в этот блок, по этому имени будет доступен тот же самый объект.
Имя, определенное во вложенном блоке, во внешнем блоке недоступно.
Если во вложенном блоке определен элемент с таким же именем, которое было назначено другому элементу во внешнем блоке, то во внешнем блоке по этому имени доступен элемент, объявленный во внешнем блоке, а во вложенном блоке доступен элемент, объявленный во вложенном блоке.
Имя функции считается объявленной переменной внутри этой функции, используемой для возврата результата из функции.
Таким образом, любой элемент, объявленный в блоке программы, доступен всем процедурам и функциям, объявленным в той же программе после этого элемента. Такие элементы называют глобальными.
Элементы, объявленные в процедуре или функции, доступны только внутри соответствующей процедуры или функции, а также в процедурах и функциях, вложенных в эту процедуру или функцию после места объявления соответствующего элемента. Они не доступны в блоке программы и в других процедурах и функциях, вложенных непосредственно в блок программы. Такие элементы называют локальными.
Статическое и динамическое выделение памяти переменным
В стандартном Паскале глобальным переменным память выделяется статически. Это значит, что для каждой переменной выделяется необходимое количество ячеек памяти (байтов) на все время работы программы.
Локальным переменным память выделяется динамически – на время работы процедуры или функции, в которой такая переменная объявлена. При этом локальные переменные размещаются в стеке.
Стек – это такой тип организации памяти, при котором последний элемент, загруженный в стек, извлекается в первую очередь. Соответственно, первый загруженный элемент извлекается из памяти последним. Поэтому стек называют также очередью LIFO (Last In, First Out). Доступ к стеку осуществляется через "верхушку стека".
При вызове, например, процедуры, ее локальные переменные получают место в стеке. Если эта процедура вызовет, например, функцию, локальные данные этой функции размещаются в стеке "над" локальными переменными процедуры. По окончании работы функции освобождается часть стека, занятая ее локальными переменными. По окончании работы процедуры освобождается место, занятое ее переменными. Благодаря такой организации памяти для локальных переменных, одни и те же области памяти могут попеременно использоваться для размещения данных разных процедур и функций.
В некоторых языках, например, в Си, режимом выделения памяти переменным можно управлять. В стандартном Паскале это не предусмотрено. Поэтому если процедуре или функции нужны статические переменные (например, для хранения каких-то данных от одного вызова до другого), их следует объявлять в блоке программы. Однако нужно аккуратно использовать статические данные. Поскольку они доступны как в самой программе, так и во всех процедурах и функциях, можно сделать ошибку, которую затем будет трудно обнаружить.