Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Хочу понять ООП. есть задача

Автор: noskovgleb 13.12.2009 5:00

Сама задача выглядит вот так:
Дан файл "Багаж пассажиров", который содержит данные о количестве вещей и их общем весе для каждого пассажира. Выделить пассажиров, данные которых превышают средние показатели файла.
Объясните пожалуста... код мне впринципе ненужен!

Автор: volvo 13.12.2009 5:16

Цитата
что нужно делать и как правильно нужно делать
Нужно пройти по всему файлу, посчитать сумму багажа всех пассажиров и их количество, найти среднее значение, а потом пройти еще раз и вывести (ну, или еще что-нибудь сделать) с теми данными, которые превышают среднее значение.

Только при чем здесь ООП? Оно только мешать будет, не того уровня задача, чтоб решать Объектно-Ориентированно.

Автор: noskovgleb 13.12.2009 5:26

у меня такое задание в методичке по ООП)) а это нужно что б информация о каждом багаже хранилась в Массиве объектов?

Автор: volvo 13.12.2009 5:53

У тебя по условию информация в файле хранится, а не в массиве. А уж куда ты ее прочитаешь - дело твое...

Автор: noskovgleb 13.12.2009 14:53

А считать с помощью метода который будет в объекте?

Автор: volvo 13.12.2009 15:58

Опять же, смотря что за объект... Можно сделать объект - Пассажир, который будет хранить только информацию об одном пассажире + массив таких объектов, тогда можно читать файл и не из метода, а простой функцией.

Можно сделать Массив в виде объекта, тогда читать файл можно будет из метода этого объекта.

Ты определись, что именно ты будешь делать, а потом вопросы задавай.

Автор: noskovgleb 15.12.2009 23:24

Вот если я начал где то так, что б лучше всего делать дальеш?

   
uses crt;
type
OO = object
kolv : byte;
oves : integer;

// constructor init;
procedure sves;
procedure openbogag;
end;
{------------------------------------}
procedure OO.sves;
Begin
writeln('Сдесь будет считаться общий вес');
End;
{------------------------------------}
procedure oo.openbogag;
var f : text;
i,b : byte;
Begin
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
read(f,b);
writeln(b);
end;
close(f);
End;
{------------------------------------}
var
BP : OO;
BEGIN
clrscr;
BP.sves;
BP.openbogag;
readln;

END.





Добавлено через 1 мин.
Только оно выдает ошибку и я непойму что оно хочет.

Автор: volvo 15.12.2009 23:59

Цитата
Только оно выдает ошибку и я непойму что оно хочет.
Какую ошибку оно выдает? Когда? На этапе компиляции ошибки быть не должно, а уж при запуске - я не знаю, что там у тебя творится, тебе виднее. Ты видишь свой монитор, а не я...

Автор: noskovgleb 17.12.2009 2:33

С памятью ошибка

Автор: andriano 17.12.2009 2:41

Цитата(noskovgleb @ 16.12.2009 22:33) *

С памятью ошибка

Ну постарайся вспомнить.

Автор: noskovgleb 17.12.2009 2:47

Неповерите... ошибки нет...
Так вот... правильно я начал делать? Общий вес вещей всех пассажиров или общий вес вещей одного пассажира? вот непонятно...

Добавлено через 2 мин.
Наверно всего скорей вес вещей именно одного человека...

Автор: noskovgleb 17.12.2009 3:48

вот сделал так. Хочу спросить как можно процедуре sves дать массив мой?



Добавлено через 5 мин.

   
uses crt;
type
OO = object
kolv : byte;
oves : integer;

