Построить график функции в графическом режиме.
Решение
Program GraficFun;
{КР2 Задание2 выполнено учащимся № группы ФИО № варианта}
Uses
Crt,Graph; {подключаем стандартные библиотеки}
Type
TFunction=function(x:real):real; {тип "Функция вида f(x)"}
Var
f:TFunction; {объявляем переменную-функцию}
grDriver, {переменная: тип видеоадаптера}
grMode, {переменная: номер видеорежима}
grError:integer; {переменная: результат инициализации}
{процедура прорисовки осей графика}
procedure DrawGrid(a,b:real);
Var
s:string[4];
max:real;
Begin
Line(0,GetMaxY div 2,GetMaxX,GetMaxY div 2);
Line(GetMaxX div 2,0,GetMaxX div 2,GetMaxY);
if a>b then
max:=a
Else
max:=b;
Str(-max:4:1,s);
OutTextXY(0,(GetMaxY div 2)+10,s);
end;
{процедура инициализации графического видеорежима}
procedure InitMyGraph;
Begin
{автоматическое определение типа драйвера}
grDriver:=Detect;
InitGraph(grDriver,grMode,''); {ИНИЦИАЛИЗАЦИЯ}
grError:=GraphResult; {результат инициализации}
if grError<>grOk then{если возникла ошибка}
Begin
writeln('Ошибкаинициализации графики');
{вывод текста конкретной ошибки}
writeln(GraphErrorMsg(grError));
Halt(1); {завершение программы, код возврата 1}
end;
end;
{выход из графического режима}
procedure CloseMyGraph;
Begin
CloseGraph; {выход из графического режима в текстовый}
end;
{процедура построения графика функции;
а, b – границы отрезка, n – количество промежутков}
procedure DrawFunction(var f:TFunction;a,b:real;n:integer);
Var
i:integer; {счетчик циклов}
x,y:real; {x – аргумент, y – значение функции}
dx:real; {dx – приращение аргумента}
sDx,sDy:real; {приращение x и y на пиксель}
y0,x0:integer; {экранные координаты: (x0,y0) – старые}
yi,xi:integer; {(xi,yi) – новые}
fmin,fmax:real; {макс./мин. значения f(x) на отрезке}
maxy,maxx:real; {макс. абсолютные значения на X и Y }
Begin
SetColor(Cyan); {цвет рисования – бирюзовый}
DrawGrid(a,b); {рисование осей системы координат}
SetColor(Yellow); {цвет рисования – желтый}
{считаем, что dx<>0, т.е. отрезок не вырожден (или а<>b)}
dx:=(b-a)/n;
{нахождение макс./мин. значений f(x) на отрезке}
x:=a; {начальное значение х}
fmin:=f(x); {начальное значение fmin}
:=f(x); {начальное значение fmax}
for i:=0 to n do{поиск действительных значений fmin/fmax}
Begin
x:=x+dx;
if f(x)>fmax then
fmax:=f(x);
if f(x)<fmin then
fmin:=f(x);
end;
if abs(fmax)>abs(fmin) then{если функция – константа}
maxy:=abs(fmax)
Else
maxy:=abs(fmin);
if abs(a)>abs(b) then
maxx:=abs(a)
Else
maxx:=abs(b);
{вывод графика на экране}
x:=a; {начальные значения}
y:=f(a);
{расчет относительного приращения координат}
sDy:=2*maxy/(GetMaxY);
sDx:=2*maxx/(GetMaxX);
x0:=(GetMaxX div 2)+Trunc(a/sDx);
{расчет "старой" точки}
y0:=(GetMaxY div 2)-Trunc(y/sDy);
for i:=1 to n do{цикл рисования графика}
Begin
x:=x+dx; {увеличить х}
y:=f(x); {новое значение y }
xi:=(GetMaxX div 2)+Trunc(x/sDx); {расчет "новой" точки}
yi:=(GetMaxY div 2)-Trunc(y/sDy);
Line(x0,y0,xi,yi); {рисуем линию }
x0:=xi; {"новые" значения стали "старыми"}
y0:=yi;
end;
{вывод пояснительного текста текущим цветом (желтым)}
OutTextXY(330,15,'Graficmashtabirovan');
OutTextXY(330,30,'pomax abs znacheniam X i Y');
end;
{$F+}
function MyFunc(t:real):real;
Begin
MyFunc:=exp(-t)*sin(2*t);
end;
Begin
f:=MyFunc;
InitMyGraph; {инициализация графики}
DrawFunction(f,-Pi,Pi,50); {рисуем функцию}
Repeat
until KeyPressed;
ReadKey;
CloseMyGraph; {выходим из графического режима}
end.