
- •Методические указания по выполнению домашних заданий для студентов 1 курса специальности иу-10.
- •Введение.
- •Домашнее задание 1. Практикум 6. Приближенные вычисления.
- •Задача 6.1.
- •Var a, b, c : real;
- •Iter : longword;
- •Inc(iter);
- •Задания.
- •Задача 6.2.
- •Inc(n); inc(iter);
- •Задания.
- •Практикум 7. Процедурные типы.
- •Задача 7.1.
- •Var a, b, X, dx, y1, y2, s1, s2 : real;
- •Var a, b, X, dx, y1, y2, s1, s2 : real;
- •Inc(iter);
- •Задания.
- •Задача 7.2.
- •Var s1, s2 : real;
- •Задания.
- •Домашнее задание 2. Практикум 13. Типизированные файлы.
- •Задача 13.1.
- •Var I : word;
- •Var I, j : word; buf : tSportMan;
- •If fSort(a[I], a[j]) then
- •Var I : word;
- •Var I : word;
- •Var aHi : Ta; Var nHi : word);
- •Var I : word;
- •Задания.
- •Домашнее задание 3. Практикум 18. Использование объектной технологии для построения движущихся фигур.
- •X, y : real;
- •2*T0.X-border, 2*t0.Y-border);
- •X3, y3 : real;
- •X1, y1, x2, y2, x3, y3 : real;
- •Inherited Init(fx0, fy0, fmx, fcnv);
- •Var t : array[1..3] of tPoint; I : byte;
- •Var t0 : tPoint; tc : trPoint; tri:cTri;
- •0,0, 1,0, 0,1, Tc, clRed);
- •Var I : byte; r, a : real;
- •Var t0 : tPoint; tc : trPoint;
- •0,0, 1,0, 0,1, Tc, clRed);
- •Var I : word;
- •Var dx : real; tr : trPoint; tp: tPoint; I : word;
- •Inherited Init(fx0, fy0, fmx, fcnv);
- •Var dx : real;
- •Var t : array[1..3] of tPoint; tr : trPoint;
- •I : byte;
- •Var dx : real;
- •Var list : cList;
- •Var I : word;
Var dx : real;
Begin
dx:=(b-a)/(n-1);
tc.x:=tc.x+dx;
tc.y:=f(tc.x);
End;
Обращение к методу в обработчике событий таймера рекомендуется выполнять после вызова Rotation
for i:=1 to 4 do tr[i].Rotation(Pi/36);
for i:=1 to 4 do tr[i].Move(-2,2,MyTrace);
Перед инициализацией треугольников надо указать стартовую точку
tc.x:=-2;
tc.y:=MyTrace(-2);
Доработка метода cTri.Draw.
До сих пор центр вращения совпадал с началом координат, и все было ОК. Теперь надо внести изменения в «рисовалку» для учета смещения центра вращения относительно центра экрана.
Procedure cTri.Draw;
Var t : array[1..3] of tPoint; tr : trPoint;
I : byte;
Begin
// Введена вспомогательная переменная tr для
// вычисления абсолютных реальных координат вершин
// (напомню, вершины apex[i] задаются относительно
// центра вращения tc)
for i:=1 to 3 do
begin
tr.x:=tc.x+apex[i].x;
tr.y:=tc.y+apex[i].y;
t[i]:=tpix(tr);
end;
// Далее по тексту листинга 18б.
Метод Move с включением переменной – объекта класса cTrace в данные класса cTri.
В список данных класса необходимо добавить поле trace : cTrace;
В конструкторе класса теперь, вместо формального параметра ftc : TRPoint; для инициализации начального положения центра вращения, следует предусмотреть ftrace : cTrace;.
В классе cTrace должны быть предусмотрены функции доступа к закрытым полям класса.
В реализации конструктора фрагмент инициализации начального положения центра вращения можно оформить следующим образом (обратите внимание на синтаксис)
trace:=ftrace;
tc.x:=trace.GetA;
tc.y:=trace.GetFunc()(tc.x);
Смысл этих изменений заключается в том, что теперь источниками получения значений параметров a, b являются функции доступа GetA и GetB, а траектории – функция GetFunc. Алгоритм пересчета остался прежним.
Листинг 18з. Метод Move с использованием объекта класса cTrace внутри класса cTri.
Procedure cTri.Move;
Const n=101;
Var dx : real;
Begin
dx:=(trace.GetB-trace.GetA)/(n-1);
tc.x:=tc.x+dx;
tc.y:=trace.GetFunc()(tc.x);
End;
Создание контейнера.
Для завершения композиции объединим все визуальные элементы картинки (оси, график, движущиеся фигуры) в один составной элемент - контейнер, с тем, чтобы дальнейшая работа по изменению композиции сводилась только к изменению содержимого контейнера.
Понятие контейнера было рассмотрено ранее в Практикуме 6 на примере организации данных в списковую структуру (список и контейнер – здесь рассматриваются как синонимы).
Поскольку в контейнере можно хранить данные только одного типа, то в качестве такого типа выберем базовый класс cDecart. Структура и методы класса остались такими же, как и в примере из Практикума 6.
Отличие заключается в том, что теперь базовый класс не может быть абстрактным, поскольку мы должны иметь хотя бы один экземпляр этого класса для рисования осей координат и стирания области холста.
В методы класса необходимо включить, кроме методов добавления в список и рисования списка, еще методы пересчета координат при вращении и перемещении.
Класс cList.
Листинг 18и. Объявление контейнерного класса cList. Используется метод Move из листинга 18з.
Type cList=
class(cDecart)
private
n : word;
a : array[1..21] of cDecart;
public
Constructor Init;
Procedure Add(fa : cDecart);
Procedure Draw;
Procedure Rotation(da : real);
Procedure Move;
end;
// Объект класса.