MAC 2166 Introdução à Computação para Engenharia


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 n, int *j) 
{
  int i;

  i  = n % 10;
  n  = n / 10;
  *j = n % 10;
  printf("f1: %d %d %d\n", n, i, *j);
  return i;
}
 
void f2 (int n, double *x)
{
  int    i, j;
  double y;

  j = n % 10;  
  n = (j % 3) + 1;
  y = n + 5;
  i  = y / 5; 
  *x = y / 5;
  printf("f2: %d %d %d %g %g\n", 
                           n, i, j, y, *x);
}

int main() 
{
  int nusp, n, i, j;
  double x;

  printf("Entre com o seu no. USP: ");
  scanf ("%d", &nusp);

  n = nusp; i = 11; j = 11;
  printf(" 1: %d %d %d\n", n, i, j); 
  j = f1 (n, &i);
  printf(" 2: %d %d %d\n", n, i, j);

  n = nusp; i = 22; j = 22;
  printf(" 3: %d %d %d\n", n, i, j);
  j = f1 (n, &n); 
  printf(" 4: %d %d %d\n", n, i, j);
  
  n = nusp; i = 33; j = 33; x = 3.33;
  printf(" 5: %d %d %d %g\n", n, i, j, x);
  f2 (n, &x); 
  printf(" 6: %d %d %d %g\n", n, i, j, x);

  return 0;
}


SOLUÇÃO.

A resposta depende, essencialmente, do último e penúltimo dígitos do
número USP. Teste com o seu no. USP e compare a resposta.  Na soluções a
seguir o penúltimo dígito do número USP é representado por X. Assim, o
número USP 1234567 é escrito como 12345X7.   

Entre com o seu no. USP: 12345X0
 1: 12345X0 11 11
f1: 12345X 0 X
 2: 12345X0 X 0
 3: 12345X0 22 22
f1: 12345X 0 X
 4: X 22 0
 5: 12345X0 33 33 3.33
f2: 1 1 0 6 1.2
 6: 12345X0 33 33 1.2

Entre com o seu no. USP: 12345X1
 1: 12345X1 11 11
f1: 12345X 1 X
 2: 12345X1 X 1
 3: 12345X1 22 22
f1: 12345X 1 X
 4: X 22 1
 5: 12345X1 33 33 3.33
f2: 2 1 1 7 1.4
 6: 12345X1 33 33 1.4

Entre com o seu no. USP: 12345X2
 1: 12345X2 11 11
f1: 12345X 2 X
 2: 12345X2 X 2
 3: 12345X2 22 22
f1: 12345X 2 X
 4: X 22 2
 5: 12345X2 33 33 3.33
f2: 3 1 2 8 1.6
 6: 12345X2 33 33 1.6

Entre com o seu no. USP: 12345X3
 1: 12345X3 11 11
f1: 12345X 3 X
 2: 12345X3 X 3
 3: 12345X3 22 22
f1: 12345X 3 X
 4: X 22 3
 5: 12345X3 33 33 3.33
f2: 1 1 3 6 1.2
 6: 12345X3 33 33 1.2

Entre com o seu no. USP: 12345X4
 1: 12345X4 11 11
f1: 12345X 4 X
 2: 12345X4 X 4
 3: 12345X4 22 22
f1: 12345X 4 X
 4: X 22 4
 5: 12345X4 33 33 3.33
f2: 2 1 4 7 1.4
 6: 12345X4 33 33 1.4

Entre com o seu no. USP: 12345X5
 1: 12345X5 11 11
f1: 12345X 5 X
 2: 12345X5 X 5
 3: 12345X5 22 22
f1: 12345X 5 X
 4: X 22 5
 5: 12345X5 33 33 3.33
f2: 3 1 5 8 1.6
 6: 12345X5 33 33 1.6

Entre com o seu no. USP: 12345X6
 1: 12345X6 11 11
f1: 12345X 6 X
 2: 12345X6 X 6
 3: 12345X6 22 22
f1: 12345X 6 X
 4: X 22 6
 5: 12345X6 33 33 3.33
f2: 1 1 6 6 1.2
 6: 12345X6 33 33 1.2

Entre com o seu no. USP: 12345X7
 1: 12345X7 11 11
f1: 12345X 7 X
 2: 12345X7 X 7
 3: 12345X7 22 22
f1: 12345X 7 X
 4: X 22 7
 5: 12345X7 33 33 3.33
f2: 2 1 7 7 1.4
 6: 12345X7 33 33 1.4

Entre com o seu no. USP: 12345X8     
 1: 12345X8 11 11
f1: 12345X 8 X
 2: 12345X8 X 8
 3: 12345X8 22 22
f1: 12345X 8 X
 4: X 22 8
 5: 12345X8 33 33 3.33
f2: 3 1 8 8 1.6
 6: 12345X8 33 33 1.6

Entre com o seu no. USP: 12345X9
 1: 12345X9 11 11
