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