Функции пользователя (описание, вызов, структура). Рекурсивные подпрограммы

В языке Паскаль имеется два вида подпрограмм - процедуры и функции.

Процедуры и функции помещаются в раздел описаний программы. Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров.

Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными - передающиеся из подпрограммы в вызывающий блок (результаты работы подпрограммы).

Одна и та же подпрограмма может вызываться неоднократно, выполняя одни и те же действия с разными наборами входных данных. Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове - фактическими.

Описание и вызов функций 

Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит собственно операторы процедур. 
Формат описания функции:
Function имя функции (формальные параметры): тип результата;
раздел описаний функции
Begin
  исполняемая часть функции
End;
Формальные параметры в заголовке функций записываются в виде:
Var имя праметра: имя типа
отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа.

При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.

Вызов функции в Турбо Паскаль может производиться способом как при процедурах, кроме того имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.

Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок необходимо поместить следующую команду:
имя функции := результат;
При вызове функций необходимо соблюдать следующие правила:
  • количество фактических параметров должно совпадать с количеством формальных; 
  • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.
Заметим, что имена формальных и фактических параметров могут совпадать.
Пример: программа поиска максимума из двух целых чисел.
Var x,y,m,n: integer;
Function MaxNumber(a,b: integer): integer;

Var max: integer;
Begin
  If a>b Then max := a
  Else max := b;
  MaxNumber := max;
End;
Begin
  write('Введите x,y ');
  readln(x,y);
  m := MaxNumber(x,y);
  n := MaxNumber(2,x+y);
  writeln('m=',m,'n=',n);
End.
Рекурсия – способ организации вычислит. процесса, при котором процедура или функция в ходе выполнения ее операторов, обращается сама к себе.

Для того, чтобы такое обращение не было бесконечным, в тексте программы должно быть условие, при выполнении которого дальнейшего обращения к программе не происходит.

Любой рекурсивный алгоритм можно заменить алгоритмом, который использует цикл. Подпрограммы с рекурсией менее эффективны, но короче и нагляднее.

Процедуры пользователя в Pascal (описание, вызов, структура)

В языке Паскаль имеется два вида подпрограмм - процедуры и функции.

Процедуры помещаются в раздел описаний программы. Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров.

Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными - передающиеся из подпрограммы в вызывающий блок (результаты работы подпрограммы).

Одна и та же подпрограмма может вызываться неоднократно, выполняя одни и те же действия с разными наборами входных данных. Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове - фактическими.

Описание и вызов процедур 

Структура описания процедур до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит собственно операторы процедур.

Формат описания процедуры имеет вид:
Procedure имя процедуры (формальные параметры);
раздел описаний процедуры
Begin
  исполняемая часть процедуры
End;

Формальные параметры в заголовке процедур записываются в виде:
Var имя праметра: имя типа
 и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать. Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа.

При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.

Вызов процедуры производится оператором, имеющим следующий формат:
имя процедуры(список фактических параметров); 

Список фактических параметров - это их перечисление через запятую. При вызове фактические параметры как бы подставляются вместо формальных, стоящих на тех же местах в заголовке.

Таким образом происходит передача входных параметров, затем выполняются операторы исполняемой части процедуры, после чего происходит возврат в вызывающий блок. Передача выходных параметров происходит непосредственно во время работы исполняемой части.

При вызове процедур необходимо соблюдать следующие правила:
  • количество фактических параметров должно совпадать с количеством формальных; 
  • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу. 
Заметим, что имена формальных и фактических параметров могут совпадать. Это не приводит к проблемам, так как соответствующие им переменные все равно будут различны из-за того, что хранятся в разных областях памяти.

Кроме того, все формальные параметры являются временными переменными - они создаются в момент вызова подпрограммы и уничтожаются в момент выхода из нее.

Существует два вида переменных:
  • Локальные – описываются в подпрограммах, используются только в той подпрограмме, где были описаны. В основной программе они не известны. 
  • Глобальные – описываются в основной программе до раздела процедур и функций. Область их действий распространяется на основную программу и на все подпрограммы. 
Рассмотрим использование процедуры на примере программы поиска максимума из двух целых чисел.
Var x,y,m,n: integer;
Procedure MaxNumber(a,b: integer; Var max: integer);
Begin
  If a>b Then max := a
  Else max := b;
