
- •Методические указания по выполнению домашних заданий для студентов 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;
0,0, 1,0, 0,1, Tc, clRed);
tr[2]:=cTri.Init(t0.x, t0.Y, 100, Form1.Canvas,
0,0, -1,0, 0,1, tc, clBlue);
tr[3]:=cTri.Init(t0.x, t0.Y, 100, Form1.Canvas,
0,0, -1,0, 0,-1, tc, clGreen);
tr[4]:=cTri.Init(t0.x, t0.Y, 100, Form1.Canvas,
0,0, 1,0, 0,-1, tc, clYellow);
N2.Enabled:=true; // Кнопка таймера доступна
end;
// Кнопка запуска таймера.
procedure TForm1.N2Click(Sender: TObject);
begin
if Timer1.Enabled then Timer1.Enabled:=false
else Timer1.Enabled:=true;
end;
// Обработчик сигналов таймера.
procedure TForm1.Timer1Timer(Sender: TObject);
Var I : word;
Begin
// Очистка экрана и рисование осей
dec.Draw;
// Рисование
for i:=1 to 4 do tr[i].Draw;
// Пересчет координат объектов
for i:=1 to 4 do tr[i].Rotation(Pi/36);
end;
Класс графика траектории cTrace.
График траектории движения это обычный график функции y=f(x), построенный в интервале изменения аргумента от a до b. Параметры графика являются полями класса cTrace.
Для большей универсальности функцию целесообразно объявить предопределенным процедурным типом.
Листинг 18е. Объявление класса cTrace.
Type
Tf=function(x : real) : real;
cTrace=
class(cDecart)
private
a, b : real;
f : Tf;
public
Constructor Init(fx0, fy0 : integer;
fmx : real; fcnv : TCanvas;
fa, fb : real; ff : Tf);
Procedure Draw;
end;
Реализация методов класса.
Procedure cTrace.Draw;
Const n=101;
Var dx : real; tr : trPoint; tp: tPoint; I : word;
Begin
dx:=(b-a)/(n-1);
tr.x:=a; tr.y:=f(tr.x); tp:=tpix(tr);
cnv.Pen.Color:=clBlack;
cnv.MoveTo(tp.X, tp.Y);
for i:=2 to n do
begin
tr.x:=a+dx*(i-1); tr.y:=f(tr.x);
tp:=tpix(tr);
cnv.LineTo(tp.X, tp.Y);
end;
End;
Constructor cTrace.Init(fx0, fy0 : integer;
fmx : real; fcnv : TCanvas;
fa, fb : real; ff : Tf);
Begin
Inherited Init(fx0, fy0, fmx, fcnv);
a:=fa; b:=fb; f:=ff;
End;
Траектория (см. свой вариант задания) программируется в том же модуле, что и класс траектории, но она не является членом класса. По правилам оформления модуля заголовок функции должен быть продублирован в интерфейсной части модуля вне объявления класса (обычно перед разделом VAR модуля).
Function MyTrace(x : real) : real;
Begin
Result:=1-0.25*x*x;
End;
Инициализация и использование класса.
Переменную trace, объявленную в модуле класса, необходимо проинициализировать в обработчике настроек программы в соответствии с параметрами конструктора. Чтобы не запутаться в порядке инициализации, рекомендую сначала инициализировать объект класса cDecart затем объект класса cTrace, а уже потом другие объекты (треугольники и т.п.).
trace:=cTrace.Init(t0.x, t0.Y, 100, Form1.Canvas,
-2, 2, MyTrace);
Обращение к методу рисования необходимо добавить в обработчик таймера сразу после рисования осей координат.
Проблема связи между объектами.
Напомню, что плоское движение является суперпозицией вращательного движения вокруг центра вращения и поступательного движения центра вращения. Метод вращения уже есть. Надо «научить» класс фигуры пересчитывать свои координаты в соответствии с графиком траектории.
Начальное положение фигуры – точка x=a, y=f(a). Конечное положение - точка x=b, y=f(b).
Здесь возникает довольно серьезная проблема – объект треугольник ничего «не знает» о траектории движения. Переменная, ответственная за положение центра вращения никак не связана с уравнением траектории. Существует, по крайней мере, два способа решения этой проблемы
Передавать параметры траектории через список параметра метода Move(a, b : real; f:Tf);
Включить эти параметры в данные класса «треугольник» в виде переменной – объекта класса cTrace, либо «россыпью». Естественно, в конструкторе класса надо эти дополнительные поля инициализировать.
Как это часто бывает, очевидного решения этой проблемы, на данном этапе разработки, нет. Надо пробовать оба.
Метод Move c параметрами графика.
Листинг 18ж. Метод Move с передачей данных графика через параметры.
Procedure cTri.Move(a, b : real; f : Tf);
Const n=101;