Консультация № 161469
26.02.2009, 14:05
0.00 руб.
0 1 1
Уважаемые эксперты помогите решить задачи:
1. Составить программу табулирования функции ”Эпициклоида” заданной параметрически:
x = (a + b) . cos (t) – a . cos ((a + b) . t/a),
y = (a + b) . sin (t) – a . sin ((a + b) . t/a),
где: a>0, b>0, t принадлежит промежутку от 0 до [0, 2(число пи)]
на интервале изменения параметра t0<=t<=tk с заданным шагом h. Все необходимые значения (t0, tk, h, A, B) задаются в диалоге с компьютером по желанию пользователя. На экран выводится таблица значений t, x, y на заданном интервале изменения параметра t с заданным шагом. Привести графическую иллюстрацию задачи: построить график заданной функции на заданном интервале с необходимыми комментариями (подписи осей координат, формула графика). Параметры функции подобрать так, чтобы ее график был “фотогеничен”.

2. Написать программу создания/чтения файла, содержащего сведения по теме “Личная видеотека”. Каждая запись файла должна содержать 4-5 полей (названия придумать самостоятельно). Файл должен содержать не менее 8-10 записей.

Обсуждение

Неизвестный
27.02.2009, 10:51
общий
это ответ
Здравствуйте, iren26!

1. Предлагаю следующий вариант:
Бросте на форму 5 TEdit ов для ввода параметров, TImage - область рисования и TButton.
Программа содержит функцию прорисовки координатной сетки Axsis(ABmp:TBitMap;XMin,XMax,YMin,YMax:extended),
где XMin=-2*a-b, XMax=2*a+b - область определения эпициклоиды, YMin=-2*a-b, YMax=2*a+b - область значений функции
Код с комментариями в приложении.

2. Описываем тип запись
Type
TMyRecord=record
field1 :byte;
field2 :String[10];
field3 :real;
field4 :word;
end;

и в разделе описания переменных определяем массив типа MyRec:array of TMyRecord;
процедуры чтения - записи в приложении
Удачи!




Приложение:
//Вопрос 1

//Функция вычисляет координаты точки X, Y по значениы Т
function F(T:extended):TCicl;
begin
result[0]:=(a+b)*cos(T)-a*cos((a + b)*t/a);
result[1]:=(a + b)*sin(t)-a*sin((a + b)*t/a);
end;

procedure Axsis(ABmp:TBitMap;XMin,XMax,YMin,YMax:extended);
var
Dx,Dy:Extended;
i:integer;
DrowRect: TRect;
begin
//Область, занимаемая графиком меньше размеров бит мэпа
// ShiftL - отступ от левого и нижнего края Bmp
//ShiftT - отступ от правого и верхнего края Bmp
//DrowRect - область занимаемая графиком
DrowRect:=Rect(ShiftL,ShiftT,ABmp.Width-ShiftT+1,ABmp.Height-ShiftL);
//очищаем область рисования
ABmp.Canvas.FillRect(Rect(0,0,ABmp.Width,ABmp.Height));
ABmp.Canvas.Pen.Width:=2;
//Рисуем границы графика
ABmp.Canvas.Rectangle(DrowRect);
//рисуем координатную сетку серым пунктиром
ABmp.Canvas.Pen.Width:=1;
ABmp.Canvas.Pen.Color:=clGray;
ABmp.Canvas.Pen.Style:=psDash;
Dx:=(ABmp.Width-(ShiftL+ShiftT))/10;
Dy:=(ABmp.Height-(ShiftL+ShiftT))/10;
for I := 1 to 9 do
begin
//горизонтальные линии
ABmp.Canvas.MoveTo(ShiftL,Round((10-i)*Dy)+ShiftT);
ABmp.Canvas.LineTo(ABmp.Width-ShiftT,Round((10-i)*Dy)+ShiftT);
//вертикальные линии
ABmp.Canvas.MoveTo(Round(i*Dx+ShiftL),ShiftT);
ABmp.Canvas.LineTo(Round(i*Dx+ShiftL),ABmp.Height-ShiftL);
//выводим числовые значения Y
ABmp.Canvas.TextOut(1,Round((10-i)*Dy+(ABmp.Canvas.Font.Size div 2)),
FloatToStrF((YMax-YMin)*i/10+YMin,ffFixed,4,2));
//и X
ABmp.Canvas.TextOut(Round(Dx*i)+ShiftL-5,ABmp.Height-ShiftL+2,
FloatToStrF((XMax-XMin)*i/10+XMin,ffFixed,4,2));
end;
//восстанавливаем свойства пера
ABmp.Canvas.Pen.Style:=psSolid;
ABmp.Canvas.Pen.Width:=2;
ABmp.Canvas.Pen.Color:=clBlack;
end;

