program Graphics;
uses Crt, Graph;
const n=640; {Количество точек }
xStart=-5; { Начальное значение аргумента }
xEnd= 5; { Конечное значение аргумента }
var xPos: integer; { Позиция по горизонтали }
yPos: integer; { Позиция по вертикали }
х: real; { Аргумент ]
у: array [1..n] of real; { Массив значений функции }
h: real; { Шаг изменения аргумента }
yMin:real; { Наименьшее значение }
уМах: real; { Наибольшее значение }
i, j: integer;
Gd: integer; { Графический драйвер }
Gm: integer; { Графический режим }
function f(x: real): real;
begin
f:=x*x*x/(2*(x+1)*(x+1));
end; { f }
function f2(x:real): real;
begin
f2:=x/2-l;
end; { f2 }
begin { Табулирование функции)
x:= xStart;
h: = (xEnd -xStart) / (n-1);
for i:= 1 to n do begin
y[i]:=f(x);
if y[i] < -6 then
y[i]:=-6;
x:= x+h;
end;
{-- Определение наибольшего и наименьшего значений. --} уМах:=у[1];
yMin:=y[1];
for i: = 1 to n do begin
if y[i] >yMax then yMax:sy [i];
if y[i] <yMin then yMin:=y[i];
end;
[----.---- Устанавливаем графический режим -----"-} Gd:= Detect; ^ ' lnit<3raph (Gd, Gm, 1 D s \TP7 \BGI ');
[------.-.-.---.-.--.- Выводим заголовок ---"-.---------)
SetTextStyle(Oe^£aultFont, HorizDir,3);
SetTeXt Justify (Center-Text, TopText);
OutTextXY(GetM§^X div 2, 0, ' График функции/);
^^l/^l•'•lll'l<-'r'fl•"•l'•":/:'"' •111' 1 ^bow а1"1 "1 ^ --.--.< ------—*--.- Проводим ось Х "---"""------}
SetTextStyle(DefaultFont, HorizDir, 2);
yPos: = Trunc<GetMaxY+yMin/ (yMax.-yMin) *GetMaxY);
Lihe(0, yPos, GetMaxX, yPos);
OutTextXY(GetMaxX-10, yPos-20, 'X');
SetLineStyletCenterLn, 0, NormWidth);
SetColor (Magenta);
(---.--^-.--- Выводим горизонтальную сетку "----".--} 'for i:=-6 to'2 do begin ^1;;. ^--.^л^. • '<"llcl"l'•;•'; -'• if i== 0 then <
SetColor(LightGreen) < else
SetColor(Green);
yPos: = GetMaxY-Trunc ((i-yMin) / (yMax-yMin) * GetMaxY);
Line(0, yPos, GetMaxX, yPos);
end;
{----.--..-.--.- Выводим вертикальную сетку -----------)
for i:== 0 to 10 do begin if i = 5 then
SetColor(LightGreen) else
SetColor(Green);
xPos: =Trimc (GetMaxX/10* i);
Line(xPos, 0, xPos, GetMaxY);
end;
{--- Определяем первую точку графика и помещаем -"} '
{--------«--.-- в нее текущий указатель -------------у
xPos; = 0;
yPos: = GetMaxY-Trunc ((у [ 1] -yMin) / (yMax-yMin) * ' GetMaxY);
MoveTo(xPos, yPos);
{-- Для-остальных точек определяем точки графика "} ^--.--.---.-.- и соединяем их отрезками прямой -"-------)
SetLineStyle(SolidLn, 0, Thi^kWidth);
SetColor(Yellow);
for i:= 2 to n do begin
xPos:=Trunc(GetMa3CX/(n-l)*(i-l));
yPos:= GetMaxY-Trunc ((y[i] -yMin) / (yMax-yMih) * GetMaxY);
if yli] > -6 then
LineTo(xPos, yPos) else
MoveTo(xPos, yPos);
Delay(10);_ end;
{"---"- Табулирование функции асимптоты ----"--} х:= xStart;
h:= (xEnd-xStart)/(n-l);
for i: =1 to n do begin
y[i]:=f2(x);
x: = x+h;
end;
{-.-„ Определяем первую точку графика асимптоты --"} {"------ помещаем в нее текущий указатель "--"--}
xPos:= 0;
yPos: = GetMaxY-Trunc ((у [ 1] -yMin) / (yMax-yMin) * GetMaxY);
MoveTo(xPos, yPos);
{ Для последней точки асимптоты определяем координаты} {-.-------.----- и соединяем их прямой -"---"-----}
SetLineStyle(CenterLn, 0, NonnWidth);
SetColor(White);
xPos:=GetMaxX;
yPos: = GetMaxY-Trunc ((y[n] -yMin) / (yMax-yMin) * GetMaxY);
LineTo(xPos, yPos); \
repeat until KeyPressed;
CloseGraph;
end.
В приведенной программе число точек установлено равным 640, начальное и конечное значения аргумента задаются константами xStart = -5 и xEnd = 5. В программе организована подпрограмма — функция с именем Р2 для расчета значений асимптоты. Формирование асимптоты не отличается от формирования графика и снабжено необходимыми комментариями.
Для построения графиков других функций достаточно записать выражение исследуемой функции в процедуре F, задать число точек N, а также начальное (xStart) и конечное (xEnd) значения интервала изменения аргумента.
Рассмотрим применение графического режима при построении графика функции
fl, если х = 0;
У=\. 9/9
[smx'/x-^ если х>0.
Интервал изменения аргумента Х в диапазоне от 0 до 5, число точек в строке N= 100.
program Graphics;
uses Crt, Graph;
const n=100; < Количество точек }
xStart = 0; < Начальное значение аргумента) xEnd=5; { Конечное значение аргумента }
var xPos: integer; { Позиция по горизонтали) yPos: integer; { Позиция по вертикали } х: real; { Аргумент } у: array [I,.n] of real; { Массив значений
функции }
h: real; { Шаг изменения аргумента } yMin: real; { Наименьшее значение) уМах: real; { Наибольшее значение } i., j: integer;
Gd: integer; { Графический драйвер } On: integer; { Графический режим }
function f(x: real): real;
Begin
if x = 0 then
f:=1 else
f:= Sin(Sqr(x)) /Sqr(x);
end; { f }
begin < Табулирование функций } x:= xStart;
h:= (xEnd-xStart) / (n-1);
for i: = 1 to n do begin *-—' y[i]:==f(x);
x:=x+h;
end;
{- Определение наибольшего и наименьшего значений -} уМах:=у[1];
yMin:= у [1];
for i:= 1 to n do begin if ylil >yMax then yMax:=y[i];
if yli] <yMin then yMin:=y[il;
end;
^------- Устанавливаем графический режим ------")
Gd г = Detect;
3,nitGraph(Gd, Gm, 'C:\TP70\BGI');
(--------.------- Выводил заголовок "------""-.-.-}
SetTextStyle(DefaultFont, HorizDir, 3);
SetTextJustifyfCenterText, TopText);
OutTextXY(GetMaxX div 2; 0, 1 График функции');
{-..--.---.-.-„„„.--... Проводим oci» Х -""--"""-----} SetTextStyle(OefaultFont, HorizDir, 2);
yPos: = Trunc (GetMaxY+yMin/ (yMax-yMin) *GetMaxY);
Line(0, yPos, GetMaxX, yPos);
OutTextXY(GetMaxX-10, yPos-20, 'X');
SetLineStyle(CenterLn, 0, NormWidth);
SetColor(Magenta);
{„--- --.„- Выводим горизонтальную сетку -"-------}
for i:== -10 to 10 do begin
yPos: s= GetMaxY-Trunc ((i/10-yMin) / (yMax-yMin) * GetMaxY);
Line(0, yPos, GetMaxX, yPos);
end;
{---.--.,----- Выводим вертикальную сетку ----""---} for i:= 0 to 5 do begin xPos: = Trunc (GetMaxX/5 *i);
Line(xPos, 0, xPos, GetMaxY);
end;
{"- Определяем первую точку графика и помещаем ---} {-.-------.----- в нее текущий указатель -------------}
xPos:== 0;
yPos: = GetMaxY-Trunc ((y[l] -yMin) / (yMax-yMin) * GetMaxY);
MoveTo(xPos, yPos);
{-- Для остальных точек определяем точки графика --} {-----"--- и соединяем их отрезками прямой ---------}
<^ SetLineStyle(SolidLn, 0, ThickWidth);
— SetColor(Yellow);
for i:?=2 to n do begin
xPos: = Trunc (GetMaxX/(n-l)*(i-l));
yPos: =GetMaxY-Trunc ((y[ij -yMin) / (yMax-yMin) * GetMaxY);
LineTo(xPos, yPos); / Delay(lOO);
end;
repeat until KeyPressed;
CloseGraph;
end.
| При исследовании графика можно выделить отдельные облас-|ти и просмотреть его поведение, задавая различные параметры. |Например, чтобы изменить масштаб представления графика, достаточно изменить в программе значение xStart с 0 на -10 и xEnd |с 5 на 10. Если сравнить приведенные программы, можно сде-|латъ вывод, что они позволяют с минимальными изменениями в ^программе вводить новые функции и параметры, расширяющие ^возможности при их исследовании.