Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование / Лабораторные / АСУ-Иерархиобъектов и группа. Итераторы / АСУ-Иерархия объектов и группа. Итераторы

.doc
Скачиваний:
56
Добавлен:
10.12.2013
Размер:
37.89 Кб
Скачать

Министерство среднего и профессионального образования РФ

Пермский государственный технический университет

Кафедра автоматизированных систем управления

Лабораторная работа №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.