Описание подпрограмм. Вызов подпрограмм. Способы вызова
Вызов процедуры осуществляется путем написания имени подпрограммы и списка формальных параметров, а вызов функции – в какой-либо формуле или операторе главной программы:
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).