Departamento de Ciência da
Computação - IME - USP
#include <stdio.h>
int f1 (int a, int b) {
int z;
a = a + b;
b = a - b;
z = a + b;
return z;
}
int f2 (int *a, int b) {
int z;
*a = *a + b;
b = *a - b;
z = *a + b;
return z;
}
int f3 (int *a, int b) {
b = *a + b;
*a = b + 2;
return b;
}
int main () {
int nusp;
int a, b, c, d, e;
float f;
printf ("Entre com seu no. USP: ");
scanf ("%d", &nusp); /* use aqui seu numero USP */
printf ("nusp = %d\n", nusp);
a = nusp % 5;
b = a + 2;
printf ("1: a=%d b=%d\n", a, b);
c = a;
d = b;
e = f1 (c, d);
printf ("2: a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
c = a;
d = b;
e = f2 ( &c, d);
printf ("3: a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
d = b;
d = f3 ( &d, d);
printf ("4: a=%d b=%d d=%d\n", a, b, d);
d = 2 * a + 1;
b = 2;
f = d / b;
printf ("5: a=%d b=%d d=%d e=%d, f=%f\n", a, b, d, e, f);
f = a;
f = (2 * f + 1) / 2;
e = f;
printf ("6: a=%d b=%d c=%d e=%d f=%f\n", a, b, c, e, f);
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.
Entre com seu no. USP: 1234560
nusp = 1235670
1: a=0 b=2
2: a=0 b=2 c=0 d=2 e=2
3: a=0 b=2 c=2 d=2 e=2
4: a=0 b=2 d=4
5: a=0 b=2 d=1 e=2 f=0.000000
6: a=0 b=2 c=2 e=0 f=0.500000
Entre com seu no. USP: 1234565
nusp = 1234565
1: a=0 b=2
2: a=0 b=2 c=0 d=2 e=2
3: a=0 b=2 c=2 d=2 e=2
4: a=0 b=2 d=4
5: a=0 b=2 d=1 e=2 f=0.000000
6: a=0 b=2 c=2 e=0 f=0.500000
(1) nusp%5 == 1. Veja os 2 exemplos abaixo.
Entre com seu no. USP: 1234561
nusp = 1234561
1: a=1 b=3
2: a=1 b=3 c=1 d=3 e=5
3: a=1 b=3 c=4 d=3 e=5
4: a=1 b=3 d=6
5: a=1 b=2 d=3 e=5 f=1.000000
6: a=1 b=2 c=4 e=1 f=1.500000
Entre com seu no. USP: 1234566
nusp = 1234566
1: a=1 b=3
2: a=1 b=3 c=1 d=3 e=5
3: a=1 b=3 c=4 d=3 e=5
4: a=1 b=3 d=6
5: a=1 b=2 d=3 e=5 f=1.000000
6: a=1 b=2 c=4 e=1 f=1.500000
(2) nusp%5 == 2. Veja os 2 exemplos abaixo.
Entre com seu no. USP: 1234562
nusp = 1234562
1: a=2 b=4
2: a=2 b=4 c=2 d=4 e=8
3: a=2 b=4 c=6 d=4 e=8
4: a=2 b=4 d=8
5: a=2 b=2 d=5 e=8 f=2.000000
6: a=2 b=2 c=6 e=2 f=2.500000
Entre com seu no. USP: 1234567
nusp = 1234567
1: a=2 b=4
2: a=2 b=4 c=2 d=4 e=8
3: a=2 b=4 c=6 d=4 e=8
4: a=2 b=4 d=8
5: a=2 b=2 d=5 e=8 f=2.000000
6: a=2 b=2 c=6 e=2 f=2.500000
(3) nusp%5 == 3. Veja os 2 exemplos abaixo.
Entre com seu no. USP: 1234563
nusp = 1234563
1: a=3 b=5
2: a=3 b=5 c=3 d=5 e=11
3: a=3 b=5 c=8 d=5 e=11
4: a=3 b=5 d=10
5: a=3 b=2 d=7 e=11 f=3.000000
6: a=3 b=2 c=8 e=3 f=3.500000
Entre com seu no. USP: 1234568
nusp = 1234568
1: a=3 b=5
2: a=3 b=5 c=3 d=5 e=11
3: a=3 b=5 c=8 d=5 e=11
4: a=3 b=5 d=10
5: a=3 b=2 d=7 e=11 f=3.000000
6: a=3 b=2 c=8 e=3 f=3.500000
(4) nusp%5 == 4. Veja os 2 exemplos abaixo.
Entre com seu no. USP: 1234564
nusp = 1234564
1: a=4 b=6
2: a=4 b=6 c=4 d=6 e=14
3: a=4 b=6 c=10 d=6 e=14
4: a=4 b=6 d=12
5: a=4 b=2 d=9 e=14 f=4.000000
6: a=4 b=2 c=10 e=4 f=4.500000
Entre com seu no. USP: 1234569
nusp = 1234569
1: a=4 b=6
2: a=4 b=6 c=4 d=6 e=14
3: a=4 b=6 c=10 d=6 e=14
4: a=4 b=6 d=12
5: a=4 b=2 d=9 e=14 f=4.000000
6: a=4 b=2 c=10 e=4 f=4.500000
PI = 4 - 4/3 + 4/5 - 4/7 + . . . + (-1)i × 4/(2i+1) + . . .Escreva um programa em
C que leia um número real epsilon,
0 < epsilon < 1 e calcule uma aproximação de PI
com precisão epsilon, usando a
fórmula de Leibniz. Seu programa deve parar o cálculo da aproximação quando o
valor absoluto do termo (-1)i × 4/(2i+1) for menor
do que epsilon. Inclua também esse termo na aproximação.
/*
* Solucao 1: curta e grossa
*
* Esta solucao possui alguns printfs extras que exibem
* cada termo calculado da serie de Leibniz.
*
* So de brincadeira, calcule o valor de PI com precisao
* 0.1, 0.01, 0.001, 0.0001 ... usando o programa abaixo.
* Veja a diferenca no comportamento desse programa e dos
* que usavam series para calcular seno, cosseno, ... como
* voces ja fizeram.
*
* Qual a razao dessa diferenca de comportamento?
*/
#include <stdio.h>
int main()
{
float epsilon; /* precisao dada */
float pi; /* aproximacao de PI */
int i; /* indice do termo calculado */
int sinal; /* sinal termo calculado */
float termo; /* termo da serie de Leibniz */
/* 1. leia a precisao desejada */
printf("Digite a precisao desejada: ");
scanf("%f", & epsilon);
/* 2. calcule o 1o. termo da serie de Leibniz */
i = 0;
sinal = 1;
termo = 4;
pi = 4;
printf("pi=%f termo(%d)=%f\n", pi, i, termo);
/* 3. calcule PI com preciado epsilon */
while (termo <= -epsilon || epsilon <= termo)
{
/* 3.1 calcule o i-esimo termo da serie de Leibniz */
i = i + 1;
sinal = -sinal;
termo = sinal*4.0/(2*i+1); /* Hmmmm, sera que podia escrever 4/(2i+1)? */
pi = pi + termo;
printf("pi=%f termo(%d)=%f\n", pi, i, termo);
}
printf("Aproximacao de PI com precisao %f = %f\n", epsilon, pi);
return 0;
}
/*
* SOLUCAO 2: identica a anterior
*
*/
#include <stdio.h>
int main()
{
float epsilon; /* precisao dada */
float pi; /* aproximacao de PI */
int k; /* 4.0/k e a forma dos termos da serie de Leibniz */
int sinal; /* sinal termo calculado */
/* 1. leia a precisao desejada */
printf("Digite a precisao desejada: ");
scanf("%f", & epsilon);
/* 2. calcule o 1o. termo da serie de Leibniz */
k = 1;
sinal = 1;
pi = 4;
printf("pi=%f termo(%d)=%f\n", pi, k/2, 4.0/k);
/* 3. calcule PI com preciado epsilon */
while (epsilon <= 4.0/k)
{
/* 3.1 calcule o i-esimo termo da serie de Leibniz */
k = k + 2;
sinal = -sinal;
pi = pi + sinal*4.0/k; /* Hmmmm, sera que podia escrever 4/k? */
printf("pi=%f termo(%d)=%f\n", pi, k/2, sinal*4.0/k );
}
printf("Aproximacao de PI com precisao %f = %f\n", epsilon, pi);
return 0;
}
/*
* Solucao 3: colocaremos aqui qualquer solução que virmos e que
* seja essencialmente diferente da anterior.
*/
float raiz_quadrada(float num);
int flt_iguais(float x, float y);que devolve 1, se x é considerado igual a y e 0, em caso contrário.
/*
* Solucao 1: Solucao curta e simples.
*
*/
float raizes(float a, float b, float c, float *r1, float *r2)
{
float delta; /* discriminante da equacao */
float rdelta; /* raiz quadrada de delta */
int valor;
valor = 0;
delta = b*b - 4*a*c;
if (delta >= 0)
{
valor = 1;
rdelta = raiz_quadrada(delta);
*r1 = (-b - rdelta)/(2*a); /* sabe-se que a != 0 */
*r2 = (-b + rdelta)/(2*a); /* podemos escrever 2*a ao inves de (2*a)? */
}
return valor;
}
/*
* Solucao 2: colocaremos aqui qualquer solução que virmos e que
* seja essencialmente diferente da anterior.
*/
PARTE B. De acordo com o Terceiro Exercício Programa, a reta que define a trajetória do veículo intercepta o QG se e somente se o sistema de equações abaixo admite pelo menos uma solução real (excluindo o caso de retas paralelas ao eixo y).
A reta não intercepta a circunferencia
A reta intercepta a circunferencia no ponto (x1,y1)
A reta intercepta a circunferencia nos pontos (x1,y1) e (x2,y2)
/*
* Solucao
*
*/
int main()
{
float a, b; /* coeficientes da equancao da reta */
float r; /* raio da circunferencia */
float A, B, C; /* coeficientes da equacao do 2o. grau */
float x1, y1; /* ponto de intersecao entre a reta e a circunferencia */
float x2, y2; /* ponto de intersecao entre a reta e a circunferencia */
/* 0. leitura dos coeficiente da reta e do raio da circunferencia */
printf("Digite a, b e r: ");
scanf("%f %f %f", &a, &b, &r);
/* 1. calculo dos coeficientes da equaca do 2o. grau que
* tem como raizes as abscissas dos pontos de intersecao
*/
A = a*a + 1;
B = 2*a*b;
C = b*b - r*r;
/* 2. calcule as raizes de A*X*X + B*X + C */
if (raizes(A,B,C,&x1,&x2) == 0)
{
printf("A reta nao intercepta a circunferencia\n");
}
else
{
y1 = a*x1 + b;
y2 = a*x2 + b;
if (x1 == x2) /* ou if (flt_iguais(x1,x2) == 1) */
{
printf("A reta intercepta a circunferencia no ponto (%f,%f)\n",
x1, y1);
}
else
{
printf("A reta intercepta a circunferencia nos pontos (%f,%f) e (%f,%f)\n",
x1, y1, x2, y2);
}
}
return 0;
}