uses Crt, Graph;
const
 w=0.00001;
 d=0.0001;
var
 a,b,x,lo,hi : real;
 gdriver,gmode : integer;
 dx,dy : Longint;
 as,bs,xs : string;
{----------------------------------------------------------------------------}
function f(x : real): real; forward;
function max(a,b : real): real; forward;
{----------------------------------------------------------------------------}
{$i svga256.inc}
{$F+}
function DetectVGA256 : Integer;
 var
  Vid : Integer;
 begin
  Writeln('Which video mode would you like to use?');
  Writeln('  1) 800x600x256');
  Writeln('  2) 1024x768x256');
  ReadLn(Vid);
  if Vid in[1..2] then DetectVGA256:=Vid+2
  else begin WriteLn('Ну и нате!'); Vid:=4; end;
 end;
{ $L svgadrv.obj }
{--------------------------------------------------------------------------}
procedure scale(a,b : real);
 begin
  SetColor(GREEN);
  dy:=Round(GetMaxY/abs(f(a)-f(b)));
  dx:=Round(GetMaxX/abs(a-b));
  Line(0,GetMaxY+Round(f(max(a,b))*dy),GetMaxX,GetMaxY+Round(f(max(a,b))*dy));
  str(a:0:2,as); str(b:0:2,bs);
  OutTextXY(10,GetMaxY+Round(f(max(a,b))*dy-10),as);
  OutTextXY(GetMaxX-50,GetMaxY+Round(f(max(a,b))*dy)-10,bs);
 end;
{---------------------------------------------------------------------------}
function f(x : real): real;
 begin
  f:=-x*x*x*x-2*x*x*x+x{x-3}{x*x*x*x+2*x*x*x-x-1}             ;
 end;
{---------------------------------------------------------------------------}
function max(a,b : real): real;
 begin
  if f(a)>f(b) then max:=b else max:=a;
 end;
{---------------------------------------------------------------------------}

begin
 WriteLn('Введите интервал (функция должна быть монотонна на нем)');
 Read(a,b);
 if (f(a)*f(b))>0 then begin WriteLn('Здесь корней нет! (или функция не монотонна)'); ReadLn; exit; end;
 if a>b then begin x:=a; a:=b; b:=x; end;
 gdriver:=InstallUserDriver('SVGA256',@DetectVGA256);
 gdriver:=Detect;
 InitGraph(gdriver,gmode,'');
 scale(a,b);
 x:=a;
 while x<=b do
 begin
  PutPixel(Round((x-a)*dx),GetMaxY-Round((f(x)-f(max(a,b)))*dy),YELLOW);
  x:=x+d;
 end;
 lo:=a; hi:=b;
 SetColor(RED);
 repeat
  delay(1000);
  x:=(hi+lo)/2;
  if f(x)*f(lo)>0 then lo:=x else hi:=x;
  if keypressed then begin ReadKey; break; end;
  circle(Round((x-a)*dx),GetMaxY-Round((f(x)-f(max(a,b)))*dy),3);
  {str(x:0:3,xs);
  OutTextXY(Round((x-a)*dx)-50,GetMaxY-Round((f(x)-f(max(a,b)))*dy)-10,xs);}
 until (f(x)<0+w) and (f(x)>0-w);
 str(x:0:3,xs);
 OutTextXY(Round((x-a)*dx)-50,GetMaxY-Round((f(x)-f(max(a,b)))*dy)-10,xs);
 ReadLn;
 CloseGraph;
 WriteLn(x :0:4,' - корень функции на интервале ',a:0:4,' : ',b:0:4);
 ReadLn;
end.