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

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

Форум «Всё о Паскале» _ Задачи _ Турбо Паскаль и его объектно ориентированные средства

Автор: dron4ik 10.05.2009 2:47

Снова я( я всем наверно надоел(со своими темами)

Есть код проги которая гоняет точку и окружность по экрану случайным образом...до нажатия какой-либо клавиши...не могли вы бы мне помочь ее как то усложнить? К примеру.. Можно изменить цвет окружности и точку(точку вобще хотелось поменять на другую фигуру на пример квадрат который крутится) Менять радиус окружности вообщем размеры фигур(любые действия над фигурами) или поворачивать фигуры против часовой стрелки и наоборот---- и это все может менять пользователь при помощи нажатия какой либо клавиши или меню Программа сделана на принципе модульного программирования!

Создадим модуль графических объектов GraphObj.

 Unit GraphObj; {Модуль графических объектов}
INTERFACE {Интерфейсная часть}
Type
PLocation = ^TLocation;
TLocation = object
X,Y: Word; {Координаты позиции на экране}
Constructor Init(InitX, InitY: Word);
{Инициализация объекта}
Function GetX: Word; {Возвращает координату Х}
Function GetY: Word; {Возвращает координату Y}
Procedure GetCoords(Var CoordX, CoordY: Word);
{Возвращает обе координаты}
Destructor Done; virtual; {Уничтожает объект}
End;
PPoint = ^TPoint;
TPoint = object(TLocation)
Clr: Byte; {Цвет}
Visib: Boolean; {Видимость}
Constructor Init(InitX,InitY:Word; InitColor:Byte);
{Переопределяем метод инициализации-добавляем цвет}
Function GetColor: Byte; {Возвращает цвет}
Procedure Show; virtual;
Procedure Hide; virtual;
Function IsVisib: Boolean;
Procedure ChangeColor(NewColor:Byte);{Меняет цвет}
Procedure MoveTo(NewX, NewY: Word);
{Перемещает в новую позицию}
Destructor Done; virtual;
end;
PCircle = ^TCircle;
TCircle = object(TPoint)
R: Word; {Радиус}
Constructor Init(InitX,InitY,InitR:Word;InitC:Byte);
Procedure Show; virtual;
Procedure Hide; virtual;
Destructor Done; virtual;
end;
IMPLEMENTATION {Раздел реализации}
Uses Graph; {Подключаем графическую библиотеку}
Constructor TLocation.Init;
Begin
X := InitX;
Y := InitY
end;
Function TLocation.GetX: Word;
begin
GetX := X
end;
Function TLocation.GetY: Word;
begin
GetY := Y
end;
Procedure TLocation.GetCoords;
begin
CoordX := GetX;
CoordY := GetY
end;
Destructor TLocation.Done;
begin
end;
Constructor TPoint.Init;
begin
inherited Init(InitX, InitY);
Clr := InitColor;
Visib := False
end;
Function TPoint.GetColor: Byte;
begin
GetColor := Clr
end;
Procedure TPoint.Show;
begin
PutPixel(X, Y, Clr);
Visib := True
end;
Procedure TPoint.Hide;
begin
PutPixel(X, Y, GetBkColor);
Visib := False
end;
Function TPoint.IsVisib: Boolean;
begin
IsVisib := Visib
end;
Procedure TPoint.ChangeColor;
begin
Clr := NewColor;
If IsVisib then Show
end;
Procedure TPoint.MoveTo;
Var St: Boolean;
begin
St := IsVisib;
Hide;
X := NewX;
Y := NewY;
If St then Show
end;
Destructor TPoint.Done;
begin
Hide;
Clr := GetBkColor
end;
Constructor TCircle.Init;
begin
inherited Init(InitX, InitY, InitC);
R := InitR
end;
Procedure TCircle.Show;
begin
SetColor(Clr);
Circle(X, Y, R);
Visib := True
end;
Procedure TCircle.Hide;
begin
SetColor(GetBkColor);
Circle(X, Y, R);
Visib := False
end;
Destructor TCircle.Done;
begin
inherited Done;
R := 0
end;
{Пустая секция инициализации}
END.



Основной код проги к которому привязан графический модуль:

В приложении будут созданы экземпляры объектов TPoint и TCircle, причем экземпляр объекта TPoint мы разместим в области динамической памяти.
Program AppExample;
Uses Graph, CRT, GraphObj;
Type
TApplication = object
Procedure Init;
Procedure Run;
Procedure Done;
end;
Var
Application: TApplication;
p: PPoint;
c: TCircle;

Procedure TApplication.Init;
Var
D, R, MaxX, MaxY: Integer;
Begin
{Инициализация графического режима}
D := Detect;
InitGraph(D, R, 'C:\B\BGI');
SetBkColor(White);
ClearDevice;
{Создаем точку и окружность}
MaxX := GetMaxX;
MaxY := GetMaxY;
Randomize;
New(p,Init(Random(MaxX), Random(MaxY),Red));
p^.Show;
c.Init(Random(MaxX-40)+20,Random(MaxY-40)+20,20,Blue);
c.Show
End;
Procedure TApplication.Run;
Var
MaxX, MaxY: Integer;
Begin
MaxX := GetMaxX;
MaxY := GetMaxY;
Repeat
p^.MoveTo(Random(MaxX),Random(MaxY));
c.MoveTo(Random(MaxX-40)+20,Random(MaxY-40)+20);
Delay(4000)
Until KeyPressed
End;
Procedure TApplication.Done;
Begin
Dispose(p,Done);
c.Done;
CloseGraph
End;
BEGIN
Application.Init;
Application.Run;
Application.Done
END.

Автор: Lapp 10.05.2009 10:31

 ! 
dron4ik, почему тема про Турбо Паскаль в разделе Другие Языки?? Ты забыл, на какой форум зашел?? В следующий раз буду штрафовать за такое издевательство..
Тема перенесена



Цитата(dron4ik @ 9.05.2009 23:47) *
не могли вы бы мне помочь ее как то усложнить? К примеру..
Запросто. Скажи, в чем затруднение - мы поможем.

Автор: volvo 10.05.2009 12:44

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

type
TFigure = object
{ ... }
end;

TPoint = object(TFigure)
{ ... }
end;
TCircle = object(TFigure)
{ ... }
end;
{ Ну, и остальное, что тебе может понадобиться }
Кроме всего прочего это позволит минимизировать количество вносимых изменений при добавлении объектов в иерархию наследования. Так что, прежде чем усложнять, надо сделать правильно, а то потом эту "усложненную" версию придется переписывать с нуля, чтоб она заработала.

Автор: dron4ik 10.05.2009 12:47

Извините а куда перенесена тема?( В какой раздел?(

Добавлено через 4 мин.
А что мне теерь делать? Как ее изменить?(я профан по ООП)

Автор: Lapp 10.05.2009 12:52

Цитата(dron4ik @ 10.05.2009 9:47) *
Извините а куда перенесена тема?( В какой раздел?(
А посмотреть строку навигации Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи пока ты писал этот мессадж было трудно?

Автор: dron4ik 10.05.2009 12:53

Я иммею ввиду задачу.

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

Автор: dron4ik 10.05.2009 13:36

У меня есть другая программа написанная на СИ++ . Она находит кратчайший путь между двумя любымми вершинамми графа.т.е пользователь вводит количество вершин потом вводит вес ребер(их длину между раз-ными вершинами)потом пользователь вводит две вершины между которыми он должен найти кратчайшиий путь... потом прога выводит длинну кратчайшего пути. Может она прапвильно выполнена с использованием ООП?т.е. абстрактной фигурой является граф.. на графе вершины(точки) и ребра т.е. точки и ребра являются подвидами графа.

Автор: Lapp 10.05.2009 13:39

Цитата(dron4ik @ 10.05.2009 9:53) *
От какой фигуры они могут наследоваться(квадрат, окружность, и точка)
Тебе же это явно написал volvo. Зачем спрашивать то, на что уже отвечено?

Автор: dron4ik 10.05.2009 13:42

У меня есть другая программа написанная на СИ++ . Она находит кратчайший путь между двумя любымми вершинамми графа.т.е пользователь вводит количество вершин потом вводит вес ребер(их длину между раз-ными вершинами)потом пользователь вводит две вершины между которыми он должен найти кратчайшиий путь... потом прога выводит длинну кратчайшего пути. Может она прапвильно выполнена с использованием ООП?т.е. абстрактной фигурой является граф.. на графе вершины(точки) и ребра т.е. точки и ребра являются подвидами графа.


Автор: Lapp 10.05.2009 13:59

Цитата(dron4ik @ 10.05.2009 10:42) *
У меня есть другая программа написанная на СИ++
Ну и зачем дублировать мессаджи? Типа погромче прокричать? Оба эти мессаджа - чистый флуд. Задаешь влпросы про программу - слушай ответы и внимай им. Никого тут не интересуют твои курсовые. Спрашиваешь по программированию - пожалуйста. А подбирать тебе программу, чтобы ты свалил курсовик - уволь. Сам признаешь, что "профан в ООП". Хочешь научиться - милости просим, только слушай. Хочешь свалить курсовик - не по адресу..

Еще один флуд типа "а может там правильно" - закрываю тему.

Автор: dron4ik 10.05.2009 14:05

Извините( Мне просто не с кем посоветоваться(

Добавлено через 3 мин.
Является ли вершины и ребра подклассами или подвидами графа?

Автор: volvo 10.05.2009 14:25

Цитата
Является ли вершины и ребра подклассами или подвидами графа?
Вершины и ребра - отдельные классы, не являющиеся подвидами графа. Они составляют граф (т.к. граф состоит из вершин и ребер). Следовательно, здесь есть агрегация - в класс Граф включены переменные классов Вершина и Ребро - (отношение "имеет"), но не наследование (которое определяло бы отношение "является подвидом").

Автор: dron4ik 10.05.2009 14:30

Т.е есть программа написанная по такому принципу не является Обьектно Ориентированной?

Автор: volvo 10.05.2009 14:49

Программа написанная по КАКОМУ принципу? Где

Цитата
точки и ребра являются подвидами графа
? Объектно-ориентированной может и является. Но она в первую очередь не является правильной. По какому принципу она написана - это уже дело десятое.

Автор: dron4ik 10.05.2009 14:52

Мне вообщем нужно чтобы прога была написана по ООП. Главное чтобы она не была написана процедурным программированием. Прога готова могу выложить код.