Departamento de Ciência da Computação - IME - USP

MAC2166 Introdução à Computação

Prova 2


QUESTÃO 1

  Simule a execução do programa abaixo, destacando a sua saída. A saída do programa consiste de tudo que resulta dos comandos printf.
#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;
}

SOLUÇÃO
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

QUESTÃO 2

  Uma das formas de se calcular o valor de PI é através da fórmula de Leibniz:
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.

SOLUÇÃ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.
 */

QUESTÃO 3

PARTE A. Considere a equação ax2 + bx + c = 0. Escreva uma função raizes que determina as raízes reais dessa equação. Sua função raizes deve: SOLUÇÃO
/*
 * 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).

SOLUÇÃO
/*
 * 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;
}

 

 

 


Last modified: Mon Jun 13 18:22:37 BRT 2005