/* Programa    raizes011.c
   Assunto:		Estudo das raizes de uma função definida no programa.
   
	Condicionantes:
	Programa sem erros, ver raizes012.c com mudança de variável
	Para compilar
			gcc -Wall -oprog raizes011.c
	cria o executável  prog  que você pode rodar na linha de comandos
	em Linux.		
         
	Descrição:	Varre um intervalo com uma malha dada 
		procurando quando f troca 	de sinal.
		Lendo os comentários você pode alterar o programa com segurança
		
	Altere (0) logo abaixo para refletir a posição das bibliotecas
		na sua árvore de diretórios.	

	Palavras-chave:	troca de sinal, raiz, varredura             
	por Tarcisio Praciano Pereira - 10 lições para aprender C
	Sobral, Agosto de 2003   - UVA
*/
                  

#include <stdio.h>
#include <math.h>
#include "traducao.h" // (0) Altere aqui
#include "ambiente.h" // (0) Altere aqui

real	absol(real x);
real	f(real	x);


inteira	principal()
{
	real	a=-5,b=5,delta=0.1; // (10) valor default
	real	epsilon=0.1;
	int	teste=1; // caso nao encontre raizes, teste=1
	imprima("Forneça-me o intervalo [a,b] para busca de raizes: \n");
	a = entrada_float("a = ", a); // definida em ambiente.h
	b = entrada_float("b = ", b); // definida em ambiente.h
	imprima("Forneça-me o passo  delta da malha para a  busca:\n");
	imprima("Sugestão  0.01 <  delta   <  0.5  \n");
	delta = entrada_float("delta  = ", delta);
	imprima("Forneça-me o erro epsilon (módulo máximo) :\n");
	imprima("Sugestão  0.01 <  epsilon    <  0.5  \n");	
	epsilon = entrada_float("epsilon   = ", epsilon);	
	imprima("Sua busca de raízes no intervalo [%f , %f] \n ",a,b);	
	imprima("Precisão da malha: %f \n ", delta);		
	imprima("Erro  (módulo máximo): %f \n ", epsilon);	
	apeteco2();  // definida em ambiente.h
	enquanto ( a <= b)
	{
		// imprima(" x = %f %f \n ", a, f(a)); 
		// (30) procura troca de sinal e tamanho
		se ( (f(a)*f(a+delta)<=0) || (fabs(f(a)) < epsilon)  )
			{
			teste = 0; // (40) se achar raiz  teste = 0 
			imprima("Raíz provável da função no intervalo \n");
			imprima("%s%f%s%f%s \n","[", a, ",", a+delta,"]");
			imprima("valor de f no ponto %f  é %f  \n",a,f(a));
			imprima("valor de f no ponto %f  é %f  \n",a+delta,f(a+delta));
			}
		a = a + delta; 	
	}
	se (teste)
		{
		imprima("Nenhuma raíz foi encontrada no intervalo dado !\n");
		imprima("Rode, novamente, o programa, com passo mais fino...\n");
		}
 	voltar(0);
}

// há várias equações, para escolher uma, apague o comentário //
real	f(real	x)
{
	voltar(-(x+3)*(x+3)*(x-2) ); // (50)
	// voltar( x*x*x*x*x + x*x*x*x + x*x*x + x*x + x + 1);  // (50)
	// voltar(x*x);    // (50) escolha somente um voltar()
	// voltar(x); // (50) 
}

/*
	Comentários:  

(10) Os dados do programa podem ser aceitos apenas dando enter quando
	for feita pergunta sobre valores a fornecer. Rode o programa
	apenas dando enter na primeira vez.

(30) Há dois testes - troca de sinal  e módulo máximo 
		experimente apagar o módulo máximo, deixando 
		apenas
		se ( (f(a)*f(a+delta)<=0)  )
		copie o texto acima e coloque em lugar de se() em (30),
		mas não apague porque você vai precisar deste programa
		ainda. Torne um comentário aquilo que você apagaria
		usando o símbolo  //  
	
(40)  teste = 0  evita que seja escrita a mensagem informando
	que nenhuma raiz foi encontrada.
	
(50)	em uma função somente um voltar()  deve ser
	executado. em f() há vários, todos desligados, menos um que
	é o que está em vigor. Troque pela equação desejada ou
	escolha outra equação.




*/
