Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабПрактОАиПН111.doc
Скачиваний:
58
Добавлен:
25.02.2016
Размер:
1.38 Mб
Скачать

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 с.,ил.