IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Немогу закончить задачу на ООП
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Народ, помогите плиз закончить задачу на ООП...
Вот то, что я набросал

program Lr18_1;
{Программа, демонстрирующая использование графических объектов}
uses
Crt, Graph;
type
PGraphObject=^TGraphObject;
TGraphObject=object {базовый объект}
Active: Boolean; {признак видимости объекта}
x,y: Integer; {координаты объекта}
Color: Integer; {цвет объекта}
constructor Init; {конструктор объекта}
destructor Done;virtual; {деструктор}

procedure Locate (Nx,Ny:Integer); {задание коорди-нат}
procedure Step (Dx,Dy:Integer); {сдвиг объекта}
procedure Move; {хаотичное движение}

procedure Show; {отобразить объект на экране}

procedure Hide; {скрыть объект}

procedure Paint;virtual; {процедура рисования объекта}
procedure Clear;virtual; {процедура стирания объекта}
end;
PPoint=^TPoint;
TPoint=object(TGraphObject) {точка}
{Задание координат и цвета точки}
constructor InitData(Nx,Ny,c:Integer);
procedure Paint;virtual;
procedure Clear;virtual;
end;

PRectangle=^TRectangle;
TRectangle=object(TGraphObject) {прямоугольник}
Width,Heigh:Integer; {ширина и высота прямоугольника}

{Задание координат, размеров и цвета прямоугольника}
constructor InitData(Nx,Ny,W,H,c:Integer);
procedure Paint;virtual;
procedure Clear;virtual;
end;

constructor TGraphObject.Init;
begin
Active:=False; {изначально объект невидим}
end;
destructor TGraphObject.Done;
begin
Hide; {перед уничтожением сотрем объект с эк-рана}
end;

procedure TGraphObject.Locate;
begin
Hide; {скроем объект}
x:=Nx; {зададим новые координаты}
y:=Ny;
Show; {отобразим на новом месте}
end;

procedure TGraphObject.Step;
begin
Hide; {скроем объект}
x:=x+Dx; {переместим объект}
y:=y+Dy;
Show; {отобразим на новом месте}
end;

procedure TGraphObject.Move;
begin
Step(Random(5)-2,Random(5)-2); {шагнем случайным образом}
end;

procedure TGraphObject.Show;
begin
if not Active then {если объект невидим, то...}
begin
Active:=True; {установим флажок видимости}
Paint; {нарисуем объект}
end;
end;

procedure TGraphObject.Hide;
begin
if Active then {если объект видим, то...}
begin
Active:=False; {сбросим флажок видимости}
Clear; {сотрем объект}
end;
end;

procedure TGraphObject.Paint;
begin
end;

procedure TGraphObject.Clear;
begin
end;

constructor TPoint.InitData;
begin
inherited Init; {инициализация унаследованных полей}
x:=Nx; {установим координаты}
y:=Ny;
Color:=c; {зададим цвет}
end;

procedure TPoint.Paint;
begin
PutPixel(x,y,Color);
end;

procedure TPoint.Clear;
begin
PutPixel(x,y,0);
end;

constructor TRectangle.InitData;
begin
inherited Init;
x:=Nx;
y:=Ny;
Width:=W;
Heigh:=H;
Color:=c;
end;

procedure TRectangle.Paint;
var
i,j:Integer;
begin
i:=Width Div 2;
j:=Heigh Div 2;
SetColor(Color);
Rectangle(x-i,y-j,x+i,y+j);
end;

procedure TRectangle.Clear;
var
i,j:Integer;
begin
i:=Width Div 2;
j:=Heigh Div 2;
SetColor(0);
Rectangle(x-i,y-j,x+i,y+j);
end;

{Переход в графический режим}
procedure InitVideo;
var
grDriver,grMode:Integer;
begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
if GraphResult<>grOk then
begin
Writeln('Ошибка при инициализации графики !');
Halt(1);
end;
end;

{Возврат в текстовый режим}
procedure DoneVideo;
begin
CloseGraph;
end;

