Описание подпрограмм. Вызов подпрограмм. Способы вызова

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

Procedure sum(var a,b : real);

Вызов: sum(a,b);

Function dif(var d : integer);

Вызов: m := n+dif(d);

 

Рекурсия. Когда подпрограмма обращается сама к себе. Пример – вычисление факториала. Program Factorial; var n : integer; Function Fac(n : integer) : real; begin {Fac} if n < 0 then writeln (‘Ошибка ввода N’); else if n = 0 then Fac := 1 else Fac := n*Fac(n-1) end; {Fac} {----------} begin {Factorial} repeat readln(n); writeln(‘n! = ‘, Fac(n)) until EOF end. {Factorial} Рекурсивный косвенный вызов. Когда программа обращается сама к себе путем вызова другой подпрограммы, в которой содержится обращение к первой. Для этого используют опережающее описание: procedure B(j : real); forward; procedure A(i : real); begin … B (i); {вызов процедуры В} … end; procedure B; begin … A(j); {вызов процедуры A} …. end;   Расширенный синтаксис вызова функции. Можно вызвать функцию и не использовать то значение, которое она возвращает (то есть внешне вызов функции выглядит как вызов процедуры) function MyFunc(var x : integer) : integer; begin if x < 0 then x := 0 else MyFunc := x+10 end; var i : integer; begin {main} i := 1; i := 2*MyFunc(i)-100; {стандар. вызов функции} MyFunc(i); {расшир.синтаксис вызова} end. {main)

 


9. Перечисляемые, интервальные типы данных. Составные типы данных: строковый, файловый.

К простым типам относятся порядковые и вещественные типы. К порядковым типам – целый, логический, символьный, перечисляемый и тип-диапазон.

ПЕРЕЧИСЛЯЕМЫЙ – задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками:

Type

colors = (red, white, blue);

cardsuit = (clubs, diamonds, hearts, spades);

Первое значение в списке получает порядковый номер 0, второе 1 и т.д. Максимальная мощность перечисляемого типа составляет 65536 значений.

Если определить переменные

Var

col : colors;

card : cardsuit;

то возможны операторы

col := red; НО НЕ col := hearts;

card := diamonds; card := blue;

 

ТИП-ДИАПАЗОН (ИНТЕРВАЛЬНЫЙ ТИП) – подмножество своего базового типа (любого порядкового типа кроме типа-диапазона). Задается границами своих значений внутри базового типа:

<мин.значение> .. <макс.значение>. Например:

typeили var

dig = 48..57; date : 1..31; Минимальное и максимальное значения констант называются нижней и верхней границами отрезка, определяющего интервальный тип. Нижняя граница должна быть меньше верхней. Над переменными, относящимися к интервальному типу, могут выполняться все операции и применяться все стандартные функции, которые допустимы для соответствующего базового типа. При использовании в программах интервальных типов данных может осуществляться контроль за тем, чтобы значения переменных не выходили за границы, введенные для этих переменных в описании интервального типа. Функции для данного типа: HIGH(x) – возвращает максимального значения типа-диапазона, к которому принадлежит переменная x; LOW(x) – возвращает минимальное значение.

СТРОКОВЫЙ ТИП String. Строка трактуется как цепочка символов. К любому символу в строке можно обратиться как к одномерному массиву array[0..N] of CHAR:

varst : String;

begin;

……..

if st[5] = ‘A’ then …..

end.

 

Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки. Первый значащий символ строки занимает второй байт и имеет индекс 1. Над длиной строки можно совершать необходимые действия и т.о. изменять ее длину (например, можно удалить из строки все пробелы).

Длину строки можно получить с помощью функции LENGTH(st). К строкам можно применять операцию «+» (сцепление): st = ‘a’+ ‘b’ (получим st = ab). Если длина сцепленной строки превысит максимально допустимую длину N, то лишние символы отбрасываются.

Процедуры и функции для данного типа:

CONCAT(s1 [,s2,…sn]) – функция типа string; возвращает строку, представляющую собой сцепление строк-параметров s1,s2…sn.

COPY(st, index, count) – функция типа string; копирует из строки st count-символов, начиная с символа с номером index.

DELETE(st, index, count) – процедура, удаляет из строки st count-символов, начиная с символа с номером index.

INSERT(subst, st, index) – процедура; вставляет подстроку subst в строку st, начиная с символа index.

LENGTH(st) – функция типа integer; возвращает длину строки st.

POS(subst, st) – функция типа integer; отыскивает в строке st первое вхождение подстроки subst и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращается ноль.

STR(x [:WIDTH [:DECIMALS]], st) – процедура, преобразует число х любого вещественного или целого типа в строку символов st. Параметры WIDTH и DECIMALS задают формат преобразования: WIDTH определяет общую ширину поля, выделяемого под соответствующее символьное представление х, DECIMALS – количество символом в дробной части (если х – вещественное).

VAL(st, x, code) – процедура, преобразует строку символов stdво внутреннее представление целой или вещественной переменной х, которое определяется типом этой переменной; параметр code содержит ноль, если преобразование прошло успешно, и тогда в х помещается результат преобразования. В противном случае он содержит номер позиции в строке st, где обнаружен ошибочный символ. а содержимое х не меняется.

UPCASE(ch) – функция типа CHAR, возвращает для символьного выражения ch соответствующую заглавную букву.

 

ФАЙЛОВЫЙ ТИП – файловый тип или переменную файлового типа можно задать одним из 3х способов:

<имя> = FILE OF <тип>; где <имя> ­– имя файлового типа (идентификатор)

<имя> = text; FILE, OF – зарезервированные слова, text – имя стандартного

<имя> = FILE; типа текстовых файлов, <тип> - любой тип, кроме файлов.

В зависимости от способа объявления можно выделить три вида файлов:

1) типизированные (задаются через FILE OF);

2) текстовые (через тип text);

3) нетипизированные (через тип FILE).