``````program ghraph_adder;

{Required BGI drivers.  Specify path in procedure INIT.}
{ make sure you set the path below !!! }

uses
graph;

const
Xmax = 20;               {These constants describe the screen area}
Xmin = -10;
Ymax = 20;
Ymin = -10;
Rx = Xmax - Xmin;
Ry = Ymax - Ymin;
Scale = 1;               {How often scaling marks are placed}

function abs(x:real):real;
{Returns the absolute value of X}
begin
if x < 0 then
abs:= -x
else
abs:= x;
end;

function power(b:real; p:integer):real;
{Returns B to the P power}
begin
if p = 1 then
power:= b
else
power:= b * power(b, p-1);
end;

{THESE ARE THE FUNCTIONS. ALL OPERATION WILL BE PREFORMED OF F(X) BY G(X).}
{Change these as you like.  These are the functions actualy graphed.}

function f(x:real):real;
begin
f:= (0.6 * x +0.5) / (x - 2);
end;

function g(x:real):real;
begin
g:= abs(x)+3;
end;

{**************************************************************************}

procedure init;
{Slaps you in to High-Res (hopefully) graphics mode}
var
mode:integer;
driver:integer;
ErrCode:integer;
begin
driver:= detect;
initgraph(driver, mode, '\turbo\tp\');{The path here MUST point to your BGI drivers.}
ErrCode := GraphResult;
if ErrCode <> grOk then
begin
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
halt(1);
end;
end;

procedure coordinates(x, y:real; var sx, sy:integer; var OnScreen:boolean);
{This is the slick procedure that makes it all work.  Pass in your X and Y
coordinates and these two equations will find the screen position and
return that in SX and SY.  OnScreen is TRUE if the coordinates passed in
are on the screen, else FALSE.}
begin
sx:= round((getmaxx / Rx) * x + ((-getmaxx/Rx) * Xmax + getmaxx));
sy:= round((-getmaxy / Ry) * y + ((getmaxy/Ry) * Ymin + getmaxy));
onscreen:= not ((sx < 0) or (sy < 0) or (sx > getmaxx) or (sy > getmaxy));
end;

procedure draw_grid;
{Plots XY axis}
var
x, y,
sx, sy:integer;
success:boolean;
begin
coordinates(Xmin, 0, x, y, success);
coordinates(Xmax, 0, sx, sy, success);
setcolor(15);
line(x, y, sx, sy);
coordinates(0, Ymax, x, y, success);
coordinates(0, Ymin, sx, sy, success);
line(x, y, sx, sy);
for x:= trunc(Xmin) to trunc(Xmax) do
if x / scale = x div scale then
begin
coordinates(x, 0, sx, sy, success);
line(sx, sy-5, sx, sy+5);
end;
for y:= trunc(Ymin) to trunc(Ymax) do
if y / scale = y div scale then
begin
coordinates(0, y, sx, sy, success);
line(sx-5, sy, sx+5, sy);
end;
end;

procedure drawgraphs;
var
x, y, c:real;
sx, sy:integer;
OnScreen:boolean;
begin
x:= Xmin;  {Graph of F(X) in blue}
setcolor(9);
coordinates(x, f(x), sx, sy, onscreen);
moveto(sx, sy);
repeat
x:= x + (Rx / getmaxx);
coordinates(x, f(x), sx, sy, onscreen);
lineto(sx, sy);
until sx >= getmaxx;

x:= Xmin;    {Graph of G(X) in red}
setcolor(12);
coordinates(x, g(x), sx, sy, onscreen);
moveto(sx, sy);
repeat
x:= x + (Rx / getmaxx);
coordinates(x, g(x), sx, sy, onscreen);
lineto(sx, sy);
until sx >= getmaxx;

{This next grapher is just to show off.  It graphs then sum of F(X) and
G(X).}
x:= Xmin;    {Graph of F(X) + G(X) in yellow}
setcolor(14);
coordinates(x, f(x) + g(x), sx, sy, onscreen);
moveto(sx, sy);
repeat
x:= x + (Rx / getmaxx);
coordinates(x, f(x) + g(x), sx, sy, onscreen);
lineto(sx, sy);
until sx >= getmaxx;
end;

begin
init;
draw_grid;
drawgraphs;