var
a:array[1..150] of PGraphObject; {массив произвольных объектов}
i:Integer;
begin
ClrScr; {Переход в графический режим}
InitVideo;
{Инициализируем генератор случайных чисел}
Randomize;
{Создаем 150 графических объектов}
for i:=1 to 150 do
case Random(2) of
0:{Точку} a[i]:=New(PPoint,InitData(
20+Random(600), 20+Random(440), {координаты}
1+Random(14))); {цвет}
1:{создаем прямоугольник}
a[i]:=New(PRectangle,InitData(
20+Random(600), 20+Random(440), {координаты}
3+Random(5), 3+Random(5), {размеры}
1+Random(14))); {цвет}
end;
while not KeyPressed do
for i:=1 to 150 do
a[i]^.Move; {Хаотично перемещаем объект}
ReadKey;
{Уничтожаем объект}
for i:=1 to 150 do
Dispose (a[i],Done);
{Возвращаемся в текстовый режим}
DoneVideo;
end.


Сюда надо еще добавить возможность изменения размерв обьектов и прога должна продимонстрировать процесс надувания воздушного шарика...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Сюда надо еще добавить возможность изменения размерв обьектов
Так в чем проблема? Один из вариантов - добавляй в иерархию после TGraphObject еще тип TResizable (не все объекты могут менять размер, скажем точка - она и есть точка, а вот все, что будет наследоваться от TResizable - сможет менять размер), и определяй для него методы, меняющие размер объекта и поля, этот размер хранящие...

Цитата
и прога должна продимонстрировать процесс надувания воздушного шарика...
Собственно, какого типа должен быть воздушный шарик, TPoint или TRectangle? smile.gif Опиши еще одну фигуру - наследницу TResizable (TCircle или TEllipse), и "надувай" его сколько хочешь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 25.05.2009 22:15) *

Так в чем проблема? Один из вариантов - добавляй в иерархию после TGraphObject еще тип TResizable (не все объекты могут менять размер, скажем точка - она и есть точка, а вот все, что будет наследоваться от TResizable - сможет менять размер), и определяй для него методы, меняющие размер объекта и поля, этот размер хранящие...


Так это получается, что Прямоугольник и Круг мне надо будет теерь наследовать от TResizable, а TGraphObject исключительно для точки?(если не трудно хотелось бы увидеть пример)

Цитата(volvo @ 25.05.2009 22:15) *
Собственно, какого типа должен быть воздушный шарик, TPoint или TRectangle? smile.gif Опиши еще одну фигуру - наследницу TResizable (TCircle или TEllipse), и "надувай" его сколько хочешь...


Воздушный шар устроит любого "округлого" типа smile.gif ...эти две вещи я хоть убей, не могу сделать...если есть возможность, набросайте примерчик
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ну, вот я добавил кое-что:
Прикрепленный файл  __OOP.PAS ( 6.15 килобайт ) Кол-во скачиваний: 313


Тестируй, должно работать... Единственное, что - добавь там задержку в основном цикле, и тогда уж увеличивай коэффициент, передаваемый factorSize, иначе ты не успеешь моргнуть, как программа вылетит из-за переполнения типа Integer, у тебя ж многие тысячи итераций в секунду происходят. То же самое касается и увеличения Sphere, тоже внутри цикла надо добавить задержку (Delay какой-нибудь, подбери, чтоб было видно увеличение размера, и можно было отреагировать нажатием клавиши и остановить этот процесс), иначе будет вылет по той же причине...

Но твою программу надо еще дорабатывать, ты делаешь довольно много лишнего. К примеру, у тебя в каждом типе в иерархии есть X, Y, Color, зачем ты делаешь в каждом конструкторе присваивание им значений? Возложи это на конструктор базового класса... Графика у тебя не связана никак с объектами, это тоже не очень хорошо. Мог бы сделать объект, скажем, TGraphix, который бы создавался при старте программы, и при его создании инициализировался бы графический режим, а при удалении - закрывался...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Отлично! Спасибо огромное!!!!!!!! В моем исходнике было дествительно много...но ведь нет предела совершенству...да, можно было бы ее конечно улучшить, но банально нет времени...в среду надо сдать ее+курсач...поэтому тут все в режиме "работает и слава Богу"... единственный вопрос на последок, как можно закрасить рисуемую окружность...я так понимаю, что процедуры типа FloodFill тут не прокатят?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Зачем же FloodFill, если можно рисовать уже закрашенную окружность:

procedure tcircle.Paint;
begin
setfillstyle(solidfill, color);
fillellipse(CX, CY, R, R);
end;
procedure tcircle.Clear;
begin
setfillstyle(solidfill, getbkcolor);
fillellipse(CX, CY, R + 2, R + 2); { !!! }
end;

(я всегда при затирании объекта делаю это "с запасом", чтоб лишнего ничего не оставалось на экране)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Прекрасно работает. Огромнейшое спасибо за помощь!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.10.2020 19:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name