// constructor init;
procedure sves;
procedure openbogag;
procedure createmassiv;
end;
{------------------------------------}
procedure OO.sves;
Begin
writeln('Сдесь будет считаться общий вес');
End;
{------------------------------------}
procedure oo.openbogag;
var f : text;
i : byte;
b : byte;
Begin
i:=0;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
write(b:2,' ');
if i=2 then
begin
writeln;
i:=0;
end;
end;
close(f);
End;
{------------------------------------}
procedure oo.createmassiv;
var j : integer;
i : integer;
f : text;
b : byte;
m : array[1..5] of integer;
Begin
writeln;
i:=0;
j:=1;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
// write(b:2,' ');
if i=2 then
begin
m[j]:=b;
writeln(m[j]);
inc(j);
i:=0;
end;
end;
close(f);
End;
{------------------------------------}
var
BP : OO;
m : array[1..5] of integer;
BEGIN
clrscr;
BP.sves;
BP.openbogag;
BP.createmassiv;
readln;

END.



Автор: volvo 17.12.2009 4:24

Никак... У тебя данные читаются в ЛОКАЛЬНЫЙ массив, описанный в методе createmassiv. Чтобы получить к нему доступ из любого другого метода этого объекта - просто перенеси его описание:

type
OO = object
kolv : byte;
oves : integer;
// constructor init;
procedure sves;
procedure openbogag;
procedure createmassiv;

private // пусть будет приватным членом
m : array[1..5] of integer;
end;
, а ВСЕ остальные описания массива M убери...

Автор: noskovgleb 17.12.2009 4:47

ии... у меня получилось что то такое...


uses crt;
type
OO = object
kolv : byte;
oves : integer;

// constructor init;
procedure sves;
procedure openbogag;
procedure createmassiv;
private
m : array[1..5] of integer;
end;
{------------------------------------}
procedure OO.sves;
var
i :byte;
summa:integer;
j :byte;
Begin
j:=0;
writeln('Сдесь будем определять кто взял большой вес одежды) ');
writeln;
for i:=1 to 5 do
begin
summa:=summa+m[i];
inc(j);
end;
for i:=1 to 5 do
if m[i] > (summa/j)
then writeln(i,'-й пассажир превысил средний вес вещей.');

End;
{------------------------------------}
procedure oo.openbogag;
var f : text;
i : byte;
b : byte;
Begin
i:=0;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
write(b:2,' ');
if i=2 then
begin
writeln;
i:=0;
end;
end;
close(f);
End;
{------------------------------------}
procedure oo.createmassiv;
var j : integer;
i : integer;
f : text;
b : byte;
Begin
writeln;
i:=0;
j:=1;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
// write(b:2,' ');
if i=2 then
begin
m[j]:=b;
writeln(m[j]);
inc(j);
i:=0;
end;
end;
close(f);
End;
{------------------------------------}
var
BP : OO;
BEGIN
clrscr;
BP.openbogag;
BP.createmassiv;
BP.sves;
readln;

END.


Автор: noskovgleb 17.12.2009 14:42

А как бы тут можно добавить наследование и полиморфизм?

Автор: volvo 17.12.2009 15:00

Во первых, "Это" надо сначала причесать, чтоб оно хотя бы без наследования и полиморфизма на что-то было похоже... А во-вторых, ну пойми же ты: не нужно на такой простой задаче ни полиморфности, ни дерева наследования, ни вообще ООП. Она элементарно решатся другими средствами, и решение получается ПРОЩЕ, чем с Объектами. Это - главный признак того, надо тебе ООП или нет. Ну ладно, допустим, задание такое. Ну хорошо, сделал "ООП" (будем считать наличие слова Object в программе достаточным для того, чтоб она стала Объектно-Ориентированной), остановись на этом. Ты уже и так кашу заварил, потом долго расхлебывать будешь (если конечно, тебе не сдать и забыть) - надо ж будет научиться писать программы с ООП правильно, а не просто чтоб было слово Object...

Автор: volvo 17.12.2009 17:56

На всякий случай, чтоб было понятнее, что такое наследование и полиморфизм -

вот решение твоей задачи (Показать/Скрыть)


А теперь скажи, оно тебе надо, на простейшем примере так извращаться?

Автор: noskovgleb 19.12.2009 16:19

Задача была в том что бы реализовать эту прогу сначала просто с объектами, потом с наследованием а потом еще и с полиморфизмом...

