Структурированный тип запись. Массив записей в динамической памяти. Построение на экране меню, страница 2

For i:=1 to n do begin

With rec^[i] do

WriteLn('¦ ',masN^[i]:7,' ¦ ',name:21,' ¦ ',material:18,' ¦',kolvo:19,' ¦');

if i<>n then

WriteLn('¦---------+-----------------------+--------------------+--------------------¦');

end;

WriteLn('L---------¦-----------------------¦--------------------¦---------------------');

readkey;

end;

procedure FinRec(n:byte;rec:ptrdetals;var Pole:string;var k:byte;var masFind:ptrdetals;masN:ptrarr);

const

z=3;

Men:array[1..z] of string=(

'Название детали',

'Материал детали',

'Количество деталей');

var

i,b,ans:byte;

j,c,ord_,buff:integer;

answ:string[20];

begin

clrscr;

if l=0 then begin

WriteLn('Сначала нужно ввести записи!');

readkey;

exit;

end;

Write('Введите критерий поиска: ');

ShowMeny(z,1,WhereY+1,25,WhereY+1+z,Men,ans);

Case ans of

1: Pole:='название';

1: Pole:='материал';

1: Pole:='количество';

end;

if ans=3 then

Write('Введите количество искомых деталей: ')

else begin

Write('Введите ');

if ans=1 then

Write('название');

if ans=2 then

Write('материал');

Write(' искомой детали: ');

end;

ReadLn(answ);

k:=0;

For i:=1 to n do

Case ans of

1: begin

if rec^[i].name=answ then begin

inc(k);

with masFind^[k] do begin

name:=rec^[i].name;

material:=rec^[i].material;

kolvo:=rec^[i].kolvo;

end;

masN^[k]:=i; end end;

2: begin

if rec^[i].material=answ then begin

inc(k);

with masFind^[k] do begin

name:=rec^[i].name;

material:=rec^[i].material;

kolvo:=rec^[i].kolvo;

end;

masN^[k]:=i;  end end;

3: begin

ord_:=0;

b:=0;

For j:=length(answ) downto 1 do begin

inc(b);

buff:=1;

For c:=1 to j-1 do

buff:=buff*10;

ord_:=ord_+(ord(answ[b])-48)*buff;

end;

if rec^[i].kolvo=ord_ then begin

inc(k);

with masFind^[k] do begin

name:=rec^[i].name;

material:=rec^[i].material;

kolvo:=rec^[i].kolvo;

end;

masN^[k]:=i; end end;

end;

end;

begin

new(sklad);

new(masFind);

new(masN);

new(masNF);

l:=0;

Repeat

clrscr;

Write('Программа обработки записей по деталям. ');

Write('Вы можете: ');

ShowMeny(k,1,WhereY+1,25,WhereY+1+k,a,choose);

Case choose of

1: AddRec(l,sklad,masN);

2: DelRec(l,sklad);

3: begin

Clrscr;

TabRec(l,sklad,masN);

end;

4: begin

FinRec(l,sklad,Pole,klFind,masFind,masNF);

clrscr;

WriteLn('Результаты поиска по полю ',Pole,':');

TabRec(klFind,masFind,masNF) end;

5: begin

dispose(sklad);

dispose(masFind);

dispose(masNF);

dispose(masN);

textattr:=$07;

exit end;

end;

until false;

end.


 Что нужно знать:

·  запись – Структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов, называемых полями записи.

·  операции с записями – К записи в целом применим оператор присваивания (если записи одного типа), все остальное (выражения отношения, арифметические и тд.) применимо только к полям записи.

·  поле записи, селектор – Поле записи – компонента записи определенного типа и имеющая имя. Делятся на фиксированные и вариантной. Вариантная часть задается с помощью оператора  case ... of и может состоять из нескольких вариантов. Case задает особое поле записи – поле признака, которое определяет, какой из вариантов в каждый момент выполнения программы должна быть одна из расположенных в операторе case констант – константы выбора (селектора).

·  статическое и динамическое распределения памяти – Статическая память – память выделяемая при запуске программы (код программы, коды подключаемых модулей, сегмент данных (глобальные переменные и типизированные константы), стек); Динамическая память (heap) – память, выделяемая по требованию программы. Heap занимает всю свободную ОП.

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

·  операции с указателями - ?

·  разветвление программы по нескольким направлениям - ?