//по щелчку по кнопке строим график
procedure TForm2.Button1Click(Sender: TObject);
var
Temp:integer;
Bmp:TBitMap;
begin
//Читаем из едитов значения параметров задачи
try
a:=StrToFloat(Edit1.Text);
except
ShowMessage('Ошибка конвертации str to float a');
exit;
end;
try
b:=StrToFloat(Edit2.Text);
except
ShowMessage('Ошибка конвертации str to float b');
exit;
end;
try
T0:=StrToFloat(Edit3.Text);
except
ShowMessage('Ошибка конвертации str to float T0');
exit;
end;
try
DT:=StrToFloat(Edit4.Text);
except
ShowMessage('Ошибка конвертации str to float DT');
exit;
end;
try
T1:=StrToFloat(Edit5.Text);
except
ShowMessage('Ошибка конвертации str to float T1');
exit;
end;
//создаем виртуальный битмэп
Bmp:=TBitMap.Create;
Bmp.Width:=Image1.Width;
Bmp.Height:=Image1.Height;
//рисуем координатную сетку
Axsis(Bmp,-2*a-b,2*a+b,-2*a-b,2*a+b);
//вычисляем значения X и Y
Cicl:=F(T0);
//ставим начальную точку на графике
Bmp.Canvas.MoveTo(Round((Cicl[0]+2*a+b)*(Bmp.Width-40)/(4*a+2*b))+30,
Round((Bmp.Height-40)*(1-(Cicl[1]+2*a+b)/(4*a+2*b)))+10);
T:=T0;
//рисуем график
while T<T1 do
begin
T:=T+DT;
Cicl:=F(T);
Bmp.Canvas.LineTo(Round((Cicl[0]+2*a+b)*(Bmp.Width-40)/(4*a+2*b))+30,
Round((Bmp.Height-40)*(1-(Cicl[1]+2*a+b)/(4*a+2*b)))+10);
end;
//выводим уравнение кривой в центре экрана
Temp:=Bmp.Canvas.TextWidth('x=(a+b)*cos(T)-a*cos((a+b)*t/a)');
Bmp.Canvas.TextOut((Bmp.Width-Temp) div 2,
Bmp.Height div 2-Bmp.Canvas.Font.Size,'x=(a+b)*cos(T)-a*cos((a+b)*t/a)');
Temp:=Bmp.Canvas.TextWidth('y=(a+b)*sin(t)-a*sin((a+b)*t/a)');
Bmp.Canvas.TextOut((Bmp.Width-Temp) div 2,
Bmp.Height div 2+Bmp.Canvas.Font.Size,'y=(a+b)*sin(t)-a*sin((a+b)*t/a)');
//переносим все на экран
Image1.Picture.Graphic:=Bmp;
//освобождаем память
Bmp.Free;
end;

//Вопрос 2

//процедура записи в файл
procedure TForm1.Button1Click(Sender: TObject);
var
hF:file of TMyRecord;
i:integer;
FileName:string;
begin
try
AssignFile(hF,FileName);
except
exit;
end;
rewrite(hF);
i:=0;
while i<length(MyRec) do
begin
write(hF,MyRec[i]);
inc(i);
end;
CloseFile(hF);
end;

//процедура чтения из файла
procedure TForm1.Button2Click(Sender: TObject);
var
hF:file of TMyRecord;
i:integer;
FileName:string;
begin
try
AssignFile(hF,FileName);
except
exit;
end;
reset(hF);
i:=1;
SetLength((MyRec,FileSize(FileName));
while not EOF(hF) do
begin
read(hF,MyRec[i]);
inc(i);
end;
CloseFile(hF);
end;

Форма ответа