Добавлено через 1 мин.
Да преподаватель такой попался ничего нехочет слушать, вот то что в методичке есть то и делай...

Автор: noskovgleb 26.12.2009 21:58

вот вообщем получилось зделать уже и наследование, осталось зделать полиморфизм.... и каким образом его втыкнуть? и что он должен делать)?

 
program laba13;
type
tm = array[1..5] of integer;
OO = object
m : tm; { object }
kolv : byte; { count of things }
oves : integer; { weight of things }
constructor init(var im:tm);
procedure openbogazh; { open list of thing }
procedure createmassiv(var cm:tm);{ mas of things }
end;
tves = object(OO)
procedure sves(var sm:tm); { find max weight }
end;
{---------------------------------------------------------------}
constructor OO.init;
begin
im:=m;
end;
{---------------------------------------------------------------}


{---------------------------------------------------------------}
procedure tves.sves(var sm:tm);
var
i :byte;
summa:integer;
j :byte;
Begin
j:=0;
writeln;
writeln('3десь будем определять кто взял большой вес одежды) ');
writeln;
for i:=1 to 5 do
begin
summa:=summa+sm[i];
inc(j);
end;
for i:=1 to 5 do
if sm[i] > (summa/j)
then writeln(i,'-й пассажир превысил средний вес вещей.');

End;
{---------------------------------------------------------------}
procedure OO.openbogazh;
var f : text;
i : byte;
b : byte;
Begin
i:=0;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
write(b:2,' ');
if i=2 then
begin
writeln;
i:=0;
end;
end;
close(f);
End;
{---------------------------------------------------------------}
procedure oo.createmassiv(var cm:tm);
var j : integer;
i : integer;
f : text;
b : byte;
y : byte;
xm: tm;
Begin
writeln;
i:=0;
j:=1;
y:=0;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
if i=2 then
begin
xm[j]:=b;
inc(y);
writeln('ves veshei ',y,
'-ogo passagira ',xm[j],' kg');
cm[y]:=xm[j];
inc(j);
i:=0;
end;
end;
close(f);
End;
(*-------------------- --------------*)
var
BP : OO;
ves:tves;
BEGIN
writeln('--------------------------------------------------');
BP.openbogazh;
BP.createmassiv(BP.m);
ves.sves(BP.m);
readln;
END.



Автор: volvo 26.12.2009 22:29

Давай начнем с малого: Что такое вообще "полиморфизм", ты понимаешь?

Автор: noskovgleb 26.12.2009 23:24

собственно в FAQ прочитал.
Возможность определения единого по имени действия (процедуры или функции), применимого одновременно ко всем объектам иерархии наследования, причем каждый объект может "заказывать" особенность реализации этого действия над "самим собой".

Автор: volvo 26.12.2009 23:30

Хорошо. Прочитал. А понял?

Ты мой код смотрел, из 17-го сообщения, где есть полиморфная процедура Get, которая работает с любым объектом, унаследованным от единого предка? Вот тебе и "особенности реализации действия над самим собой"...

Автор: noskovgleb 26.12.2009 23:49

