Программирование / Лабораторные / АСУ-Иерархиобъектов и группа. Итераторы / АСУ-Иерархия объектов и группа. Итераторы
.docМинистерство среднего и профессионального образования РФ
Пермский государственный технический университет
Кафедра автоматизированных систем управления
Лабораторная работа №3
Иерархия объектов и группа. Итераторы.
Выполнил: Шабурова М.А.
Проверил: Ноткин А.М.
Пермь
2001
Постановка задачи
Требуется определить иерархию классов для определенной предметной области. Дополнить иерархию классами «группа». Определить для классов виртуальный метод Show, который показывает состояние объекта. Написать процедуру которая выполняется для всех объектов, входящих в группу. Написать демонстрационную программу, в которой создаются, показываются и разрушаются объекты – группы, а также демонстрируется использование итератора.
Предметной областью выбран НИИ. В качестве организации группы используется связный список. В качестве процедуры используется процедура, выводящая ИТР с возрастом больше 30.
Вариант работы 25.
Иерархия классов
TObject
TPerson Tinstitut
Titr TPract Totdel TProfkom
Определение классов (добавленных).
PObject=^TObject; {абстрактный тип}
TObject=object
Constructor Init;
Destructor Done; virtual;
Procedure Show; virtual;
end;
PInstitut=^TInstitut;
TInstitut=object(TObject) {абстрактный класс-группа}
naim: string; {наименование}
head: PPerson; {руководитель}
last: PItem; {указатель на начало связанного списка записей типа TItem}
Constructor Init(naim1:string; name1: string; sex1:boolean; age1: byte);
Destructor Done; virtual;
Function GetNaim:string;
Function GetHead:PPerson;
Procedure DelDisp(Var p: PItem);
Procedure SetNaim(NewNaim:string);
Procedure SetHead(NewHead:PPerson);
Procedure Insert(p:PObject); {вставить объект в группу}
end;
POtdel=^TOtdel;
TOtdel=object(TInstitut)
count: byte; {кол-во сотрудников в отделе}
Constructor Init(naim1:string; name1: string; sex1: boolean; age: byte;
count1:byte);
Destructor Done;virtual;
Function GetCount:byte;
Procedure SetCount(NewCount:byte);
Procedure Show; virtual;
Procedure ForEach(action:tproc; parametr:real);
end;
PProfkom=^TProfkom;
TProfkom=object(TInstitut)
countp: byte; {кол-во человек-профоргов}
Constructor Init(naim1:string; name1: string; sex1: boolean; age: byte;
countp1:byte);
Destructor Done;virtual;
Function GetCountp:byte;
Procedure SetCountp(NewCountp:byte);
Procedure Show; virtual;
end;
Реализация класса-группы TOtdel.
Constructor TOtdel.Init(naim1:string; name1: string; sex1: boolean; age: byte; count1:byte);
begin
inherited Init(naim1, name1, sex1, age);
count:=count1;
end;
Destructor TOtdel.Done;
begin
TInstitut.Done;
end;
Function TOtdel.GetCount:byte;
begin
GetCount:=count;
end;
Procedure TOtdel.SetCount(NewCount:byte);
begin
count:=NewCount;
end;
Procedure TOtdel.Show;
begin
inherited Show;
writeln('Количество сотрудников в отделе: ',count);
end;
Procedure TOtdel.ForEach(action: tproc; parametr:real);
var temp: PItem;
begin
temp:=last;
while temp<>nil do
begin
action(temp^.item, parametr);
temp:=temp^.next;
end;
end;
Реализация итератора.
Procedure TOtdel.ForEach(action: tproc; parametr:real);
var temp: PItem;
begin
temp:=last;
while temp<>nil do
begin
action(temp^.item, parametr);
temp:=temp^.next;
end;
end;
Реализация передаваемой итератору процедуры.
procedure View(p: PObject; r: real);
begin
if PPerson(p)^.GetAge>r then writeln(PPerson(p)^.GetName, ' ',
PPerson(p)^.GetAge)
end;
Листинг демонстрационной программы
uses unit31;
var k:PItr;
pg:POtdel;
begin
pg:=new(POtdel, Init('НИИПМ', '23', 'Петров П.П.', true, 50));
k:=new(PItr, Init('Иванов И.И.',true,21,true,'техник',1,1500.50));
pg^.insert(k);
k:=new(PItr, Init('Сидоров С.С.',true,41,true,'техник',1,1200.50));
pg^.insert(k);
k:=new(PItr, Init('Лучших Л.Л.',false,33,true,'высшее',5,1755.50));
pg^.insert(k);
k:=nil;
pg^.ForEach(View, 30.0); {список сотрудников отдела чей возраст >30 лет}
writeln;
writeln;
pg^.show;
dispose(pg, done);
end.