-----------------------------------------------------------------------------
 MAC-115 - Aula sobre funções e variáveis do tipo double (para números reais) 
=============================================================================

/* 
 * arquivo: exp_f.c
 * ----------------
 * Dado numero real x, este programa calcula exp(x) 
 * atraves da soma dos termos da serie
 *
 * 1 + x + x^2/2! + x^3/3! + ...
 *
 * A soma e' feita ate' que a soma de um termo nao faca mais
 * diferenca.  Isto e', ate que somar novos termos fique
 * "indiferente".
 */

#include <stdio.h>
#include <math.h>

/************************************************************/

/* meu_exp(): estima exp(x) pela soma da serie acima */
double meu_exp(double x);

/************************************************************/

int main()
{
  double x;

  printf("Forneca o valor de x: ");
  scanf("%lf", &x);

  printf("exp(%g) = %.20g [nossa serie]\n", x, meu_exp(x));
  printf("exp(%g) = %.20g [biblioteca math]\n", x, exp(x));
  return 0;
}

/************************************************************/

double meu_exp(double x)
{
  int i;
  double s = 1.0, t = 1.0, tmp;

  for (i = 1;; i++) { 
    t = t * x / i;
    tmp = s + t;
    if (s == tmp)
      break;
    s = tmp;
  }

  return s;
}

============================================================================

/* 
 * arquivo: exp2_func.c
 * ----------------------
 * Dado x e epsilon (reais) e n, um inteiro, este programa calcula
 * exp(x) atraves da soma dos termos da serie 
 *
 * 1 + x + x^2/2! + x^3/3! + ...
 *
 * ate o valor absoluto do termo se tornar <= epsilon.
 */

#include <stdio.h>
#include <math.h>


double exp2 (double x, double epsilon); /* prototipo da funcao exp2 */


int main()
{
   double x, epsilon;

  printf("Forneca o valor de x: ");
  scanf("%lf", &x);

  printf("Forneca o valor de epsilon: ");
  scanf("%lf", & epsilon);
 
  printf("exp(%g) = %.20g [usando a serie]\n", x, exp2(x, epsilon)); 
  printf("exp(%g) = %.20g [biblioteca math]\n", x, exp(x));

  return 0;
}

/* Funcao:  double exp2 (double x, double epsilon)
 *
 * Esta funcao calcula exp(x) atraves da serie 
 *
 * 1 + x + x^2/2! + x^3/3! + ...
 *
 * ate o valor absoluto do termo se tornar <= epsilon.
 * A funcao devolve a soma aproximada obtida quando encontra um
 * tal termo.
 */

double exp2 (double x, double epsilon)
{
  int i;
  double soma = 1.0, termo = 1.0;

  i = 1;
  while (termo > epsilon || termo < -epsilon) { /*  |termo| > epsilon  */
    termo =  termo * x / i;
    soma = soma + termo;
    i++;
  }
  return soma;
}


/* OBS: No lugar de 
 * 
 *  while (termo > epsilon || termo < -epsilon)
 * 
 *  poderiamos usar a funcao fabs (floating abolute value): 
 * 
 *  while (fabs(termo) > epsilon)
 */ 

 ========================================================================

/* 
 * arquivo: explog.c
 * ------------------
 * Dado numero real x (|x| < 1), este programa calcula
 * exp(log(1-x)). Para isso, definimos uma funcao chamada
 * meu_exp(x) que calcula o valor aproximado de exp(x) atraves da 
 * serie:
 *
 * 1 + x + x^2/2! + x^3/3! + ...
 *
 * A soma e' feita ate que a soma de um termo nao faca mais
 * diferenca.  Isto 'e, ate que somar novos termos fique
 * "indiferente".
 *
 * Para o calculo da funcao log(.) usamos a funcao de biblioteca log(.).
 * Para comparar, fazemos o calculo usando meu_exp(.) e  a funcao exp(.) 
 * ja existente na biblioteca de funcoes.
 *  
 * OBS: Para usar funcoes da biblioteca matematica, 
 * fazemos  #include <math.h>
 */

#include <stdio.h>
#include <math.h>

/************************************************************/

/* meu_exp(): estima exp(x) */
double meu_exp(double x);

/* f(): estima f(x) = log(1 - x) */
double f(double x);

/************************************************************/

int main()
{
  double x;

  printf("Forneca o valor de x (|x| < 1): ");
  scanf("%lf", &x);

  printf("exp(log(1 - %g)) = exp(log(%g)) = %.20g [nossa serie]\n",
	 x, 1-x, meu_exp(f(x)));
  printf("exp(log(1 - %g)) = exp(log(%g)) = %.20g [biblioteca math]\n",
	 x, 1-x, exp(log(1 - x)));
  return 0;
}

/************************************************************/

double meu_exp(double x)
{
  int i;
  double s = 1.0, t = 1.0, tmp;

  for (i = 1;; i++) { 
    t = t * x / i;
    tmp = s + t;
    if (s == tmp)
      break;
    s = tmp;
  }

  return s;
}

double f(double x)
{
  int i;
  double s = 0.0, tmp, pot_x=1;

  for (i = 1;; i++) {
    pot_x = pot_x *  x;
    tmp = s - pot_x/i;
    if (s == tmp)
      break;
    s = tmp;
  }

  return s;
}

===========================================================================

/*
 * arquivo: SomaDePrimos.c
 *
 * Este programa recebe um número inteiro m, e verifica 
 * se m = p + q onde p e q sao primos. 
 * 
 * Usar uma funcao que verifica se um  dado numero é primo; esta funcao deve 
 * devolver 1 se o número é primo,  e devolver 0 se o número nao é primo.
 */

#include <stdio.h>

int primo (int n);

int main()
{
  int m, p, sim = 0;
  
  printf("De o valor de m:  " );
  scanf ("%d", &m);
  p = 2;
  while (p <= m/2){
    if (primo (p))
      if (primo(m-p)) {
        printf("sim, %d = %d + %d\n", m, p, m-p);
        sim = 1;
      }
  p = p +1;
  }
  if (!sim)  printf(" %d nao e'soma de dois primos\n", m);
   return 0;

}

int primo (int n)
{ 
  int d, OK, resto;
  d = 2;
  OK = 1;
  if (n == 1) OK = 0;
  while (OK  && d  <=  n/2)
    { resto = n % d;
     if (resto == 0) OK = 0;
     d = d + 1;
     }
  return (OK);
} 

===================================================================