-----------------------------------------------------------------------------
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);
}
===================================================================