program raizes_secante;

Var
	a, b,delta : real;
	epsilon, raiz : real;
	teste : integer; 

function f(x : real): real;
Begin
	{f:= x*x*x*x*x - 20*x*x - x + 15;}
   {return((x*x*x*x*x - 20*x*x - x + 15)*sin((x+3)/5.0));}
   f := (x*x*x*x*x - 20*x*x - x + 15)*sin((x+3)/5.0);
End;

function raiz_secante(a,b: real; teto : integer):real;
Var 
	x, m : real;
	epsilon: real;
Begin
	m := (f(b) - f(a))/(b-a);
	epsilon := 0.001;
	x := a - f(a)/m;
	while( (abs(f(x)) > epsilon ) and (teto > 0) ) do
	Begin
		if ( f(a)*f(x) < 0)  {se trocar de sinal em [a,x]}
		then
		Begin
			m := (f(x) - f(a))/(x-a);
			x :=  a - f(a)/m;  {novo valor para raiz}
			Writeln("....");
		End
		else   { se trocar de sinal em  [x, b] }
		Begin
		        m := (f(x) - f(b))/(x-b);
		        x := b - f(b)/m;   {novo valor para raiz}
		        Writeln("..  ..");
		End;
	End;
	teto := teto - 1; {desconta número de iterações}	
raiz_secante := x;
End;

function entrada_float(msg : string; x : real) : real;
Begin
	Write(msg);readln(x);
   entrada_float := x;
End;
    
    


Begin
	Var teto, n : integer;
	a:=-5;b:=5;delta:=0.1; 
	epsilon:=0.1;
	teste:=0; // caso nao encontre raizes, teste=1
	Writeln("Forneça-me o intervalo [a,b] para busca de raizes: ");
	a := entrada_float('a = ', a);
	b := entrada_float('b = ', b);	
	Writeln("Forneca-me o passo  delta da malha para a  busca: ");
	Writeln("Sugestão  0.01 <  delta   <  0.5  ");
	delta := entrada_float('delta = ', delta);
	Writeln("Forneca-me o erro epsilon (modulo maximo) : ");
	Writeln("Sugestão  0.01 <  epsilon    <  0.5  ");	
	epsilon := entrada_float('epsilon = ', epsilon);
	Write('O número de iterações em cada busca de raizes  n = ');Read(teto);
	Writeln("Sua busca de raizes no intervalo [",a,",",b,"]");	
	Writeln("Precisao da malha:  ", delta);		
	Writeln("Erro  (modulo maximo):  ", epsilon);
	Write('Com ', teto, ' iterações permitidas ');	
	n := teto; {protege a variável local teto}
	Writeln("Aperte enter para continuar "); 	readln;
	while( a <= b) do
	Begin
	if (  f(a)*f(a+delta)<=0  ) then
		if ( f(a) = 0 ) then
		Begin
		   Writeln("Uma raiz exata ", a);
		   a := a + delta; // salto extra
		   teste := teste + 1; // conta raízes
		End
		else if ( f(a+delta) = 0 )then
		     Begin
		     Writeln("Uma raiz exata ", a+delta);
		     a := a + delta; // salto extra
		     teste := teste + 1; // conta raízes
		     End
		     else
		     Begin
		     Writeln("Troca de sinal da funcao no intervalo ");
		     Writeln("[",a:4:3,",", a+delta:4:4,"]");
		     raiz :=  raiz_secante(a,a+delta, n);{ n em vez de teto}
		     Write("Raiz p/ metodo da  secante ", raiz:0:4);
		     Writeln('  f(',raiz:0:4,') =  ', f(raiz):0:4);
		     a := a + delta;  // salto extra
		     teste := teste + 1; // conta raízes
		     End;
		a := a + delta;
	End;
	if (teste = 0) then
		Begin
		Writeln("Nenhuma raiz foi encontrada no intervalo dado !\n");
		Writeln("Rode, novamente, o programa, com passo mais fino...\n");
		End;
	if (teste = 1) then
		Writeln("Achei uma raíz ")
	else   	Writeln("Achei ",teste," intervalos onde ha raiz ");
End.



