/* Programa    raizes01.c
   Assunto:		Estudo das raízes de uma função definida no programa.
   
	Condicionantes:
	Programa sem erros
	
	Compile com 
		gcc -Wall -oprog raizes01.c         
	este modo de compilação cria o executável "prog" que você pode
	rodar digitando "prog" numa área de trabalho.
	
	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. Se o compilador
	não entender o programa, muito possivelmente será porque não
encontrou traducao.h  e ambiente.h  Altere em (0).
                     
	Palavras-chave:	raiz, varredura, módulo máximo
	
	por Tarcisio Praciano Pereira - 10 lições para aprender C
	Sobral, Agosto de 2003   - UeVA
*/
                  

#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=-3.2,b=3,delta=0.3; // (10) valor default
	real	epsilon=0.3;
	int	teste=0; // (20) caso nao encontre raizes, teste=1
	limpa_janela();
	printf("Quer ler a informação inicial - padrão é não \n");
	teste=sim_nao();
	if (teste) informacao(); teste=1; // preciso que teste seja 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));
		// testa o módulo máximo
		se ( (fabs(f(a)) < epsilon)  )
			{
			teste = 0;  // (20)  anula teste se encontrar raízes
			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");
		apeteco2();limpa_janela();
		}
	apeteco2();limpa_janela();
 	voltar(0);
}

real	f(real	x)
{
	// (40) voltar  x*x*x*x*x - x*x*x*x - x*x*x - x*x - 3*x -10; 
	// (40) voltar  x*x*x*x*x + x*x*x*x + x*x*x + x*x + x + 1; 
	// (40) voltar x*x;
	voltar x;
}

/*

	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.

(20)  teste = 0  evita que seja escrita a mensagem informando
	que nenhuma raiz foi encontrada.
	
(40)	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.






*/