Да... но что делает эта процедура.(?

Автор: volvo 27.12.2009 0:21

Цитата
но что делает эта процедура.(?
А она, собственно, ничего не делает. Она заставляет работать механизм виртуальных функций. В базовом объекте определена виртуальная функция Get, которая "чисто-виртуальная", пользуясь терминологией С++, то есть, не делает ничего вообще. Каждый наследник определяет свою версию этого метода. А потом полиморфная процедура Get заставляет отработать метод Get того объектного типа, который был передан в эту процедуру.

Автор: noskovgleb 27.12.2009 7:17

Я извеняюсь Volvo что немогу воспользоваться тем что ты написал... хочеться попробывать свое... или хотябы увидеть то что смогу понять. Еще один вопрос это будет похоже на полиморфим, если да то что здесь не так?

 
program laba15;
type
tm = array[1..5] of integer;
OO = object
m : tm; { object }
kolv : byte; { count of things }
oves : integer; { weight of things }
constructor init(var im:tm);
procedure openbogazh; { open list of thing }
procedure createmassiv(var cm:tm);{ mas of things }
end;
tves = object(OO)
procedure sves(var sm:tm);virtual; { find max weight }
end;
tves2= object(OO)
procedure sves(var sm:tm);virtual;
end;
{---------------------------------------------------------------}
constructor OO.init(var im:tm);
begin
im:=m;
end;
{---------------------------------------------------------------}


{---------------------------------------------------------------}
procedure tves.sves(var sm:tm);
var
i :byte;
summa:integer;
j :byte;
Begin
j:=0;
writeln;
writeln('3десь будем определять кто взял большой вес одежды) ');
writeln;
for i:=1 to 5 do
begin
summa:=summa+sm[i];
inc(j);
end;
for i:=1 to 5 do
if sm[i] > (summa/j)
then writeln(i,'-й пассажир превысил средний вес вещей.');

End;
{--------------------------------------------------------------}
procedure tves2.sves(var sm:tm);
var
i :byte;
sbv:byte;
max:byte;
begin
max:=sm[1];
for i:= 1 to 5 do
if sm[i]>max then
max:=sm[i];
writeln('Найбольший вес вещей = ',max);
readln;

end;
{---------------------------------------------------------------}
procedure OO.openbogazh;
var f : text;
i : byte;
b : byte;
Begin
i:=0;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
write(b:2,' ');
if i=2 then
begin
writeln;
i:=0;
end;
end;
close(f);
End;
{---------------------------------------------------------------}
procedure oo.createmassiv(var cm:tm);
var j : integer;
i : integer;
f : text;
b : byte;
y : byte;
xm: tm;
Begin
writeln;
i:=0;
j:=1;
y:=0;
assign(f,'bagag.txt');
reset(f);
while not eof (f) do
begin
i:=i+1;
read(f,b);
if i=2 then
begin
xm[j]:=b;
inc(y);
writeln('ves veshei ',y,
'-ogo passagira ',xm[j],' kg');
cm[y]:=xm[j];
inc(j);
i:=0;
end;
end;
close(f);
End;
(*-------------------- --------------*)
var
BP : OO;
ves:tves;
ves2:tves2;
BEGIN
writeln('--------------------------------------------------');
BP.openbogazh;
BP.createmassiv(BP.m);
ves.sves(BP.m);
ves2.sves(BP.m);
readln;
END.





Добавлено через 1 мин.
и оно какую то ошибку выдает, exit code 210

Автор: volvo 27.12.2009 13:53

Цитата
Еще один вопрос это будет похоже на полиморфим, если да то что здесь не так?
В каком именно месте? Где здесь у тебя присутствует
Цитата
Возможность определения единого по имени действия (процедуры или функции), применимого одновременно ко всем объектам иерархии наследования, причем каждый объект может "заказывать" особенность реализации этого действия над "самим собой".
? Ну, объявил ты виртуальные функции sves в двух типах. И что? Ты посмотри, как ты их вызываешь! У тебя тут виртуальность. и не пахнет. С таким же успехом методы могли быть и НЕвиртуальными. Ты для объекта типа TVes ЯВНО вызываешь TVes.sves, а для объекта типа TVes2 опять же ЯВНО вызывается TVes2.sves.

Еще раз посмотри на мою реализацию процедуры Get. В чем заключается её полиморфность? А в том, что она не знает, объект какого типа будет ей передан, и все равно, когда получает объект, вызывает нужный метод. А ты вызываешь все в явном виде. Это не полиморфизм.

Цитата
и оно какую то ошибку выдает, exit code 210
А ты в FAQ-е точно всё читал? Про то, что при наличии в классе виртуальных методов, ты ОБЯЗАН вызвать конструктор перед обращением к такому методу - тоже читал (там написано совершенно точно, что произойдет при попытке вызвать виртуальный метод ДО вызова конструктора)? Где вызов конструктора в твоем коде?