f1: 12345X 9 X
 2: 12345X9 X 9
 3: 12345X9 22 22
f1: 12345X 9 X
 4: X 22 9
 5: 12345X9 33 33 3.33
f2: 1 1 9 6 1.2
 6: 12345X9 33 33 1.2

----------------------------------------------------------------
QUESTÃO 2.

A representação de um número natural em base binária utiliza apenas os
algarismos 0 e 1. Observe,

[Notação: abaixo escrevemos x^{y} para indicar x elevando a y.]

(a) 2 na base binária é representado por 10, pois

    1 x 2^1 + 0 2^0 = 2;

(b) 5 na base binária é representado por 101, pois

    1 x 2^2 + 0 x 2^1 + 1 x 2^0 = 5;

(c) 18 na base binária é representado por 10010, pois

    1 x 2^4 + 0 x 2^3 + 0 x 2^2 + 1 x 2^1 + 0 x 2^0 = 18;
  
(d) 20 na base binária é representado por 10100, pois

    1 x 2^4 + 0 x 2^3 + 1 x 2^2 + 0 x 2^1 + 0 x 2^0 = 20;
  
(e) 32 na base binária é representado por 100000, pois

    1 x 2^5 + 0 x 2^4 + 0 x 2^3 + 0 x 2^2 + 0 x 2^1 + 0 x 2^0 = 32.

O programa abaixo tenta resolver o seguinte problema:

  "Dado um número natural na base binária, transformá-lo para a base
   decimal".

Por exemplo: dado 10010, a saída será ``$18$''.

[Comentário: a base decimal usa os algarismos 0,1,2,3,4,5,6,7,8 e 9.]

#include < stdio.h >
/* Dado um numero em binario, converter este numero para base decimal. */

/* Recebe um inteiro, num, corta seu ultimo digito e */
/* devolve este digito como resultado.               */
int proxdig(int num)
{
  int res;

  res = num % 10;
  num = num / 10;
  return res;
}

/* Programa principal. */
int main()
{
  int xbase2, xbase10, pot2;
  
  printf("Entre com o numero em binario: ");
  scanf("%d", &xbase2);

  /* Converte o numero lido para a base decimal. */
  xbase10 = 0;
  pot2 = 1;
  while (pot2 <= xbase2)
    {
      xbase10 = xbase10 + proxdig(xbase2) * pot2;
      pot2 = pot2 * 2;
    }
  
  printf("O numero em decimal e %d\n", xbase10);
  return 0;
}

O programa está com erro(s) de lógica.

a) Mostre uma entrada válida para a qual o programa não funciona, a saída
(errada) fornecida pelo programa e a reposta correta. {\em Você não deve
  fornecer explicações, apenas a entrada, a saída e a resposta correta}.

b) Escreva um programa em C que resolve o problema. O seu programa
pode ou não estar baseado no programa acima.

SOLUÇÃO de (a).

para a entrada 10 a resposta é 0 e deveria ser 2.

para a entrada 11 a resposta é 15 e deveria ser 3.

para a entrada 100 a resposta é 0 e deveria ser 4.

para a entrada 101 a resposta é 127 e deveria ser 5.

para a entrada 110 a resposta é 0 e deveria ser 6.

para a entrada 111 a resposta é 127 e deveria ser 7.

para a entrada 1000 a resposta é 0 e deveria ser 8.

para a entrada 1001 a resposta é 1023 e deveria ser 9.

Na realidade, se o número binário lido pelo programa termina com 0 então
a resposta é 0. Já se o número binário lido pelo programa termina com 1
então a resposta é ... Bem, quem consegue dizer qual é a resposta???
Mais umas entradas/respostas para ajudar na inspiração:  

para a entrada 10001 a resposta é 16383 e deveria ser 17.

para a entrada 10011 a resposta é 16383 e deveria ser 19.

para a entrada 100001 a resposta é 131071 e deveria ser 33.

[...]

SOLUÇÃO de (b)

#include < stdio.h >
/* Dado um numero em binario, converter este numero para base decimal. */

/* Recebe um inteiro, num, corta seu ultimo digito e */
/* devolve este digito como resultado.               */
int proxdig (int *num) 
{
  int res;

  res  = *num % 10;
  *num = *num / 10;
  return res;
}

/* Programa principal. */
int main() 
{
  int xbase2, xbase10, pot2;
  
  printf("Entre com o numero em binario: ");
  scanf("%d", &xbase2);

  /* Converte o numero lido para a base decimal. */
  xbase10 = 0;
  pot2 = 1;
  while (xbase2 > 0) 
    {
      xbase10 = xbase10 + proxdig(&xbase2) * pot2;
      pot2 = pot2 * 2;
    }
  
  printf("O numero em decimal e %d\n", xbase10);
  return 0;
}

----------------------------------------------------------------
QUESTÃO 3.

Considere o problema: Dados um inteiro n que é potência de 2
(isto é, n é um número no conjunto {1, 2, 4, 8, 16, 32, ...})
e uma seqüência de n números reais, calcular a média 
geométrica dos elementos desta seqüência.

