- •Московский государственный технический университет
- •Содержание.
- •Предисловие
- •Лабораторная работа №1 Процедурные типы
- •1. Теоретические сведения
- •Var X: real; I: integer;
- •X, y : byte;
- •VarFunc : FuncType;
- •I : integer;
- •2.Задачи для самостоятельного решения
- •Лабораторная работа №2 Модули
- •Теоретическая часть
- •Структура модулей
- •Связь модулей друг с другом
- •ISwap(a,b);
- •Var I, y :integer;
- •2.2. Практическая часть
- •Interface
- •Implementation
- •I: Integer;
- •3. Задачи, для самостоятельного решения
- •Лабораторная работа №3 Меню
- •1. Теоретическая часть
- •Var X,y,I: byte;
- •XUpLeft;
- •Var npos,I: integer;
- •Case npos of
- •Лабораторная работа №4.
- •2.Задачи, для самостоятельного решения:
- •Лабораторная работа № 5 Указатели. Связанные списки
- •1. Теоретические сведения
- •1.1. Указатели
- •1.2. Связные списки записей
- •1.3. Управление связанным списком записей (на примере)
- •1.3.1. Построение списка
- •Var ListOfChecks, CurrentCheck: pCheck;
- •1.3.2. Перемещение по списку
- •Var p: Pint;
- •2. Демонстрационные примеры
- •X1,y1,x2,y2: word;
- •Var npos,I,n,j :integer;
- •3: Begin
- •Interface
- •Задачи 1..4. Создать типизированный файл записей, содержащих сведения о багаже пассажира. Структура записи имеет следующий вид:
- •Var rec, beg, endd, current: pnt;
- •Задача 5. Создать типизированный файл записей, содержащих сведения об автомобиле. Структура записи имеет следующий вид:
- •Var rec, beg, endd, current : pnt;
- •Задача 22. Создать типизированный файл записей, содержащих сведения о книгах. Структура записи имеет следующий вид:
- •1.2.Объект и инкапсуляция
- •1.3. Иерархия объектов и наследование
- •Visible: Boolean;
- •Init(x1,y1);
- •Interface
- •Interface
- •X,y : Integer;
- •Visible : Boolean;
- •Implementation
- •Var Temp : Word;
- •Var Temp : Word;
- •Var gm,gd:Integer;
- •Xp:Point;
- •Xs:Square;
- •Xps:PaintSquare;
- •InitGraph(Gd,Gm,'');
- •2. Демонстрационные примеры
- •X,y:integer;
- •Inherited init(ax,ay);
- •Задача 12. Простые объекты.
- •Задача 14. Простые объекты.
- •Задача 15. Простые объекты.
- •Задача 20. Простые объекты.
- •Задача 21. Простые объекты.
- •Задача 22. Простые объекты.
- •Задача 23. Простые объекты.
- •Задача 25. Простые объекты.
- •Лабораторная работа №8 Статические объекты
- •Теоретическая часть
- •1.1.Вывод точек и линий
- •1.2.Вывод многоугольников
- •Виды закраски определяется константами.
- •1.3.Вывод дуг, окружностей, эллипсов
- •1.4.Вывод текста
- •Демонстрационные примеры
- •Лабораторная работа №9
- •2. Задачи, для самостоятельного решения
- •Лабораторная работа №10
- •1.2. Перенос изображения
- •1.3. Масштабирование изображения
- •1.4. Масштабирование рисунка
- •1.5. Поворот изображения
- •1.5.1.Поворот точки
- •1.5.2. Поворот рисунка
- •1.6. Композиция преобразований
- •2. Демонстрационные примеры
- •X,y:integer;
- •1: CloseGraph;
- •3.Задачи, для самостоятельного решения
- •Лабораторная работа №12 Рубежный контроль №2
- •Задачи, для самостоятельного решения
Var gm,gd:Integer;
Xp:Point;
Xs:Square;
Xps:PaintSquare;
Procedure DragAny(Var AnyX : Point);
{Процедура перемещает любую фигуру, порожденную от объекта Point}
Const Left = #75; { , код клавиш управления курсором}
Right = #77; { }
Up = #72; { }
Down = #80; { }
Gap = 11; {сдвиг при движении на столько точек}
Var
Ch : Char;
StartX,StartY : Integer;
Begin
AnyX.Show;
StartX:=AnyX.GetX;
StartY:=AnyX.GetY;
Repeat
Ch:=ReadKey;
If Ch=#0 Then Begin
Ch:=ReadKey;
Case Ch Of
Left : Dec(StartX,Gap);
Right : Inc(StartX,Gap);
Up : Dec(StartY,Gap);
Down : Inc(StartY,Gap);
End;
AnyX.Shift(StartX,StartY);
End;
Until Ch=#27; {окончание перемещения - клавиша Esc}
End;
{-----------------------------------}
Begin
Gd:=Detect;
InitGraph(Gd,Gm,'');
if GraphResult<>GrOk then Halt(1);
XP.Init(320,170); {инициализируется точка}
DragAny(XP);
XP.Hide;
XS.Init(320,170,50); {инициализируется квадрат}
XS.Show;
DragAny(XS);
XS.Hide;
XPS.Init(320,170,50,14); {инициализируется окрашенный квадрат}
DragAny(XPS);
XPS.Hide;
CloseGraph;
End.
Пример позднего связывания демонстрирует использование процедуры Shift объектами XS (квадрат) и XPS (окрашенный квадрат). Объекты этого типа наследуют метод Shift от Point. Метод Point.Shift обращается к виртуальным методам Point.Show и Point.Hide. Одноименные методы Show и Hide имеют типы Square и PaintSquare. С помощью ТВМ родительский метод Point.Shift "узнал" о существовании виртуальных методов Square.Show,Square.Hide, PaintSquare.Show и PaintSquare.Hide и использовал именно их при обращении к Square.Shift и PaintSquare.Shift. Поэтому на экране перемещаются соответственно точка, квадрат и окрашенный квадрат. Это и есть пример полиморфизма (перемещение разных фигур одним методом Shift).
2. Демонстрационные примеры
Пример 7.2.
program LAST_PROGRAM_BY_PASCAL;
{point - line -PerecrestLine }
uses crt,graph;
type
TCoord=object {координаты объекта}
X,y:integer;
constructor Init(ax,ay:integer); end;{специальный тип процедуры , которая выполняет некоторую установочную работу для механизма виртуальных методов. Более того, конструктор должен вызываться перед вызовом любого виртуального метода. Вызов виртуального метода без предварительного вызова конструктора может привести к блокированию системы, а у компилятора нет способа проверить порядок вызова методов.
Каждый экземпляр объекта должен инициализироваться отдельно вызовом конструктора. Недостаточно инициализировать один экземпляр объекта и затем присваивать этот экземпляр другим.}
constructor TCoord.Init;
begin
x:=ax;
y:=ay;
end;
type TPixel=object (TCoord) {дочерний объект , объекта TCoord }
color:integer; {новое свойство дочернего объекта}
constructor Init (ax,ay:integer;acolor:integer);
procedure Draw; {метод - рисование}
end;
constructor TPixel.Init; {реализационная часть нового объекта}
begin
inherited Init (ax,ay);{позволяет вызывать методы предка без указания имени типа предка и точки. Это очень пригодиться при использовании большой иерархии, когда запомнить все связи типа «предок-потомок» невозможно.}
color:=acolor;
end;
procedure TPixel.Draw;
begin
putpixel(x,y,color);{закрашивает пиксель с заданными координатами в цвет color}
end;
type TLine=object (TCoord)
l:integer;
constructor Init (ax,ay:integer;al:integer);
procedure Draw; virtual;
end;
constructor TLine.init;
begin