- •Московский государственный технический университет
- •Содержание.
- •Предисловие
- •Лабораторная работа №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
- •Задачи, для самостоятельного решения
Лабораторная работа №1 Процедурные типы
Цель работы – овладение практическими приемами разработки программ с помощью процедурных типов, дающих программисту гибкие средства передачи функций и процедур в качестве фактических параметров при обращении к другим процедурам и функциям.
1. Теоретические сведения
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:
Type
Proc1 = Procedure (a, b, c : real; var d: real);
Proc2 = Procedure ( var a, b);
Proc3 = Procedure;
Func1 = Function : string;
Func2 = Function ( var s: string) : real;
Как видно из приведенных примеров, существует два процедурных типа:
тип-процедера и тип-функция.
Рассмотрим пример, иллюстрирующий механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций: sin1(x) = (sin(x) + 1) * e-x
и cos1(x) = (cos(x) + 1) * e-x.
Вычисление и печать значений этих функций реализуется в процедуре PrintFunc, которой в качестве параметров передаются номер позиции N на экране, куда будет выводиться очередной результат (с помощью этого параметра реализуется вывод в две колонки), и имя нужной функции.
Пример 1.1
Program VichFunc;
Uses Crt;
Type Func = Function (x: real) : real;{объявление процедурных типов: типа функций}
{$F+}; {включение директивы “дальнего” вызова}
Function sin1(x:real): real;
begin
sin1 := (sin(x)+1) * exp(-x);
end;
Function cos1(x:real): real;
begin
cos1 := (cos(x)+1) * exp(-x);
end;
{$F-};
Procedure PrintFunc(n: byte; F: Func);{вычисление и печать значений функций реализуется в данной процедуре, в которой в качестве параметра передается номер позиций n на экране, куда будет выводиться очередной результат (с помощью этого параметра реализуется вывод в две колонки), и имя нужной функции}
const np=5; {количество вычислений функций}
Var X: real; I: integer;
Begin
for i:=1 to np do
begin
x:= i * (2 * 3.14/np);
GotoXY(n,whereY);{перемещаем курсор к элементу экрана с координатами Х,У., whereY – возвращает текущую координату Yтекущего положения курсора в окне}
writeln (x:5:3; F(x):10:5);
end;
End;
Begin {Основная программа}
ClrScr;
PrintFunc(1,sin1);
GotoXY(1,1);
PrintFunc(35,cos1);
KeyPressed;
End.
Обратим внимание: для установления правильных связей функций sin1 и cos1 с процедурой PrintFunc они должны компилироваться с расчетом на дальнюю модель памяти. В этом режиме при вызове подпрограмм используются длинные 4-байтовые адреса (для записи адреса в память отдельно сохраняется сегментный адрес = 2 байтам, и смещение = 2 байтам). 2-х байтовые адреса применяются обычно для адресации подпрограмм, объявленных в основной программе или ее подпрограмма.
Вот почему в программе вставлены ключи компилятору {$F+ }либо вставляются стандартные функции Far сразу за заголовками функций. В таком режиме должны компилироваться любые процедуры и функции, которые будут передаваться в качестве фактических параметров вызова.
Стандартные (встроенные) процедуры и функции ТР не могут передаваться рассмотренным способом.
В программе могут быть объявлены переменные процедурных типов, например, так:
Var
P1 : Proc1;
f1,f1: Func2;
ap: array [1..N] of Proc2;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы, например:
Type
Proc = Procedure ( n: word; var a : byte);
Var
ProcVar : Proc;