/* Programa    riemann.cc  
	Assunto: somas de Riemann
	Condicionantes:  Compile com
		g++ -Wall -oprog   riemann.cc
	Programa sem erros

	Descrição: cálculo de integrais aprox por somas de Riemann 

	palavras chave: Riemann, integral, varredura
   por Tarcisio Praciano Pereira -  C para matemáticos

   Sobral, Abril de 2008 - UeVA    	      		
*/


# include <iostream>
// # include "Ambiente.h" // Biblioteca particular: comunicacao com usuÃ¡rio
# include <math.h>
# include "raizes.h"   // para usar escreve_intervalo()
using namespace std; // a evitar - polui o espaÃ§o de nomes  // a evitar - polui o espaÃ§o de nomes    // a evitar - polue o espaÃ§o de nomes


//Ambiente Tela;  // Uma instÃ¢ncia de Ambiente - herda seus mÃ©todos
int	rotulo();
int	final();
void	informa();
void  seleciona_executa();
float Riemann(float inicio, float fim, float delta);
float Valor_medio(float inicio, float fim, float delta);


int main()
{
	Tela.mask(); // Tela herdou este método  definido em Ambiente
	rotulo();
   seleciona_executa();
	Tela.apetecof();	Tela.limpa_janela();
	final();
	return(0);		
}

int rotulo()
{
	int	resposta=0;
	Tela.limpa_janela(); 
   cout  << "Este programa calcula integrais usando soma de Riemann  \n" 
         <<  endl;
	cout << "Voce deseja ler uma informação sobre o programa ? \n"
	   << "A resposta padrao para esta pergunta é \"n\" - não - dê <enter>.\n";
	resposta = Tela.sim_nao();
	if (resposta) informa();
	cout << "O programa pode calcular a integral de f em um intervalo de sua escolha" << endl
	    << "ou o valor médio neste intervalo. Você vai poder agora selecionar o que" << endl
	    << "deseja, a  " << endl
	    << "         (1) a integral ou   ( opção padrão, dê enter) " << endl
	    << "         (2) o valor médio." << endl
	    << "De <enter> a todas as perguntas para calcular a integral " << endl
	    << "no intervalo [-3,3]  -  ou forneca os valores que desejar. " << endl;
	Tela.apeteco2(); Tela.limpa_janela();        
	return(0);
}

 
 
int   final()
{
	 bool  resposta=0;
	 Tela.limpa_janela();
	 cout  << "A resposta padrão para esta pergunta é \"não\" bastando que\n"
	 << "você acione o <enter> \n"
	 << "Deseja ler a noticia sobre os direitos autorais ? <s,n> \n";
	 resposta = Tela.sim_nao();
	 if (resposta)
	 {
	 Tela.copyleft();  Tela.obrigado();  Tela.apetecof();Tela.limpa_janela();
	 }
	 else
	 {
	 Tela.obrigado();Tela.apetecof();Tela.limpa_janela();
	 }
	 return(0);
}
 
void	informa()
{
  cout << "Este programa calcula aproximadamente a integral de uma função \n"
     << "definida no programa. Edite a equação," << endl
     << "                          procure  f() " << endl 
     << "para calcular outras integrais do seu interesse. \n"  
     << "O programa tem valores padrão que você pode usar simples-\n"
     << "mente dando <enter> em todas as perguntas. Este é um bom meio de ver\n"
     << "como o programa funciona, um primeiro exemplo. \n";
  Tela.apeteco2();
  cout << "O programa calcula integrais usando somas de Riemann uniformes, quer \n"
     << "dizer que o passo na particao eh sempre o mesmo, ou que os subinter-\n"
     << "valos tem todos a mesma medida:  (b-a)/n  \n"
     << "Para obter mais precisao, de um valor maior para n  - mas observe \n"
     << "que a demora serah maior no calculo com grandes valores de n. \n"
     << "Experimentando voce vai ver que a partir de um certo ponto voce terah\n"
     << "atingido a precisao maxima do programa.  \n";
  Tela.apeteco2();
  cout << "O programa também pode calcular valor médio. Observe que o valor médio" << endl
   << "  de um função depende do intervalo escolhido. Faça experimentos trocando" << endl
   << "  a função e alterando o intervalo para melhor entender o significado do" << endl
   << "  valor valor médio integral. Numa futura versão do programa, talvez eu" << endl
   << "  faça isto em aula, vou fazer o programa mostrar o gráfico de f e do" << endl
   << "  seu valor médio. " << endl;
   Tela.apeteco2();
   cout << "Este programa foi feito com o gcc em ambiente Debian/Gnu/Linux \n"
     << "sendo distribuido sob GPL. \n"
     << "Autor: prof. Tarcisio Praciano-Pereira - Computação - UeVA  \n"
     << "Sobral - Ceara - tarcisio@member.ams.org \n";
  Tela.apeteco2(); Tela.limpa_janela();
}
 
 
void seleciona_executa()
{
	float	inicio=-3, fim=3, delta; // extremos do intervalo de integração
	int	n = 100000;  int opcao=1;  // opção padrão, calcular a integral
   cout << "	Selecione sua opção, " << endl
   << "	      (1) cálculo da integral da função" << endl
   << "	      (2) cálculo do valor médio da função" << endl
   << "   em seguida você vai poder selecionar os extremos do intervalo e a" << endl
   << "   precisão do cálculo." << endl
   << "   Sua escolha:" << endl
   << "	      (1) cálculo da integral da função" << endl
   << "	      (2) cálculo do valor médio da função   " << endl;
   opcao = Tela.entrada_int(" (1) integral   (2) valor médio  - opcao = ",
             opcao);
	cout << "Intervalo [a,b] onde o cálculo integral/valor médio  vai ser feito \n";
	inicio 	= 	Tela.entrada_float(" a = ", inicio);
	fim 		= 	Tela.entrada_float(" b = ", fim);
	cout << "Precisao no calculo - número de nós na partição \n"
	      << "você deve fornecer um número inteiro  1000 < n < 1.000.000"
	      << endl;
	n 	= 	Tela.entrada_int(" 1000 <  n < 1.000.000 -->  n  = ", n); 
	delta = (fim-inicio)/n;  // calcula delta
   switch(opcao)
   {
     case 1:
          cout << "O valor aproximado da integral  no intervalo \n";
                 escreve_intervalo(inicio, fim); // definida em raizes.h
          cout << " é " 
         	  << Riemann(inicio,fim,delta) << endl;
         break;
     case 2:
         cout << "O valor médio da função no intervalo ";
                 escreve_intervalo(inicio, fim); // definida em raizes.h
         cout << " é "       
         	  << Valor_medio(inicio,fim,delta) << endl;
         break;
   }    
}


// usa regra do trapésio
float Riemann(float inicio, float fim, float delta)
{
        float soma=0,x=inicio;
        while (x < fim)
                {
                        soma = soma + f(x)+f(x+delta);
                        x = x + delta;
                }
        return (0.5*soma*delta);
}

// usa regra do trapésio
float Valor_medio(float inicio, float fim, float delta)
{
        float soma=0,x=inicio;
        while (x < fim)
                {
                        soma = soma + f(x)+f(x+delta);
                        x = x + delta;
                }
        return ( (0.5*soma*delta)/(fim-inicio) ) ;
}

