Рекурсия

Оператор 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.