[Notação: abaixo escrevemos x^{y} para indicar x elevando a y.]

Lembre-se que a média geométrica de x_1,x_2,...,x_n é dada por

             M = (x_1x_2...x_n)^{1/n}

e que para n=2^k esta expressão pode ser calculada como

   M = (((((x_1x_2...x_n)^{1/2})^{1/2})^{1/2})...)^{1/2},

onde o 1/2 aparece k vezes na última expressão.

Você deve produzir um programa em C que resolva o problema acima. Para
lhe ajudar, a resposta da questão está nas linhas a seguir. O único
problema é que as linhas do programa não estão necessariamente em ordem.
Você tem duas opções: resolver este quebra-cabeça, numerando as linhas
de acordo com a ordem em que devem aparecer no programa, ou
alternativamente escrever um programa completo para a solução do
problema proposto. Você pode usar a função sqrt(x) para calcular
x^{1/2}, adicionando a linha

   #include < math.h >

no início do seu programa. Você NÃO PODE usar qualquer outra função
desta biblioteca.

Indique a seguir a sua opção (marque apenas UMA alternativa):


( ) resolver o quebra-cabeça        ( ) escrever um programa completo

(  ) } /* final de main */
(  ) #include < math.h >
(  ) int main() {
(  ) #include < stdio.h >
(  )   p = 1.0;
(  )   /* final do while */
(  )   } /* final do for */
(  )   double x,p;
(  )   while (i>1) {
(  )   printf("Media geometrica = %g\n",p);
(  )   scanf("%d",&n);
(  )   i = n;
(  )   return 0;
(  )   for (i=0; i < n; i=i+1) {
(  )   int n,i;
(  )   i = i/2;
(  )   p = p*x;
(  )   scanf("%lf",&x);
(  )   p = sqrt(p);

SOLUÇÃO.

(19) } /* final de main */
( 2) #include < math.h >
( 3) int main() {
( 1) #include < stdio.h >
( 7)   p = 1.0;
(16)   /* final do while */
(11)   } /* final do for */
( 5)   double x,p;
(13)   while (i > 1) {
(17)   printf("Media geometrica = %g\n",p);
( 6)   scanf("%d",&n);
(12)   i = n;
(18)   return 0;
( 8)   for (i=0; i < n; i=i+1) {
( 4)   int n,i;
(15)   i = i/2;
(10)   p = p*x;
( 9)   scanf("%lf",&x);
(14)   p = sqrt(p);

ou melhor

( 1) #include < stdio.h >
( 2) #include < math.h >

( 3) int main() {
( 4)   int n,i;
( 5)   double x,p;

( 6)   scanf("%d",&n);

( 7)   p = 1.0;
( 8)   for (i=0; i < n; i=i+1) {
( 9)     scanf("%lf",&x);
(10)     p = p*x;
(11)   } /* final do for */

(12)   i = n;
(13)   while (i > 1) {
(14)     p = sqrt(p);
(15)     i = i/2;
(16)   } /* final do while */

(17)   printf("Media geometrica = %g\n",p);
(18)   return 0;

(19) } /* final de main */

----------------------------------------------------------------
QUESTÃO 4.
  
Faça um programa em C que lê um número inteiro n (1 <= n <= 100) e
uma seqüencia com n notas da prova de MAC 2166 e calcula a média
das notas e quantas notas são maiores que a média.

Por exemplo, para a entrada

                   4
                   7.5   8.5   9.5   4.5

a saída deve ser

                  Media = 7.5
                  No. de notas maiores que a media = 2


SOLUÇÃO.

#include < stdio.h >
#define NMAX 1000

int main()
{
  int 
      n, /* numero de notas a serem lidas */ 
      i, /* indice usado para percorrer o vetor de notas */
   cont; /* contado de numero de notas maiores que a media */

  double 
   nota[NMAX], /* vetor para armazenar as notas */ 
        soma,  /* soma das notas  */ 
        media; /* media das notas */
  
  /* 1. Leia o numero n de notas */
  printf("Entre com o numero de notas: ");
  scanf("%d", &n);

  /* 2. Leia as notas e calcule a soma das notas */  
  soma = 0;
  for (i = 0; i < n; i++) 
    {
      printf("Entre com uma nota: ");
      scanf ("%lf", ¬a[i]);
      soma = soma + nota[i];
    }   

  /* 3. Calcule a media das notas */
  media = soma / n;
  printf("Media = %g\n", media);
 
  /* 4. Conte quantas notas sao maiores que a media */
  cont = 0;
  for (i = 0; i <= n-1; i++) 
    {
      if (nota[i] > media)
	{
	  cont = cont + 1;
	}
    }

  /* 5. Escreva a resposta */
  printf("No. de notas maiores que a media = %d\n", cont);
  return 0;
}


Last modified: Thu May 23 15:48:44 EST 2002