- •Тема 2.2. Основные понятия языка программирования высокого уровня Free Pascal
- •Системы программирования
- •Интегрированная среда разработки FreePascal
- •Введение в язык Паскаль Характеристика языка программирования Паскаль
- •Основные понятия технологии программирования
- •Алфавит языка Паскаль
- •Структура программы на Паскале
- •Типы данных
- •Стандартные типы данных
- •Структуры данных
- •Строковый тип
- •Структурированные переменные
- •Представление основных структур программирования на языке Паскаль Операции и выражения
- •Арифметические операции и выражения
- •Логические операции
- •Оператор присваивания
- •Составной оператор
- •Условный оператор
- •Процедура write
- •Процедура ввода
- •Оператор выбора
- •Операторы повторений
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Оператор цикла с параметром
- •Метки и операторы перехода
- •Работа с массивами
- •Операции над строками
- •Функция Length
- •Функция Upcase
- •Функция Сopy
- •Функция Pos
- •Процедуры Insert и Delete
- •Процедура Str
- •Процедура val
- •Практические примеры работы со строковыми данными
- •Оператор присоединения with
- •Процедуры и функции Паскаля
- •Формальные и фактические параметры
- •Типизированные константы
- •Interface
- •Implementation
- •Interface
- •Interface
- •Implementation
- •Файловый тип данных Типизированные файлы
- •Текстовые файлы
Процедуры и функции Паскаля
Процедуры и функции, называемые также подпрограммами, представляют собой относительно самостоятельные фрагменты программы, оформленные особым способом и имеющие имя. Упоминание этого имени в тексте программы называется вызовом процедуры (функции). Функция отличается от процедуры тем, что результатом ее работы является единственное значение, поэтому обращение к функции можно использовать в выражениях вместе с переменными и константами.
Перед использованием (вызовом) любую пользовательскую процедуру или функцию нужно описать в разделе описаний. Описание подпрограммы состоит из заголовка и тела подпрограммы.
Заголовок процедуры имеет вид:
procedure <имя> (<сп.форм.пар.>);
Заголовок функции имеет вид:
function <имя> (<сп.форм.пар.>) : <тип>;
Здесь <имя> – имя подпрограммы (правильный идентификатор);
<сп.форм.пар.> – список формальных параметров;
<тип> – тип возвращаемого функцией результата.
Список формальных параметров необязателен и может отсутствовать. Если список присутствует, он должен содержать имена формальных параметров и их типы. Параметры в списке отделяются друг от друга символом «точка с запятой», например:
procedure S1(a: integer; b: real; ch: char);
Несколько следующих подряд однотипных параметров можно объединять в подсписки, например, вместо
function F(a: real; b: real) : real;
можно записать
function F(a,b: real) : real;
Тело процедуры (функции), подобно программе, состоит из раздела описаний и раздела исполняемых операторов. В разделе описаний подпрограммы могут встретиться описания других подпрограмм более низкого уровня. Такие конструкции называются вложеннымипроцедурами (функциями).
Подпрограмма любого уровня может иметь любое количество констант, переменных, типов и вложенных в нее подпрограмм низшего уровня. При этом считается, что все имена, описанные внутри подпрограммы, локализуются в ней, они как бы «невидимы» снаружи подпрограммы. Все имена в пределах подпрограммы, в которой они объявлены, должны быть уникальными и не могут совпадать с именем самой подпрограммы.
При входе в подпрограмму низшего уровня доступны не только объявленные в ней имена, но и все имена верхнего уровня. Образно говоря, любая подпрограмма как бы окружена полупрозрачными стенками: снаружи подпрограммы мы не видим ее внутренности, но, попав в подпрограмму, можем наблюдать все, что делается снаружи. Все объекты, которые описаны до данной процедуры, являются для нее глобальными. Имена, локализованные в подпрограмме, могут совпадать с ранее объявленными глобальными именами. В этом случае считается, что локальное имя «закрывает» глобальное и делает его недоступным.
Любая подпрограмма может вызвать саму себя – такой способ вызова называется рекурсией.
Формальные и фактические параметры
Формальные параметры, объявленные в заголовке процедуры или функции, рассматриваются как расширение раздела описаний. Их можно использовать в теле подпрограммы как обычные переменные. При вызове процедуры или функции формальные параметры заменяются фактическими. Рассмотрим для примера простейшую функцию, определяющую минимум их двух чисел.
Program test;
var a, b, c, d: integer;
{ описание функции, определяющей минимум }
function min(x, y: integer) : integer;
begin
if x < y then min := x else min := y;
end; { конец функцииmin}
begin { начало основной программы }
writeln(‘Введите первую пару целых чисел’);
readln(a,b);
writeln(‘Минимум равен ‘, min(a,b));
writeln(‘Введите вторую пару целых чисел’);
readln(c,d);
writeln(‘Минимум равен ‘, min(c,d));
readln;
end.
В данном примере вначале описана функция min, определяющая минимум из двух целых чиселxиy. Нужное значение присваивается идентификатору – имени функции. Именно этот результат и будет возвращен как значение функции при выходе из нее. Затем в основной программе функцияminвызывается дважды: вначале для чиселaиb, затем для чиселcиd. Переменныеa,b,c,dявляются фактическими параметрами, переменныеxиy– формальными. При вызове процедуры или функции на место формальных параметров подставляются фактические. Таким образом, механизм формальных параметров позволяет настраивать алгоритм на нужные данные.
Паскаль следит за тем, чтобы количество и тип формальных параметров строго соответствовали количеству и типу фактических параметров в момент обращения к подпрограмме. Порядок перечисления фактических параметров при вызове процедуры или функции должен соответствовать порядку следования формальных параметров в ее заголовке. За этим необходимо следить программисту.
В Паскале различают параметры-значения, параметры-переменные и параметры-константы. Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово var, а если это параметры-константы, – словоconst, например:
procedure Myproc: (var a: real; b: real; const c: string);
Здесь a– параметр-переменная,b– параметр-значение,c– параметр-константа.
Формальному параметру-переменной должен соответствовать фактический параметр в виде переменной соответствующего типа, параметру-значению и параметру-константе может соответствовать выражение совместимого типа. За соблюдением этого правила следит компилятор Паскаля.
Если параметр определен как параметр-значение, подпрограмме передается копия этого значения. Изменения в подпрограмме параметра-значения не изменяет данные в вызывающей программе.
Если параметр определен как параметр-переменная, в подпрограмму передается адрес переменной.Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе.
В случае параметра-константы в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.
Выходные данные в процедурах должны быть параметрами-переменными. Перед ними должно обязательно указываться ключевое слово var.
