Departamento de Ciência da
Computação - IME - USP
#include <stdio.h>
float f1(int *a, int b, int c)
{
float x;
*a = ((*a)*b+c)%10;
x = ((float)b+(*a)+1)/10;
return x;
}
int f2(int a, int b)
{
int c;
float x;
x = a;
c = (x+b)/10;
x = (x+b)/10;
printf("3: c=%d x=%f\n", c, x);
return c;
}
float f3(int a, float *x)
{
int i,j;
float y ;
i = *x;
j = f2(a,i)+2;
y = *x/j;
*x = a-y ;
printf("4: a=%d i=%d j=%d *x=%f y=%f\n", a,i,j,*x,y);
return 2*y;
}
int main()
{
int nusp, a, b, c;
float e;
char p, q;
printf ("Digite o seu no. USP: ");
/* a seguir, use o seu numero USP */
scanf ("%d", &nusp);
printf ("nusp = %d\n", nusp);
a = (nusp%5)+1;
b = 10-a;
c = (2*b+1)/4;
printf("1: a=%d b=%d c=%d\n", a, b, c);
e = f1(&b,a,c);
printf("2: a=%d b=%d c=%d e=%f\n", a, b, c, e);
a = (nusp%5)+1;
e = 1.5;
b = f3(a,&e);
printf("5: a=%d b=%d e=%f\n", a, b, e);
a = nusp/10;
b = (a%5)+1;
p = 'a';
q = p+b;
printf("6: a=%d b=%d p=%c q=%c\n", a, b, p, q);
return 0;
}
A resposta depende do resto da divisão do seu número USP por 5. Teste com o seu
no. USP e compare a resposta.
(0) nusp%5 == 0. Veja os 2 exemplos abaixo.
Digite o seu no. USP: 1234560 nusp = 1234560 1: a=1 b=9 c=4 2: a=1 b=3 c=4 e=0.500000 3: c=0 x=0.200000 4: a=1 i=1 j=2 *x=0.250000 y=0.750000 5: a=1 b=1 e=0.250000 6: a=123456 b=2 p=a q=c
Digite o seu no. USP: 1234565 nusp = 1234565 1: a=1 b=9 c=4 2: a=1 b=3 c=4 e=0.500000 3: c=0 x=0.200000 4: a=1 i=1 j=2 *x=0.250000 y=0.750000 5: a=1 b=1 e=0.250000 6: a=123456 b=2 p=a q=c
(1) nusp%5 == 1. Veja os 2 exemplos abaixo.
Digite o seu no. USP: 1234561 nusp = 1234561 1: a=2 b=8 c=4 2: a=2 b=0 c=4 e=0.300000 3: c=0 x=0.300000 4: a=2 i=1 j=2 *x=1.250000 y=0.750000 5: a=2 b=1 e=1.250000 6: a=123456 b=2 p=a q=c
Digite o seu no. USP: 1234566 nusp = 1234566 1: a=2 b=8 c=4 2: a=2 b=0 c=4 e=0.300000 3: c=0 x=0.300000 4: a=2 i=1 j=2 *x=1.250000 y=0.750000 5: a=2 b=1 e=1.250000 6: a=123456 b=2 p=a q=c
(2) nusp%5 == 2. Veja os 2 exemplos abaixo.
Digite o seu no. USP: 1234562 nusp = 1234562 1: a=3 b=7 c=3 2: a=3 b=4 c=3 e=0.800000 3: c=0 x=0.400000 4: a=3 i=1 j=2 *x=2.250000 y=0.750000 5: a=3 b=1 e=2.250000 6: a=123456 b=2 p=a q=c
Digite o seu no. USP: 1234567 nusp = 1234567 1: a=3 b=7 c=3 2: a=3 b=4 c=3 e=0.800000 3: c=0 x=0.400000 4: a=3 i=1 j=2 *x=2.250000 y=0.750000 5: a=3 b=1 e=2.250000 6: a=123456 b=2 p=a q=c
(3) nusp%5 == 3. Veja os 2 exemplos abaixo.
Digite o seu no. USP: 1234563 nusp = 1234563 1: a=4 b=6 c=3 2: a=4 b=7 c=3 e=1.200000 3: c=0 x=0.500000 4: a=4 i=1 j=2 *x=3.250000 y=0.750000 5: a=4 b=1 e=3.250000 6: a=123456 b=2 p=a q=c
Digite o seu no. USP: 1234568 nusp = 1234568 1: a=4 b=6 c=3 2: a=4 b=7 c=3 e=1.200000 3: c=0 x=0.500000 4: a=4 i=1 j=2 *x=3.250000 y=0.750000 5: a=4 b=1 e=3.250000 6: a=123456 b=2 p=a q=c
(4) nusp%5 == 4. Veja os 2 exemplos abaixo.
Digite o seu no. USP: 1234564 nusp = 1234564 1: a=5 b=5 c=2 2: a=5 b=7 c=2 e=1.300000 3: c=0 x=0.600000 4: a=5 i=1 j=2 *x=4.250000 y=0.750000 5: a=5 b=1 e=4.250000 6: a=123456 b=2 p=a q=c
Digite o seu no. USP: 1234569 nusp = 1234569 1: a=5 b=5 c=2 2: a=5 b=7 c=2 e=1.300000 3: c=0 x=0.600000 4: a=5 i=1 j=2 *x=4.250000 y=0.750000 5: a=5 b=1 e=4.250000 6: a=123456 b=2 p=a q=c
float seno(float x);que recebe como parâmetro um número real x, representando um ângulo em radianos, e devolve um valor aproximado de seno de x, através da série
sen(x) = x/1! - x3/3! + x5/5! - x7/7! + . . . + (-1)k × x2k+1/(2k+1)! + . . .O valor aproximado deve incluir todos os termos até que
|(-1)k × x2k+1/(2k+1)!| &le 0.00001.Inclua também na soma o último termo calculado.
/*
* SOLUCAO 1: curta e grossa
*
* Esta solucao possui alguns printfs sobrando que exibem
* cada termo calculado da serie.
*
*/
#define EPS 0.00001
float sen(float x)
{
float senox; /* aproximacao do seno de x */
float termo; /* termo da serie */
int k; /* controle do denominador em cada termo da serie */
/* inicialize com o primero termo da serie */
k = 1;
termo = x;
senox = x;
/* ou: while (termo > EPS || -termo > EPS) */
while (termo < -EPS || EPS < termo)
{
/* calcule o proximo termo */
k = k + 2;
termo = -termo*x*x/(k*(k-1));
/* atualize a aproximacao */
senox = senox + termo;
}
return senox;
}
/*
* SOLUCAO 2: identica a anterior.
*
* Usa uma variavel para determinar o sinal de cada termo.
*
* Esta solucao possui alguns printfs sobrando que exibem
* cada termo calculado da serie.
*/
#define EPS 0.00001
float sen(float x)
{
float senox; /* aproximacao do seno de x */
float termo; /* termo da serie */
int k; /* fatorial no denominador em termo da serie */
int sinal; /* indica o sinal de cada termo (+1 ou -1)*/
/* inicialize com o primero termo da serie */
k = 1;
sinal = 1;
termo = x;
senox = x;
/* ou: while (termo > EPS || -termo > EPS) */
while (termo < -EPS || EPS < termo)
{
/* calcule o proximo termo */
k = k + 2;
sinal = -sinal;
termo = termo*x*x/(k*(k-1));
/* atualize a aproximacao */
senox = senox + sinal*termo;
}
return senox;
}
/*
* SOLUCAO 3: usa funcoes auxiliares para calcular modulo, fatorial e
* potencia.
*
* Usa uma variavel para determinar o sinal de cada termo.
*
* Esta solucao possui alguns printfs sobrando que exibem
* cada termo calculado da serie.
*/
#define EPS 0.00001
float modulo(float valor)
{
float valorabsoluto;
valorabsoluto = valor;
if (valor < 0)
{
valorabsoluto = -valor;
}
return valorabsoluto;
}
int fatorial (int k)
{
int kfat; /* armazenara k fatorial */
int i;
kfat = 1;
for (i = 2; i <= k; i++)
{
kfat = kfat * i;
}
return kfat;
}
float potencia(float x, int k)
{
float xk; /* armazenara x elevado a k */
int i;
xk = 1;
for (i = 0; i < k; i++)
{
xk = xk * x;
}
return xk;
}
float sen(float x)
{
float senox; /* aproximacao do seno de x */
float termo; /* termo da serie */
int k; /* fatorial no denominador em termo da serie */
int sinal; /* indica o sinal de cada termo (+1 ou -1)*/
/* inicialize com o primero termo da serie */
k = 1;
sinal = 1;
termo = x;
senox = x;
while (modulo(termo) > EPS)
{
/* calcule o proximo termo */
k = k + 2;
sinal = -sinal;
termo = potencia(x,k)/fatorial(k);
/* atualize a aproximacao */
senox = senox + sinal*termo;
}
return senox;
}
/* * SOLUCAO 4: colocaremos aqui qualquer solução que virmos e que * seja essencialmente diferente da anterior. */
(b) Suponha que é dada uma função de protótipo
float raiz(float x);que recebe como parâmetro um real x ≥ 0 e devolve a raiz quadrada de x.
Escreva uma função de protótipo
void senocosseno(float x, float *seno, float *cosseno);que recebe como parâmetro um real x, 0 ≤ x ≤ PI/2 e devolve em *seno e *cosseno os valores de seno e cosseno de x, respectivamente.
A sua função deve usar obrigatoriamente a função sen do item (a), mesmo que você não a tenha feito. Para calcular o cosseno, utilize a relação fundamental da trigonometria sen2x + cos2x = 1.
OBS.: Não é necessário reescrever aqui nem os protótipos nem as funções sen e raiz.
/*
* SOLUCAO 1:
*
* Esta solucao usa duas variaveis extras.
*
*/
void senocosseno(float x, float *seno, float *cosseno)
{
float senox;
float cossenox;
senox = sen(x);
cossenox = raiz(1 - senox*senox);
*seno = senox;
*cosseno = cossenox;
}
/*
* SOLUCAO 2:
*
* Solucao sem as variaveis extras.
*
*/
void senocosseno(float x, float *seno, float *cosseno)
{
*seno = sen(x);
*cosseno = raiz(1 - sen(x)*sen(x));
}
/*
* SOLUCAO 3:
*
* Solucao sem as variaveis extras.
*
*/
void senocosseno(float x, float *seno, float *cosseno)
{
*seno = sen(x);
*cosseno = raiz(1 - *seno * *seno);
}
(c) Escreva uma programa que lê um número real x, 0 ≤ x ≤ PI/2, e imprime o seno e o cosseno de x. O seu programa deve, obrigatoriamente, utilizar a função do item (b) (mesmo que você não a tenha feito) para calcular o seno e o cosseno de x.
OBS.: Não é necessário reescrever aqui nem os protótipos nem as funções dos itens anteriores.
/*
* SOLUCAO 1:
*
*/
#include <stdio.h>
int main()
{
float x;
float senox;
float cossenox;
printf("Digite um angulo entre 0 e PI/2: ");
scanf("%f",&x);
senocosseno(x, &senox, &cossenox);
printf("seno(%f)=%f cosseno(%f)=%f\n", x, senox, x, cossenox);
return 0;
}
float raizcub(float x);que recebe como parâmetro um número real x ≥ 0 e devolve uma aproximação de raiz cúbica de x. Para x>0, uma aproximação pode ser obtida através da seqüência (r0,r1, . . . ,rn, . . .) onde r0= x e
rn+1 = (2rn+ x/rn2)/3A aproximação a ser devolvida será o primeiro valor rn+1 para o qual |rn+1-rn| < 0.000001.
Se sua função fizer verificação de igualdade entre dois números reais, deverá fazê-la usando a função de protótipo
int sao_iguais(float x, float y);Não é necessário escrever a função sao_iguais.
/*
* SOLUCAO 1:
*
*/
#define SIM 1
#define NAO 0
float raizcub(float x)
{
float rant;
float ratual;
if (sao_iguais(x,0) == SIM)
{
rant = 0;
ratual = 0;
}
else
{
rant = x;
ratual = (2*x+1/x)/3;
}
/* ou: while (ratual-rant > EPS || rant-ratual > EPS) */
while (ratual-rant < -EPS || EPS < ratual-rant) /* pode ser '<=' no lugar de '<' */
{
rant = ratual;
ratual = (2*rant + x/(rant*rant)) / 3;
}
return ratual;
}
/*
* SOLUCAO 2: identica a SOLUCAO 1.
*
*/
#define SIM 1
#define NAO 0
float raizcub(float x)
{
float rant;
float ratual;
if (sao_iguais(x,0) == SIM)
{
rant = 0;
ratual = 0;
}
else
{
rant = x;
ratual = (2*x+1/x)/3;
}
/* ou: while (ratual-rant > EPS || rant-ratual > EPS) */
while (ratual-rant < -EPS || EPS < ratual-rant) /* pode ser '<=' no lugar de '<' */
{
rant = ratual;
ratual = (2*rant + x/(rant*rant)) / 3;
}
return ratual;
}
/*
* SOLUCAO 3:
*
*/
float raizcub(float x)
{
float rant;
float ratual;
rant = 0;
ratual = x;
/* ou: while (ratual-rant > EPS || rant-ratual > EPS) */
while (ratual-rant < -EPS || EPS < ratual-rant) /* pode ser '<=' no lugar de '<' */
{
rant = ratual;
ratual = (2*rant + x/(rant*rant)) / 3;
}
return ratual;
}
/* * SOLUCAO 4: colocaremos aqui qualquer solução que virmos e que * seja essencialmente diferente da anterior. */
(b) Escreva um programa que lê dois números reais a e b, com 0 ≤ a ≤ b, e um inteiro k, com k>0 e imprime uma aproximação da área sob a função x1/3 no intervalo [a,b].
O seu programa deve usar o método dos trapézios, como você fez no EP3.
OBS.: Não é necessário reescrever aqui nem o protótipo nem a função do item anterior.
/*
* SOLUCAO 1: usa textualmente a formula no enunciado do EP3.
*
*/
#include <stdio.h>
int main()
{
float a, b; /* limites do intervalo */
int k; /* numero de trapezios */
float deltax; /* altura de cada trapezio */
float area; /* aproximacao da area sob a funcao no intervalo [a,b] */
int i;
printf("Digite a, b e k: ");
scanf("%f %f %d", &a, &b, &k);
deltax = (b-a)/k;
area = 0;
for (i = 1; i <= k; i++)
{
area = area + ((raizcub(a+(i-1)*deltax)+raizcub(a+i*deltax)) * deltax) / 2;
}
printf("Area entre %f e %f = %f\n", a, b, area);
return 0;
}
/*
* SOLUCAO 2: simplifica um pouco a formula no enunciado do EP3.
*
*/
#include <stdio.h>
int main()
{
float a, b; /* limites do intervalo */
int k; /* numero de trapezios */
float deltax; /* altura de cada trapezio */
float area; /* aproximacao da area sob a funcao no intervalo [a,b] */
int i;
printf("Digite a, b e k: ");
scanf("%f %f %d", &a, &b, &k);
deltax = (b-a)/k;
area = 0;
for (i = 1; i <= k; i++)
{
area = area + raizcub(a+(i-1)*deltax) + raizcub(a+i*deltax);
}
area = area*deltax/2;
printf("Area entre %f e %f = %f\n", a, b, area);
return 0;
}
/*
* SOLUCAO 3: usa duas variaveis para determinar as abcissas das
* bases do trapezio e calcula explicitamente a
* area de cada trapezio.
*
*/
#include <stdio.h>
int main()
{
float a, b; /* limites do intervalo */
int k; /* numero de trapezios */
float deltax; /* altura de cada trapezio */
float area; /* aproximacao da area sob a funcao no intervalo [a,b] */
float xant; /* abscissa de uma 'base' do trapezio */
float xatual; /* abscissa de uma 'base' do trapezio */
float trapezio; /* area do trapezio */
int i;
printf("Digite a, b e k: ");
scanf("%f %f %d", &a, &b, &k);
deltax = (b-a)/k;
xant = a;
area = 0;
for (i = 0; i < k; i++)
{
xatual = xant + deltax;
/* calcule a area do proximo trapezio */
trapezio = deltax * (raizcub(xant)+raizcub(xatual)) / 2;
/* atualize a aproximacao da area sob a funcao */
area = area + trapezio;
/* atualize a abcissa da nova 'base' */
xant = xatual;
}
printf("Area entre %f e %f = %f\n", a, b, area);
return 0;
}
/*
* SOLUCAO 4: identica a SOLUCAO 3.
* Nao usa variavel auxiliar para a area do trapezio.
*
*/
#include <stdio.h>
int main()
{
float a, b; /* limites do intervalo */
int k; /* numero de trapezios */
float deltax; /* altura de cada trapezio */
float area; /* aproximacao da area sob a funcao no intervalo [a,b] */
float xant; /* abscissa de uma 'base' do trapezio */
float xatual; /* abscissa de uma 'base' do trapezio */
int i;
printf("Digite a, b e k: ");
scanf("%f %f %d", &a, &b, &k);
deltax = (b-a)/k;
xant = a;
area = 0;
for (i = 0; i < k; i++)
{
xatual = xant + deltax;
area = area + deltax * (raizcub(xant)+raizcub(xatual))/2;
xant = xatual;
}
printf("Area entre %f e %f = %f\n", a, b, area);
return 0;
}
/*
* SOLUCAO 5: usa duas variaveis para determinar as abcissas da
* base do trapezio e simplifica as contas.
*
*/
#include <stdio.h>
int main()
{
float a, b; /* limites do intervalo */
int k; /* numero de trapezios */
float deltax; /* altura de cada trapezio */
float area; /* aproximacao da area sob a funcao no intervalo [a,b] */
float xant; /* abscissa de uma 'base' do trapezio */
float xatual; /* abscissa de uma 'base' do trapezio */
int i;
printf("Digite a, b e k: ");
scanf("%f %f %d", &a, &b, &k);
deltax = (b-a)/k;
xant = a;
area = (raizcub(a)+raizcub(b)) / 2;
for (i = 1; i < k; i++)
{
xatual = xant + deltax;
area = area + raizcub(xatual);
xant = xatual;
}
area = area * deltax;
printf("Area entre %f e %f = %f\n", a, b, area);
return 0;
}