1

Тема: Агрегація

Доброго вечора.
Потрібна ваша допомога.
Розділ ООП, питання стосується Агрегації.
Є завдання створити програму:

Прихований текст

Авіарейс характеризується місцем призначення (відстанню в км від нього) та літаком, який здійснює переліт, кількістю проданих квитків. Літак, що здійснює авіарейс має параметри: тип літака, середня швидкість польоту. Залежно від типу літак в класу літак обчислюється його максимальна вантажність. У класі пасажири міститься інформація про кількість проданих квитків та підраховується вага пасажирів разом з їх багажем (в кг). Вважаться, що вага одного пасажиру разом з багажем дорівнює 100 кг. Створити об'єкт авіарейс та використати його для визначення, чи можна розмістити на борту літака поштовий вантаж заданої ваги. Якщо так, то визначити, через скільки він буде доставлений до місця призначення.

Ось Код який в мене написаний на данний момент:

Прихований текст
program Agregacija;
uses crt;
type Litak=object
       tupl:string;
       ser:real;
       procedure input;
     end;

     Pasaguru=object(litak)
       vap,kilk:integer;
       function vaga:real;
     end;

     AviaReys=object
       mpr:longint;
       plane:litak;
       time,pvan:real;
       trfl:boolean;
       procedure vvid;
       function perevirka:real;
       procedure vuvid;
     end;

var l:Litak;
    p:Pasaguru;
    a:AviaReys;

procedure Litak.input;
begin
  writeln('|----------Osnovni danni:Litak----------|');
  write(' Vvedit tup litaka: '); readln(l.tupl);
  write(' Vvedit seredny shvudkist litaka: '); readln(l.ser);
  write(' Vvedit k-tb prodanux kvitkiv: '); readln(p.kilk);
  writeln;
end;

function Pasaguru.vaga:real;
begin
  p.vap:=p.kilk*100;
end;

procedure AviaReys.vvid;
begin
  writeln('|---------Osnovni danni:AviaReys--------|');
  write(' Vvedit misce pruzemlenna (km): '); readln(a.mpr);
  write(' Vvedit vagy poshtovogo vantagy: '); readln(a.pvan);
  writeln;
end;

function AviaReys.perevirka;
begin
  if a.pvan <= p.vap then
  begin
    a.trfl:=True;
    a.time:=a.mpr/l.ser;
  end
  else a.trfl:=False;
end;

procedure AviaReys.vuvid;
begin
  writeln('|--------------Osnovni danni------------|');
  writeln(' Misce pruzemlenna (km): ',a.mpr:4);
  writeln(' Tup litaka: ',l.tupl);
  writeln(' Seredna shvudkist litaka: ',l.ser:3:2);
  writeln(' K-tb prodanuh kvutkiv: ',p.kilk);
  if a.trfl=True then writeln(' Chas poloty z vantagem: ',a.time:2:2)
  else writeln(' Litak ne rozrahovanuj na takuj vantag (',a.pvan:5:2,')!');
end;

begin
  clrscr;
  l.input;
  p.vaga;
  a.vvid;
  a.perevirka;
  a.vuvid;
  readln;
end.

Питання такі:
1. Я не зрозумів достатньо умову, тому питання в тому чи правильно я описав об'єкти та використав їх (взагалі я ще не досить розумію ООП);
2. Якщо неправильний код (а це скоріш за все так), то будь ласка вкажіть на помилки.
Буду вдячний будь якій допомозі.

P.S. Що до пошуку, я намагався знайти щось про Агрегацію в нашій паутині, знайшов лише деякі статті (невеликі) трішки зрозумів, але все-ж-таки з завданням програми не розібрався.

2 Востаннє редагувалося koala (23.10.2013 22:55:14)

Re: Агрегація

1. Ні, неправильно. Читаємо:

Залежно від типу літак в класу літак обчислюється його максимальна вантажність.

Де це відображено в коді? Будь ласка, перевірте, що кожна фраза з завдання має відповідність в коді. Взагалі, базова ідея ООП приблизно така: беремо завдання і тупо переписуємо за правилами мови програмування, доки воно не запрацює :)
2. Код неправильний, і вказати це вам може будь-який компілятор. Якщо ви не розумієте, як виправити помилки, вказані компілятором - питайте тут із вказанням помилок.
3. В мене взагалі за цим кодом склалося враження, що ви трохи плаваєте в Паскалі, зокрема, погано розібралися з функціями. В такому разі вам ще зарано вивчати ООП. Напишіть функції для обчислення факторіала і n-го простого числа :)
4. Агрегація - це, власне, ще не ООП, це використання групи змінних як однієї логічної змінної. АТД - так, ООП - ще ні. Можливо, ви якраз і заплуталися через це. Основна перевага агрегації - це можливість передавати не 5 параметрів (і плутатися через це), а один. І найкраще це реалізовується record-ами.
5. Ще раз до п.1: спробуйте розкласти завдання на коментарі в програмі. Наприклад,
[code=pascal]
     AviaReys=object {Авіарейс характеризується}
       mpr:longint;{місцем призначення (відстанню в км від нього)}
       plane:litak;{ літаком, який здійснює переліт}
       time,pvan:real;{кількістю проданих квитків?}
       trfl:boolean;
       procedure vvid;
       function perevirka:real;
       procedure vuvid;
     end;[/code]
Бачите, щось не вийшло. Подумайте над цим, тут на перший погляд тільки одна частина не вкладається - про час доставки, це питання має бути не до рейсу, а обчислюватися в чомусь більш загальному, наприклад, в головній програмі.

Подякували: Logans1

3

Re: Агрегація

По-перше уточніть завдання. Особисто я не довіряю текстам, в яких закінчення слів не узгоджені одне з одним.
По-друге Агрегація означає, що у вас має лишитися лише одна змінна - "a:AviaReys".  А з літаком ви маєте працювати отак: "a.plane...".
В залежності від уточненого тексту завдання, вам іще можливо й поліморфізмом доведеться скористатися.

Подякували: koala, Logans2