- •Начальные сведения
- •Алфавит
- •Лексемы, разделители и комментарии
- •Форма Бэкуса-Наура
- •Структура программы на Паскале
- •Типы данных
- •Базовые возможности Паскаля
- •Стандартные типы данных
- •Константы
- •Конструирование типов
- •Перечисления
- •Диапазоны (интервалы)
- •Массивы
- •Описание переменных и типов данных
- •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
Процедуры и функции
Процедуры и функции – это самостоятельные компоненты программы, выполняющие определенные действия. Преимущество их использования состоит в том, что их можно написать один раз, и многократно использовать в одной программе с разными исходными данными, и в разных программах. Отличие между ними в том, что обращение к функции может быть использовано в выражении как фактор (см. описание выражения в разделе "Оператор присваивания"), а обращение к процедуре является отдельным оператором.
Описание
Процедуры и функции описываются в программе в разделе описания процедур и функций (см. подраздел "Структура программы на Паскале"). Их описание такое же, как и у программы, только в конце вместо точки ставится точка с запятой:
<процедура>::= <заголовок процедуры> ";" <блок> ";".
<функция>::= <заголовок функции> ";" <блок> ";".
Синтаксис блока описан в подразделе "Структура программы на Паскале". Синтаксис заголовков:
<заголовок процедуры>::= <имя> ["("<список формальных параметров>")"].
<заголовок функции>::= <имя> ["("<список формальных параметров>")] ":"<тип результата>.
Поскольку функция является частным случаем фактора, с ее именем связываются ячейки памяти, в которые заносится результат (или один из результатов) выполнения функции. Говорят, что функция возвращает результат через свое имя. Это значение, возвращенное через имя, используется как фактор в выражении (см. структуру выражения в подразделе "Оператор присваивания"). Поэтому в исполняемом разделе функции (в составном операторе, входящем в блок функции) должен быть хотя бы один оператор присваивания вида:
<оператор возврата результата> ::= <имя функции> ":=" <выражение> .
Тип результата должен быть простым типом или указателем.
Список формальных параметров
Формальные параметры – это переменные, через которые производится обмен данными с процедурами и функциями. С формальными параметрами можно производить операции внутри процедур и функций. При обращении к процедуре или функции формальные параметры заменяются фактическими параметрами. Так достигается автономность процедур и функций при их разработке. Имена формальным параметрам присваивает разработчик процедур и функций, а программист, использующий процедуры и функции, просто подставляет нужные фактические параметры при вызове соответствующей процедуры или функции.
Синтаксис:
<список формальных параметров>::=<описание формальных параметров> {";" <описание формальных параметров>}.
<описание формальных параметров>::=["Var"] <имя> {","<имя>}":"<имя типа> | <заголовок функции> | <заголовок процедуры>.
В Паскале возможны три различных формата описания формальных параметров:
1) Параметр-переменная;
2) Параметр-значение;
3) Процедурный (функциональный) параметр.
Рассмотрим их подробнее.
Параметр-переменная. Описание начинается словом Var, и похоже на описание переменных в соответствующем разделе описаний.
Фактическим параметром для формального параметра-переменной должна быть переменная такого же типа. Говорят, что при вызове процедуры или функции значение, содержащееся в фактическом параметре, передается в формальный параметр, а по окончании выполнения процедуры или функции значение из формального параметра возвращается в переменную – фактический параметр.
В действительности, на время выполнения процедуры или функции формальному параметру назначаются те же ячейки памяти, которые назначены соответствующему фактическому параметру. Поэтому любое изменение значения формального параметра автоматически изменяет значение соответствующего фактического параметра. Поскольку формальный параметр-переменная ссылается на ячейки фактического параметра во время выполнения процедуры или функции, параметр-переменную называют также параметром-ссылкой.
Таким образом, через параметр-переменную можно передавать данные в процедуру или функцию и возвращать результат выполнения процедуры или функции.
По окончании выполнения процедуры или функции связь формального параметра с ячейками памяти, выделенными фактическому параметру, разрывается, а любое изменение, сделанное в формальном параметре, остается в соответствующем фактическом параметре.
Параметр-значение.
Описание похоже на описание переменных в соответствующем разделе описаний, но ему не предшествует слово Var.
Фактическим параметром для формального параметра-значения должно быть выражение такого же, или совместимого типа.
При вызове процедуры или функции вначале вычисляется выражение – фактический параметр. Значение выражения заносится в переменную – формальный параметр-значение. По окончании выполнения процедуры или функции содержимое параметра-значения теряется. Таким образом, через параметр-значение можно передавать данные в процедуру или функцию, но нельзя передавать результаты из процедуры или функции.
Рекомендации по использованию параметров-переменных и параметров-значений следующие. Когда нет явной необходимости возвращать результат из процедуры или функции через соответствующий параметр, лучше использовать параметр-значение. При этом обеспечивается лучшая локализация процедуры или функции и уменьшается вероятность трудно обнаруживаемых ошибок, связанных с изменением значения формального параметра внутри процедуры или функции. Кроме того, обеспечивается большее удобство при вызове, так как фактическим параметром может быть выражение. Однако если нужно передать в процедуру или функцию большой массив, использование параметра-переменной сэкономит время на копировании данных из фактического параметра в формальный параметр, так как данные в параметр-переменную не копируются, вместо этого настраивается ссылка параметра-переменной на соответствующую область памяти фактического параметра.
Процедурный (функциональный) параметр. В стандартном Паскале описание такого параметра выглядит как заголовок процедуры или функции.
Фактическим параметром для такого формального параметра должно быть имя процедуры или функции с такой же структурой заголовка.
В процедуре или функции можно описать вызов формальной процедуры или функции, а затем, при выполнении процедуры или функции в этом месте будет вызываться процедура или функция, переданная в качестве фактического параметра. Например, если мы разрабатываем процедуру, строящую таблицу значений функции на заданном интервале и с заданным шагом, мы можем захотеть, чтобы можно было строить таблицы разных функций. Используя процедурный или функциональный параметр, мы можем при разных вызовах нашей процедуры передавать в нее имена разных функций.
Следует отметить, что в некоторых реализациях Паскаля эта возможность реализована по-иному. Например, в Turbo Pascal введено понятие процедурного и функционального типа, конструкция которого имеет вид заголовка процедуры или функции без имени. Соответственно, можно описать переменную типа процедуры или функции в списке формальных параметров, а затем подставлять вместо этой переменной имена фактических процедур или функций с соответствующей структурой заголовков.
Пример: функция, вычисляющая площадь круга .
Function CircleS(R:Real):Real;
Const Pi=3.14159265;
Begin
CircleS:=Pi*R*R
End;
В этой функции один формальный параметр-значение и один результат, возвращаемый через имя функциии.
Пример: процедура для нахождения действительных корней квадратных уравнений вида ax2+bx+c.
Procedure SqEqRoots(a,b,c:Real;Var x1,x2:Real;Var Err:Boolean);
Var d:real;
Begin
d:=b*b-4*a*c; {вычисление дискриминанта}
If d>=0 then begin
d:=sqrt(d);
x1:=(-b-d)/(2*a);x2:=(-b+d)/(2*a);
Err:=False End
else Err:=true
End;
В этой процедуре через параметры-значения передаются коэффициенты квадратного уравнения, через параметры-переменные возвращается результат. Если уравнение имеет действительные корни, они возвращаются через параметры-переменные x1 и x2, а параметр-переменная Err, используемая как признак ошибки, будет иметь значение False. Если у уравнения нет корней, признак ошибки будет иметь значение True, а содержимое переменных x1 и x2 не изменится. В процедуре использована стандартная функция sqrt, которая вычисляет квадратный корень из аргумента (фактического параметра). Подробнее стандартные функции рассмотрены далее.