1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Хочу понять ООП. есть задача, что нужно делать и как правильно нужно делать
Сама задача выглядит вот так: Дан файл "Багаж пассажиров", который содержит данные о количестве вещей и их общем весе для каждого пассажира. Выделить пассажиров, данные которых превышают средние показатели файла. Объясните пожалуста... код мне впринципе ненужен!
constructor tpassenger.Init; begin inherited; // инициализируем предка // все операции по выделению памяти - здесь end; destructor tpassenger.done; begin // здесь - все операции по освобождению памяти, если нужно inherited; // удаляем предка end;
procedure TPassenger.Get(var f: text); var ch: Char; begin ch := #0; name := ''; repeat read(f, ch); if ch <> ' ' then name := name + ch; until ch = ' '; read(f, amount); read(f, weight); readln(f); end; procedure TPassenger.Print; begin writeln(name:10, '':2, amount:5, '':2, weight:5); end;
constructor TListItem.CreateItem(p: PTBaseItem; _prev, _next: PTListItem); begin info := p; prev := _prev; next := _next; end; destructor TListItem.DestroyItem; begin Dispose(info, Done); end;
constructor TBaseList.Init; begin head := nil; tail := nil; end; destructor TBaseList.Done; begin while Assigned(head) do RemoveItem(head); end;
procedure TBaseList.Append(p: PTPassenger); var newItem: PTListItem; begin new(newItem, CreateItem(p, tail, nil)); if head = nil then head := newItem else tail^.next := newItem;
tail := newItem; end;
function TBaseList.find(func: TCompareFunc): PTListItem; var p: PTListItem; ok: boolean; begin p := head; ok := true; while Assigned(p) and ok do if func(p^.info) then ok := false else p := p^.next;
find := p end;
procedure TBaseList.RemoveItem(p: PTListItem); var r: PTListItem; begin r := p^.prev; if r <> nil then r^.next := p^.next else head := p^.next;
r := p^.next; if r <> nil then r^.prev := p^.prev else tail := p^.prev;
Dispose(p, DestroyItem); p := nil; end;
procedure TBaseList.FilterList(func: TCompareFunc); var p: PTListItem; begin repeat p := find(func); if Assigned(p) then RemoveItem(p); until p = nil; end;
procedure TBaseList.PrintList; var p: PTListItem; begin p := head; while Assigned(p) do begin p^.info^.Print; p := p^.next; end; end;
type { А это - вполне себе конкретный список Пассажиров, с добавленным функционалом } TPassList = object(TBaseList) AverAmount, AverWeight: double;
constructor TPassList.Init; begin inherited Init; AverAmount := 0.0; AverWeight := 0; end; destructor TPassList.Done; begin inherited Done; end;
procedure TPassList.FindAverages; var p: PTListItem; count: integer; begin p := head; count := 0; while Assigned(p) do begin inc(count); AverAmount := AverAmount + PTPassenger(p^.info)^.amount; AverWeight := AverWeight + PTPassenger(p^.info)^.weight; p := p^.next; end; AverAmount := AverAmount / count; AverWeight := AverWeight / count; end;
{ Помнится, тебе нужна была полиморфность? Вот она ... В эту процедуру передается объект любого класса-наследника TBaseItem } procedure Get(var obj: TBaseItem; var f: text); begin obj.Get(f); end;
var Lst: TPassList;
function funcFilter(p: PTBaseItem): boolean; far; begin funcFilter := (PTPassenger(p)^.Amount < Lst.AverAmount) or (PTPassenger(p)^.Weight < Lst.AverWeight); end;
var f: text; pp: PTPassenger; begin writeln('start'); assign(f, 'bagag.txt'); reset(f); Lst.Init; while not eof(f) do begin pp := new(PTPassenger, Init); Get(pp^, f); Lst.Append(pp); end; Lst.PrintList; Lst.FindAverages; writeln('Average amount:', Lst.AverAmount:10:5, ' Average weight: ', Lst.AverWeight:10:5); Lst.FilterList(funcFilter); Lst.PrintList; Lst.Done; close(f); readln; end.