Рекурсия
Оператор with
Обращение к полям записи
Записи
Записи - это структурированный тип данных языка паскаль, состоящий из фиксированного числа компонентов разного типа.
Record – Имя компонента - : - тип компонента – end;
Типами компонентов могут быть любые типы, в том числе и сами записи.
Имя компонента должны быть уникальны в пределах записи, но может совпадать с названиями других элементов программы.
Имя записи - . – Имя компонента
Пример1:
Type
Bd=record
Day,month:byte;
Year:word
End;
Var bd:bd;
Begin
Writeln (‘Ввеите дату рождения’);
Write(‘число’); readln(bd.day);
Write(‘месяц’); readln(bd.mounth);
Write(‘Год’); readln(bd.year);
End.
Пример2:
Type
Texam=(history,algebra,matan);
TSudent=record
Name,sename:string[20];
Date:record
Day:1..31;
Mount:1..12;
Year:word;
End;
Group:word;
Marks:array[texam] of 2..5;
Var st1,st2:tstudent; i:word;
Institute:array[1..300] of tstudent;
Exam:texam;
Begin
St1.name:=’Иван’;
St1.suname:=’Смирнов’;
St1.date.day:=24;
St1.date.mouth:=2;
St1.date.year:=1992;
St1.group:=114;
St1.marks[history]:=3;
St1.marks[algebra]:=4;
St1.marks[matan]:=5;
St2:=st1;
Institute[8].date.day:=30;
For i:=1 to 300 do
For exam:=history to matan do
Readln(Institute[i].marks[exam]);
End.
Пример3:
Var a:record
F:char;
B:record
A:byte;
F:word;
End
End;
With – Имя записи – do – оператор
With st1 do
Begin
Name:=’Иван’;
Suname:=’Смирнов’;
Date.day:=24;
Date.mounth:=2;
Date.year:=1992;
End;
With st1 do
Begin
Name:=’Иван’;
Suname:=’Смирнов’;
With date do
day:=24;
mounth:=2;
year:=1992;
End;
With st1,date do
Begin
Name:=’Иван’;
Suname:=’Смирнов’;
day:=24;
mounth:=2;
year:=1992;
End;
Записи с вариантами
Пример1:
Type
Rec=record
{Описание фиксированных частей}
V1,v2:integer;
{Описание вариативной части}
Case n:word of
0: (Список полей)
1: (Список полей)
End;
Case – имя селектора - : тип - of – Коннст - : - ( - Имя компонента - : - Тип - )
Type
texamW= (history,algebra,matan);
texamS= (matan,TP,DM);
tstudent = record
name,suname:string;
Date:record
Day:1..31;
Mount:1..12;
Year:word;
End;
Group:word;
Case session:byte of
1: (marksw:array[texamw] of 2..5);
2: (markss:array[texams] of 2..5);
End;
Var
St1:tstudent;
Begin
St1.name:=’Иван’;
St1.suname:=’Смирнов’;
St1.date.day:=24;
St1.date.mouth:=2;
St1.date.year:=1992;
St1.group:=114;
St1.Session:=1;
St1.marksW[history]:=3;
St1.marksW[algebra]:=4;
St1.session:=2;
St1.Markss[tp]:=5;
Sizeof(st1)= 52 байта (Функция размера записи в байтах);
Рекурсия – это вызов подпрограммы самой себя
1) Прямая
2) Косвенная
Прямая(пример):
Procedure p;
Begun
………..
P;
…………
End;
Косвенная(пример)
Procedure p(x:byte);
Begin
…………..
Q(x);
…………..
End;
Procedure q(y:byte);
Begin
…………..
P(y);
……………..
End;
Для того что бы не нарушить правила опережающего описания
Procedure q(x:byte); forward
Procedure p(y:byte);{С полным списком формальных параметров}
Begin
…………..
Q(x);
…………..
End;
Procedure q;{Без списка формальных параметров}
Begin
…………..
P(y);
……………..
End;
Procedure popendog;
Begin
Writeln(‘У попа была собака’);
Writeln(‘Он ее любил’);
Popendog;
End;
Обязательным является условие выхода из рекурсии
Begin
If ….then popendog
End.