Interface
uses
graph,crt;
type
location=object
x,y:integer;
procedure init(initx,inity:integer);
function getx:integer;
function gety:integer;
end;
pointptr=^point;
point=object(location)
visible:boolean;
color:word;
constructor Init(InitX,InitY,Col:Integer);
destructor Done; virtual;
procedure show;virtual;
procedure hide;virtual;
procedure Drag(DragBY:Integer); virtual;
procedure MoveTo(StepX,StepY:Integer);virtual;
function isvisible:boolean;
end;
CirclePtr = ^Circle;
Circle = Object(Point)
Radius : Integer;
Constructor Init(InitX,InitY,Rad,Col : integer);
procedure Show; Virtual;
procedure Hide; Virtual;
end;
LinePtr = ^Line;
Line = Object (Point)
x2,y2 : integer;
Constructor Init (InitX,InitY,InitX2,InitY2, Col : Integer);
Procedure Show; Virtual;
Procedure Hide; Virtual;
Procedure MoveTo (StepX, StepY: Integer); virtual;
end;
ListPtr = ^listPoint;
Listpoint = record
item: PointPtr;
prev: Listptr;
next: ListPtr;
end;
GroupPtr = ^Group;
Group = OBJECT(POINT)
PList:listptr;
constructor init(initX,initY,Col: integer);
destructor done; virtual;
procedure show; virtual;
procedure hide; virtual;
procedure MoveTo(stepX,stepY:integer); virtual;
procedure AddItem(PItem:pointPtr);
end;
function GetSteps(var StepX,StepY:Integer):Boolean;
Implementation
procedure location.init(initx,InitY:integer);
begin
x:=initx;
y:=inity;
end;
function location.getx:integer;
begin
getx:=x;
end;
function location.gety:integer;
begin
gety:=y;
end;
constructor Point.Init;
begin
Location.Init(InitX, InitY);
Color:=Col;
Visible:=FAlse;
end;
destructor Point.Done;
begin
Hide;
end;
procedure point.show;
begin
if Visible then
Exit;
visible:=true;
graph.PutPixel(x,y,color);
end;
procedure point.hide;
begin
if not Visible then
Exit;
visible:=false;
graph.PutPixel(x,y,getbkcolor);
end;
function point.isvisible:boolean;
begin
isvisible:=visible;
end;
procedure Point.MoveTo;
begin
Hide;
Inc(X,StepX);
Inc(Y,StepY);
Show;
end;
function GetSteps(var StepX,StepY:Integer):Boolean;
const
RightKey=#77;
DownKey=#80;
LeftKey=#75;
UpKey=#72;
NULL=#0;
DElKey=#83;{Выход из программы}
var
Ch:Char;
FlagQuit:Boolean;
begin
StepX:=0;
StepY:=0;
GetSteps:=True;
repeat
ch:=ReadKey;
FlagQuit:=True;
if Ch=null then
begin
Ch:=REadKey;
case ch of
UpKey : StepY := -1;
Downkey : StepY := 1;
LeftKey : StepX := -1;
RightKey : StepX := 1;
DelKey : GetSteps := False;
else
FlagQuit := False;
end;
end
else
FlagQuit := False;
until FlagQuit;
end; {GetSteps}
procedure Point.Drag (DragBy: Integer);
Var
StepX, StepY : Integer;
begin
Show;
While GetSteps (StepX, StepY) do
MoveTo (StepX*DragBy, StepY*DragBy);
end; {Drag}
Constructor Circle.Init (InitX,InitY,Rad,Col : integer);
begin
Point.Init(InitX,InitY,Col);
Radius := Rad;
end;{Init}
procedure Circle.Show;
begin
If Visible then
exit;
Visible := True;
Graph.SetColor (Color);
Graph.Circle (x,y,Radius);
end; {Show}
procedure Circle.Hide;
Var
CopyColor : Word;
begin
If Not Visible then
Exit;
CopyColor := Graph.GetColor;
Graph.SetColor (GetBkColor);
Graph.Circle (x,y, Radius);
Graph.SetColor (CopyColor);
Visible := False;
end; {Hide}
Constructor Line.Init (InitX,InitY,InitX2,InitY2,Col : integer);
begin
Point.Init(InitX,InitY,Col);
x2 := InitX2;
y2 := InitY2;
end;{Init}
procedure Line.Show;
begin
If Visible then
Exit;
Visible := True;
Graph.SetColor (Color);
Graph.Line (x,y,x2,y2);
end; {Show}
procedure Line.Hide;
Var
CopyColor : Word;
begin
If Not Visible then
Exit;
CopyColor := Graph.GetColor;
Graph.SetColor (GetBkColor);
Graph.Line (x,y,x2,y2);
Graph.SetColor (CopyColor);
Visible := False;
end; {Hide}
procedure Line.MoveTo (StepX, StepY : Integer);
begin
Hide;
x := x + StepX;
y := y + StepY;
x2 := x2 + StepX;
y2 := y2 + StepY;
Show;
end; {MoveTo}
constructor Group.Init(InitX, InitY, Col: integer);
begin
Point.Init(InitX,InitY,col);
Plist:=nil;
end; {Init}
destructor group.done;
var
CurrList:listptr;
begin
visible:=false;
if plist<>nil then
while plist^.next <> nil do
plist:=plist^.next;
while plist<> nil do
begin
dispose(plist^.item,done);
Currlist:=plist;
plist:=plist^.prev;
dispose(currlist);
end;
end;
procedure group.show;
var
currlist:listptr;
begin
if visible then
exit;
currlist:=plist;
while currlist<>nil do
begin
currlist^.item^.show;
currlist:=currlist^.next;
end;
visible:=true;
end;
procedure group.hide;
var
currlist:listptr;
begin
if not visible then
exit;
currlist:=plist;
if currlist<>nil then
while currlist^.next <> nil do
currlist:=currlist^.next;
while currlist<>nil do
begin
currlist^.item^.hide;
currlist:=currlist^.prev;
end;
visible:=false;
end;
procedure group.moveto(stepx,stepy:integer);
var
currlist:listptr;
begin
hide;
x:=x+stepx;
y:=y+stepy;
currlist:=plist;
while currlist<>nil do
begin
currlist^.item^.moveto(stepx,stepy);
currlist:=currlist^.next;
end;
visible:=true;
end;
procedure group.additem(pitem:pointptr);
var
newlist,currlist:listptr;
begin
new(newlist);
newlist^.item:=pitem;
newlist^.next:=nil;
currlist:=plist;
if currlist<>nil then
begin
while currlist^.next <> nil do
currlist:=currlist^.next;
newlist^.prev:=currlist;
currlist^.next:=newlist;
end
else
begin
plist:=newlist;
plist^.prev:=nil;
end;
end;
end.
Текст программы, использующей графические объекты
Program Example;
{Демонстрация использования графических объектов
Вальвачев А.Н. Графическое программирование на языке Паскаль
Мн.: Выш. шк.,1992.-143с.:ил.}
Uses
Graph, FigObj;
Type
MoveCoor=OBJECT(Location)
MovingTo:Boolean;
PROCEDURE Init(InitX, InitY:Integer);
PROCEDURE TurnMoving;
FUNCTION IsMoving:Boolean;
END;
StatTxtPtr=^StatTxt;
StatTxt=OBJECT(Point)
PROCEDURE Show; VIRTUAL;
PROCEDURE Hide; VIRTUAL;
END;
Const
Step=5;
RadX=80;
Var
DriverVar,ModeVar,Index,Xb,Yb,RadY,Xl,Yl,Xr,Yr,i:Integer;
PItems:Array[1..5] of PointPtr;
Where:Array[1..5] of MoveCoor;
OGroup:Group;
PROCEDURE MoveCoor.Init(InitX,InitY:Integer);
BEGIN
Location.Init(InitX,InitY);
MovingTo:=True;
END;
PROCEDURE MoveCoor.TurnMoving;
BEGIN
MovingTo:=NOT MovingTo;
END;
FUNCTION MoveCoor.IsMoving:Boolean;
BEGIN
IsMoving:=MovingTo;
END;
PROCEDURE OutCoor(X,Y,Color:Integer);
VAR
Inf1,Inf2:String[4];
BEGIN
SetColor(Color);
Str(X,Inf1);
Str(Y,Inf2);
OutTextXY(X,Y,'x='+Inf1);
OutTextXY(X,Y+Round(TextHeight('H')*1.5),'y='+Inf2);
END;
PROCEDURE StatTxt.Show;
BEGIN
IF Visible THEN
Exit;
Visible:=True;
OutCoor(X,Y,Color);
END;
PROCEDURE StatTxt.Hide;
VAR
CopyColor:Word;
BEGIN
IF NOT Visible THEN
Exit;
CopyColor:=GetColor;
OutCoor(X,Y,GetBkColor);
SetColor(CopyColor);
Visible:=False;
END;
BEGIN
DriverVar:=Detect;
InitGraph(DriverVar,ModeVar,'');
IF GraphResult <> GrOK THEN
BEGIN
WriteLn(GraphErrorMsg(DriverVar));
Halt(1);
END;
GetAspectRatio(word(Xb),word(Yb));
RadY:=Round((Xb/Yb)*RadX);
Xb:=GetMaxX DIV 2;
Yb:=GetMaxY DIV 2;
Xl:=RadX;
Yl:=RadY;
Xr:=GetMaxX-RadX;
Yr:=GetMaxY-RadY;
PItems[1]:=New(CirclePtr,Init(Xl,Yl,RadX,White));
Where[1].Init(Xb,Yb);
PItems[2]:=New(LinePtr,Init(Xr-RadX,Yl,Xr+RadX,Yl,LightGreen));
Where[2].Init(Xb-RadX,Yb);
Pitems[3]:=New(LinePtr,Init(Xr,Yr-RadY,Xr,Yr+RadY,LightGreen));
Where[3].Init(Xb,Yb-RadY);
Pitems[4]:=New(GroupPtr,Init(Xl,Yr,White));
WITH GroupPtr(PItems[4])^ DO
BEGIN
AddItem(New(LinePtr,Init(Xl-1,Yr,Xl+1,Yr,LightRed)));
AddItem(New(LinePtr,Init(Xl,Yr-1,Xl,Yr+1,LightRed)));
END;
Where[4].Init(Xb,Yb);
PItems[5]:=New(StatTxtPtr,Init(Xl-20,Yl-20,Yellow));
Where[5].Init(Xb+5,Yb-35);
Index:=0;
WHILE (Index<5) DO
FOR i:=1 TO 5 DO
WITH PItems[i]^ DO
IF Where[i].IsMoving THEN
BEGIN
Xl:=Where[i].GetX-GetX;
Yl:=Where[i].GetY-GetY;
Xr:=Abs(Xl);
Yr:=Abs(Yl);
IF (Xr>Step) OR (Yr>Step) THEN
IF Xr>Yr THEN
MoveTo(Step*(Xr DIV Xl),0)
ELSE
MoveTo(0,Step*(Yr DIV Yl))
ELSE
BEGIN
Index:=Index+1;
Where[i].TurnMoving;
END;
END;
{ OGroup:}
OGroup.Init(Xb,Yb,White);
FOR i:=1 TO 5 DO
BEGIN
WITH PItems[i]^ DO
MoveTo(Where[i].GetX-GetX,Where[i].GetY-GetY);
OGroup.AddItem(PItems[i]);
END;
FOR i:=1 TO 5 DO
PItems[i]^.Hide;
OGroup.Drag(Step);
OGroup.Done;
CloseGraph;
END.
Задания
Разработать систему наследуемых объектов и программу, их использующую.
1. Ввода значений переменных различных типов (строкового, целого без знака, целого со знаком, вещественного в естественной и в нормальной формах) с контролем правильности ввода.
2. Для нахождения суммы, разности, присваивания, произведения векторов и матриц различных типов (целого, вещественного, комплексного). С помощью этих объектов найти n-ю степень матрицы.
3. Для нахождения транспонированной, союзной, обратной матриц различных типов (целого, вещественного, комплексного), проверки матрицы на единичность. С помощью этих объектов решить систему линейных уравнений.
4. Определения взаимного расположения двух прямых на плоскости и трехмерном пространстве (совпадают, параллельны, пересекаются, скрещиваются). В случае пересечения найти координаты точки пересечения и угол между прямыми.
5. Представляющие простейшие геометрические фигуры (треугольник, квадрат, прямоугольник, параллелограмм, ромб, трапеция) со свойствами: длины сторон, цвет границы, цвет фона. Разработать программу, генерирующую числа, означающие вид фигур и их свойства и рисующую эти фигуры на экране.
6. Для работы с линейными списками (стек, очередь, линейный односвязный список). Разработать список простейших геметрических фигур, вывести его на экран, а затем последовательно их удалить.
7. Представляющие различных певчих птичек. В программе случайным образом птички появляются на экране и поют в течение определенного времени.
8. Представляющие различные цветы. Программа случайным образом выводит на экран эти цветы, формируя букет.
9. Точка, отрезок прямой, окружность, прямоугольник, построенные из точек, т.е. без использования процедур Line, Circle, Rectangle модуля Graph. Программа должна продемонстрировать эти объекты на экране.
10. Набор различных треугольников: равносторонний, равнобедренный, разносторонний. Кроме исходных свойств объектов – длин сторон, должны быть вычисляемые свойства: величины углов, площадь, радиусы вписанной и описанной окружностей.
11. Простое окно, окно с рамкой, окно с тенью, окно с рамкой и тенью, окно с текстом внутри его и т.п. Программа демонстрирует различные объекты на экране.
12. Отдельные ноты, аккорды, музыкальные фразы. Свойства: номер октавы, наличие перед ней знаков альтерации (бемоль, дубль-бемоль, диез или дубль-диез), длительность. Программа демонстрирует использование этих объектов.
13. Отдельные буквы русского алфавита, слова, фразы. Свойства: шрифт, размер, стиль (полужирный, курсив, подчеркнутый). Программа демонстрирует использование этих объектов.
14. Точка, окружность, круг, сфера, шар. Программа демонстрирует использование этих объектов.
15. Окно, окно с текстом, система окон, меню, как система выбираемых окон. Программа демонстрирует использование этих объектов.
16. Ключевое слово, оператор, процедура, программа. Программа демонстрирует использование этих объектов.
17. В программу примера 1 добавить новые объекты: окружность, эллипс. Продемонстрировать их использование.
18. В программу примера 1 добавить новые объекты: закрашенный прямоугольник, параллелепипед. Продемонстрировать их использование.
19. В программу примера 1 добавить новый объект - текст. Продемонстрировать его использование, создав бегущую строку в графическом окне.
20. Используя объекты, созданные в примере 2, написать программу «беговая дорожка». Изображается беговая дорожка, по которой «бегут спортсмены» (например окружности).
21. Используя объекты, созданные в примере 2, написать программу, демонстрирующую едущего на велоосипеде.
22. Используя объекты, созданные в примере 2, написать программу, демонстрирующую летающий в графическом окне теннисный мячик.
23. Используя объекты, созданные в примере 2 написать программу, демонстрирующую на экране создание, перемещение и уничтожение списка объектов.
24. Используя объекты, созданные в примере 1, написать программу, демонстрирующую на экране празднчный салют.
25. В программу примера 1 добавить объектам новые свойство – возможность изменения размеров объектов. Программа должна продемонстрировать процесс надувания воздушного шарика, пока он не лопнет.
26. В программу примера 1 добавить объектам новые свойство – возможность вращения объекта вокруг точки с заданными координатами на заданный угол. Программа должна продемонстрировать работу ветряной мельницы.
27. В программу примера 1 добавить объектам новые свойство – возможность изменения размеров объектов. Программа должна продемонстрировать приближающегося к нам робота.
28. В программу примера 1 добавить объектам новые свойство – возможность вращения объекта вокруг точки с заданными координатами на заданный угол. Программа должна продемонстрировать работу настольных часов.
29. Используя объекты, созданные в примере 1, написать программу, демонстрирующую на экране падение дождевых капель и круги на воде.
30. Используя объекты, созданные в примере 2, написать программу, демонстрирующую на экране движение поезда.
Литература
Абрамов С.А., Гнездилова Г.Г., Капустина Е.Н., Селюн М.И. Задачи по программированию. М.: Наука, 1988, 224с.
Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. М.: Мир, 1979.
Бондарев В.М., Рублинецкий В.И., Качко Е.Г. Основы программирования. – Харьков: Фолио; Ростов н/Д:Феникс, 1997. –368с.
. Бородич Ю.С. и др. Паскаль для персональных компьютеров: Справ. пособие / Ю.С. Бородич, А.Н. Вальвачев, А.И. Кузьмич.-Мн.: Выш.шк.: БФ ГИТМП «Ника», 1991.-365с.:ил.
. Бородич Ю.С. Разработка программных систем на языке Паскаль: Справ. пособие. – Мн.: Выш.шк.,1992. 143 с.:ил.
Вальвачев А.Н., Крисевич В.С. Программирование на языке Паскаль для персональных ЭВМ ЕС. –Мн.:Выш.шк.,1989. –223с
Вальвачев А.Н. Графическое программирование на языке Паскаль: Справ.пособие. – Мн.: Выш.шк.,1992. –143 с.:ил.
Вирт Н. Алгоритмы и структуры данных. М.: Мир, 1989
Касьянов В.Н., Сабельфельд В.К. Сборник заданий по практикуму на ЭВМ. Учебное пособие для вузов. –М.:Наука, 1986. –272 с.
Климов Ю.С. и др. Программирование в среде Turbo Pascal 6.0: Справ.пособие/ Ю.С. Климов, А.И. Касаткин, С.М. Мороз. –Мн.: Выш.шк., 1992. 158 с.:ил.
Климова Л.М. Pascal 7.0. Практическое программирование. Решение типовых задач.- М.: КУДИЦ-ОБРАЗ, 2000, - 528 с.
Кнут Д. Искусство программирования для ЭВМ. –М.:Мир, 1978. Т 3. – 844с.
Котов В.М., Волков И.А., Харитонович А.И. Методы алгоритмизации. Мн.: Нар.асвета, 1996. –127 с.:ил.
Липский В. Комбинаторика для программистов. М.: Мир, 1988. -213c.ил.
Мануйлов В.Г.Разработка программного обеспечения на Паскале. –М.: “Приор”., 1996. –238 с.
Мейер Б., Бодуэн К. Методы программирования: В 2-х томах.Т1. М.: Мир, 1982. –356с.
Мейер Б., Бодуэн К. Методы программирования: В 2-х томах.Т2. М.: Мир, 1982. –368с.
Мизрохи С.В. TURBO PASCAL и объектно-ориентированное программирование. – М.: Финансы и статистика, 1992. –192с.:ил.
Офицеров Д.В. и др. Программирование на персональных ЭВМ.: Практикум: Учеб.пособие – Мн.:Выш.шк., 1993. –256с.
Пильщиков В.Н. Сборник упражнений по языку Паскаль. М.: Наука, 1989, 160с.
Рейнгольд Э., Нивергельт Ю., Део Н. Комбинаторные алгоритмы.
Теория и практика. М.: Мир, 1980.476 с.
Свами М., Тхуласираман К. Графы, сети и алгоритмы. м.: Мир,1984.-455с.:ил.
Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. –М.: “Нолидж”, 1997. –616 с.ил.
Хьюз Дж., Мичтом Дж. Структурный подход к программированию. М.: Мир, 1980. –278 с.
Чип С. Turbo Pascal 6.0 Professional. ООП: Теория и практика. –Мн.:SCI, 1992. –138 с.,ил.
TURBO PASCAL 6.0 руководство пользователя. Мн.: «Радзiма», 1992. –256с.
Филлипс Д., Гарсиа-Диас А. Методы анализа сетей:- М.: Мир, 1984. –496 с.,ил.