Код:
Uses Graph,Crt; {Print – только при наличии принтера для печати графика с экрана на бумагу }
Var
X,Y, { текущие значения переменных Х и Y }
Xmin,Xmax,{минимальное и максимальное значения Х на графике}
Ymin,Ymax,{минимальное и максимальное значения Y на графике}
DeltaX,DeltaY,{диапазоны изменения X и Y в пределах рисунка}
Dx, { шаг построения графика по Х }
Dxs,Dys, { Шаги разметки осей по Х и по Y }
Part,Pole, { Доля экрана, занятая рисунком и доля чистого поля с каждой стороны }
Mx,My {Коэффициенты пересчета Х в J и Y в I}
: real;
Imin,Imax, {координаты экрана, соответствующие Ymin и Ymax}
Jmin,Jmax, {координаты экрана, соответствующие Xmin и Xmax}
J,I, {текущие значения переменных координат экрана }
JAll,IAll, {Максимальные размеры экрана (в пикселях) по X,Y}
J0,I0, {Координаты на экране точки пересечения осей графика}
DeltaJ,DeltaI,{Экранные размеры рисунка по Х и Y в пикселях}
Nx,Ny {Шаги разметки осей Х и Y в пикселях }
: integer;
Riska : String[5]; {Строка для вывода чисел у рисок осей}
GraphDrv, {Тип графического драйвера }
GraphMode: integer; {Устанавливаемый графический режим} Code: word; {Код завершения инициализации графики }
BEGIN { Начало программы }
{1.Задание констант, стандартных значений }
Xmin:=-4.2; Xmax:=1.0;
Dxs:=0.5; Dys:=1.0;
Part:=0.6; Dx:=0.2;
{2.Ввод исходных данных - в примере не используем}
{3.Печать исходных данных - в примере не используем}
{4.Расчет характеристик функций }
DeltaX:=Xmax-Xmin;
Ymin:=(1.5*Xmin+3)/(Xmin-2);
Ymax:=(1.5*Xmax+3)/(Xmax-2);
if Ymin>0 then Ymin:=0;
if Ymax<0 then Ymax:=0;
DeltaX:=Xmax-Xmin;
DeltaY:=Ymax-Ymin;
{5.Открытие графики с проверкой правильности срабатыва-ния}
GraphDrv:=0; {пусть определяет режим сам }
InitGraph(GraphDrv,GraphMode,'D:\TP6\BGI');
Code:=GraphResult;
if Code<>0 then {если завершение с кодом не 0 - закон-чить программу}
Begin
writeln('Ошибка открытия графики с кодом: ',Code);
Halt; { Останов программы }
End;
{6.Настройка фона}
SetBkColor(13); {Фон розовый }
ClearDevice; {Очистка экрана}
{7.Расчет параметров графика на экране}
JAll:=GetMaxX;
IAll:=GetMaxY;
Pole:=(1.0-Part)/2.0;
Jmin:=Round(Pole*JAll);
Jmax:=Round((1.0-Pole)*JAll);
Imin:=Round((1.0-Pole)*IAll); Imax:=Round(Pole*IAll); { Imin > Imax !!! }
DeltaJ:=Jmax-Jmin;
DeltaI:=Imax-Imin;
{8.Расчет масштабных коэффициентов перехода от X к J и от Y к I}
Mx:=DeltaJ/DeltaX;
My:=DeltaI/DeltaY;
{9.Построение графика функции}
{9.1.Задание характеристик линии}
SetColor(3); { цвет голубой }
SetLineStyle(3,0,3); { штриховая толстая }
{9.2.Начальная точка графика}
Nx:=Round(Dxs*Mx);
Ny:=Round(Dys*My); { Шаг разметки по Y - отрицательный }
J:=Jmin;
I:= Imin+Round(((1.5*Xmin+3)/(Xmin-2)-Ymin)*My);
MoveTo (J,I);
{9.3.Цикл расчета экранных координат графика (X->J, X->Y->I) и проведения отрезков}
X:=0;
While X<=Xmax do
Begin
X:=X+Dx;
Y:=(1.5*X+3)/(X-2);
J:=Jmin+Round((X-Xmin)*Mx);
I:=Imin+Round((Y-Ymin)*My);
LineTo(J,I);
End;
{10.Построение осей 10.1.Задание характеристик линии }
SetColor(13); { цвет желтый }
SetLineStyle(0,0,3); { сплошная толстая }
{10.2.Построение осей }
J0:=Jmin+Round((0-Xmin)*Mx);
I0:=Imin+Round((0-Ymin)*My);
Line(J0,Imin,J0,Imax); {Построение оси Y (где X=0)}
Line(Jmin,I0,Jmax,I0); {Построение оси Х (где Y=0)}
{11.Разметка осей 11.1.Задание характеристик линии }
SetLineStyle(0,0,0); { сплошная тонкая }
{11.2.Характеристики шрифта для подписи значений }
SetTextStyle(0,0,0); { шрифт стандартный, подпись горизонтальна } SetTextJustify(1,2); {Размещение текста симметрично, относительно заданной точки по горизонтали и ниже точки по вертикали}
{11.3.Цикл проведения разметки оси X, риски вверх от оси, по 10 пикселов }
J:=J0; X:=0;
while J<=Jmax+1 do {от начала координат - вправо }
begin
Line(J,I0,J,I0-10);
Str(X:3:1,Riska);
OutTextXY(J,I0+5,Riska);
X:=X+Dxs;
J:=Jmin+Round((X-Xmin)*Mx);
end;
J:=J0;
X:=0;
while J>=Jmin do {от начала координат - влево }
begin
Line(J,I0,J,I0-10);
Str(X:3:1,Riska);
OutTextXY(J,I0+5,Riska);
X:=X-Dxs;
J:=J-Nx;
end;