End;
Begin
  write('Введите x,y ');
  readln(x,y);
  MaxNumber(x,y,m);
  MaxNumber(2,x+y,n);
  writeln('m=',m,'n=',n);
End.

Запись в Pascal. Работа с записями. Прямой доступ к записям

Комбинированный тип данных.

При работе с массивами основное ограничение заключается в том, что каждый элемент должен иметь один и тот же тип. Но при решении многих задач возникает необходимость хранить и обрабатывать совокупности данных различного типа.
Пример
Для каждого из 25 учеников класса известны фамилия и оценка (в баллах) по пяти дисциплинам. Требуется вычислить среднюю оценку каждого ученика и выбрать человека, имеющего максимальный средний балл.

В данном случае фамилия может быть представлена строкой из 15 символов, оценка - это целое число, а средний балл должен быть представлен вещественным (действительным) числом. В Паскале для описания комбинаций объектов разных типов используются записи.

Процедуры ввода – вывода в Pascal

Процедуры ввода информации Read, ReadLn в Pascal

Процедура ввода обеспечивает ввод числовых данных, символов, строк, и т.д. для следующей их обработки программой.
Формат:
Read(X1, X2,…,Xn);
Значения X1, X2,…,Xn набираются минимум через один пробел на клавиатуре пользователем. После набора данных для одной процедуры Read  нажимается клавиша ввода. Значения переменных должны вводится в строгом соответствии с синтаксисом языка Pascal. Если соответствие нарушается ( например X1 имеет тип Integer, а при вводе набирается значение типа Char), то возникает ошибка ввода.

Пример:
Var :
      I: Real;
  J: Integer;
  K: Char;
Begin
  Read(I,J,K);
  …
End. 

Процедуру Read можно использовать для организации пауз произвольной длины при выполнении программы. Для этого достаточно записать: Read(Kbd,Ch). Ch- литерная переменная, Kbd – имя стандартного файла клавиатуры. Программа продолжит работу только после того, как будет нажата любая клавиша на клавиатуре. Введенный символ на клавиатуре не отобразится.
Для ввода данных можно использовать процедуру ReadLn. Она аналогична процедуре Read. После выполнения данной процедуры курсор автоматически перейдет на новую строку.

Выражения в Pascal

Арифметические выражения в Pascal

Арифметические выражения формируются из переменных, констант, функций, знаков операций и круглых скобок. В арифметических выражениях используются следующие арифметические операции:


Выражение
Тип данных
Тип результата
Операция
Пример
A+B
Real
Integer
Real, Integer
Real
Integer
Real
Сложение


A-B
Real
Integer
Real, Integer
Real
Integer
Real
Вычитание

A*B
Real
Integer
Real, Integer
Real
Integer
Real
Умножение

A/B
Real
Integer
Real, Integer
Real
Real
Real
Деление

A div B
Integer
Integer
Целочисленное деление
11 div 5 Þ2
10 div 3Þ3
2 div 3Þ0
A mod B
Integer
Integer
Деление с остатком
11 mod 5Þ1
10 mod 3Þ1
14 mod 5Þ4

Приоритет операций в порядке убывания: /, *, div, mod, -,  +
Для изменения приоритета операций используются круглые скобки.

Например:
(A+B)/(A-B)

Константы в Pascal

Числовые константы

В языке Pascal допускается использование чисел в 10 и 16 системах счисления. Если число представлено в 16 системе счисления, то перед ним без пробела записывается знак $. Диапазон изменения чисел в 16 системе счисления от $00000000 до $FFFFFFFF.

В 10 системе счисления числа могут записываться двумя способами: с фиксированной и с плавающей точкой. Вещественные десятичные числа с фиксированной точкой записываются по обычным правилам арифметики. Целая часть от дробной отделяется точкой. Если точка отсутствует, число считается целым.
 
Например
125 - целое десятичное число
$1FF - 16 -е число
124.674 - вещественное число

Вещественные десятичные числа с плавающей точкой представлены в виде: mE+p, где m - мантисса (целое или дробное число с десятичной точкой), E - означает "десять в степени", р - порядок (целое число).
 
Например
5.18Е +02 -> 5,18*102 -> 518
10Е-03-> 10*10-3 -> 0,01

Строковые и символьные константы

Строка символов - это последовательность любого количества символов (не более 126), расположенных на одной строке и заключенных в апострофы.
 
Например
Const
Symb='TURBO';