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


PROVA 2 - 1o. SEMESTRE DE 2001

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 

void f1 (int a, int b) {
   double x, y;
   a = 2 * a + 1;
   x = a;
   y = x / 2;
   b = x / 2;
   x = a / 2;
   printf("1: %d %d %g %g\n", a, b, x, y);
}


double f2 (int *x, int b) {
   double a;
   a  = *x + b;
   *x = a / 2;
   b  = *x + b;
   printf ("2: %d %d %g\n", *x, b, a);
   return a;
}


int main() {
   int nusp, dig, a, b;
   double x;

   printf("Digite o seu numero USP: ");
   scanf("%d",&nusp);
   dig = nusp % 10;
   printf("dig = %d\n", dig);
   a = dig%4 + 1;
   b = 9 - dig%5;
   printf ("3: %d %d \n", a, b);

   f1 (a, b);
   printf("4: %d %d \n", a, b);

   a = dig%4 + 1;
   b = 9 - dig%5;
   printf ("5: %d %d \n", a, b);

   x = f2 (&b, a);
   printf ("6: %d %d %g \n", a, b, x);
   return 0;
}


SOLUÇÃO.

A resposta depende, essencialmente, do último dígito do número USP.
Teste com o seu no. USP e compare a resposta.


Digite o seu numero USP 0
dig = 0
3: 1 9
1: 3 1 1 1.5
4: 1 9
5: 1 9
2: 5 6 10
6: 1 5 10

Digite o seu numero USP 1
dig = 1
3: 2 8
1: 5 2 2 2.5
4: 2 8
5: 2 8
2: 5 7 10
6: 2 5 10

Digite o seu numero USP 2
dig = 2
3: 3 7
1: 7 3 3 3.5
4: 3 7
5: 3 7
2: 5 8 10
6: 3 5 10

Digite o seu numero USP 3
dig = 3
3: 4 6
1: 9 4 4 4.5
4: 4 6
5: 4 6
2: 5 9 10
6: 4 5 10

Digite o seu numero USP 4
dig = 4
3: 1 5
1: 3 1 1 1.5
4: 1 5
5: 1 5
2: 3 4 6
6: 1 3 6

Digite o seu numero USP 5
dig = 5
3: 2 9
1: 5 2 2 2.5
4: 2 9
5: 2 9
2: 5 7 11
6: 2 5 11

Digite o seu numero USP 6
dig = 6
3: 3 8
1: 7 3 3 3.5
4: 3 8
5: 3 8
2: 5 8 11
6: 3 5 11

Digite o seu numero USP 7
dig = 7
3: 4 7
1: 9 4 4 4.5
4: 4 7
5: 4 7
2: 5 9 11
6: 4 5 11

Digite o seu numero USP 8
dig = 8
3: 1 6
1: 3 1 1 1.5
4: 1 6
5: 1 6
2: 3 4 7
6: 1 3 7

Digite o seu numero USP 9
dig = 9
3: 2 5
1: 5 2 2 2.5
4: 2 5
5: 2 5
2: 3 5 7
6: 2 3 7

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

Os trechos de programa abaixo tem como objetivo calcular o comprimento da
 maior palavra em um texto terminado por '.'.  
 Isto é feito com o auxílio da função abaixo:

  #define TRUE  1
  #define FALSE 0

  int e_separador (char ch)
  {
    if (ch==' ' || ch==',' || ch==';' || ch==':' || ch=='\n' || ch=='.')
      return TRUE;
    else 
      return FALSE;
  }


Esta função devolve TRUE (igual a 1) se o caractere ch é um separador (ou
seja, o caractere é considerado um separador de palavras, no caso pode ser
espaço em branco, vírgula, ponto, etc) e FALSE (igual a 0) caso contrário (ou
seja, o caractere ch não é considerado um separador de palavras). Suponha que
esses são os únicos separadores necessários, e portanto a função está correta.
Suponha também que as variáveis max e tam são inteiras e tem valor inicial 0
(zero), e que a é uma variável  tipo char.
  
Alguns dos cinco trechos abaixo estão corretos e outros estão incorretos.
Indique isso no lugar apropriado e faça um breve comentário sobre o erro
encontrado ao lado dos trechos que estiverem incorretos ou ao menos mostre
um contra exemplo. Questões marcadas incorretas sem justificativa ou com
justificativas óbvias do tipo ``trecho incorreto'', serão consideradas
erradas. 

Nesta questão, duas respostas erradas anulam uma certa. Respostas em branco
não serão consideradas erradas.




 a = ','; /* virgula */                        a) C ( )    I (x)
 while (a != '.') {
   scanf ("%c",&a);                         falta tam=0 no inicio de novas
   if (e_separador (a) == FALSE)            palavras
     tam ++;
   else
     if (tam > max)
       max = tam;
 }
 printf ("Tamanho da palavra mais longa: %d\n", max);


SOLUÇÃO. Incorreto. Faltou um tam = 0 no inicio de novas palavras


 a = ','; /* virgula */                         b) C (x)    I ( )
 while (a != '.') {
   if (e_separador (a) == FALSE) 
     tam ++;
   else
    tam = 0;
   if (tam > max)
     max = tam;
   scanf ("%c",&a);
 }
 printf ("Tamanho da palavra mais longa: %d\n", max);

SOLUÇÃO. Correto.


for (a = ','; a != '.'; tam ++) {               c) C (x)    I ( )
   scanf ("%c",&a);
   if (e_separador (a) == TRUE ) {
      if (tam >= max)
         max = tam;
      tam = -1;
   }
 }
 printf ("Tamanho da palavra mais longa: %d\n", max);

SOLUÇÃO. Correto.



a = ','; /* virgula */                          d) C ( )    I (x)
while (a != '.') {                          tamanho é sempre zero
   scanf ("%c",&a);                    
   if (e_separador (a) == FALSE) 
      tam++;
   else
      if (tam > max)
         max = tam;
   tam = 0;
   scanf("%c",&a);
 }
 printf ("Tamanho da palavra mais longa: %d\n", max);

SOLUÇÃO. tamanho é sempre zero.


 scanf ("%c",&a);                              e) C ( )    I (x)
 while (a != '.') {                     não funciona quando a maior palavra
   if (e_separador (a) == TRUE) {       é a última.
     if (tam >= max)
       max = tam;
     tam = 0;
   }
   else tam++;
   scanf ("%c",&a);
 }
 printf ("Tamanho da palavra mais longa: %d\n", max);

SOLUÇÃO.  Não funciona se a palavra maior é a última.

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

 Escreva a função cos que recebe um número real x (ângulo em radianos) e
 calcula o co-seno de x, através da série
cos(x) = 1 - x2/2! + x4/4! - x6/6! + ... + (-1)k x2k/(2k)! + ...
incluindo todos os termos até que
x2k/(2k)! < 0.00001

Inclua também na soma o último termo calculado. 

O protótipo dessa função deve ser

       double cos (double x);


SOLUÇÃO.

 double cos (double x)
 {
   double epsilon = 0.00001, termo = 1.0, cosx = 1.0;
   int k;
 
   for (k=1; termo >= epsilon || -termo >= epsilon; k++)
     {
       termo = -termo*x*x/((2*k-1)*2*k);
       cosx  = cosx + termo;
     }

   return cosx;
 }


----------------------------------------------------------------
QUESTÃO 4.
  
Utilizando obrigatoriamente a função da questão anterior (se você não a fez,
pode assumir que ela já existe, e com protótipo igual a da questão anterior),
faça um programa que leia dois números inteiros m e n e que imprima um
``gráfico'' do co-seno com m linhas e n colunas (ou seja, a largura de cada
linha chegará a no máximo n caracteres).
  
Para gerar o gráfico, o seu programa deve chamar a função coseno m vezes
com valores de x variando uniformemente entre 0 e 12.57 (ou seja, no
intervalo [0, 4*PI]).
  
Esse gráfico deve ser gerado utilizando-se chamadas à função 
printf ("*"); e a sua aparência deve ser similar ao seguinte 
exemplo onde n = 30 e m = 40 (note que o gráfico tem 40 linhas).

******************************
*****************************
**************************
***********************
*******************
**************
*********
*****
**


*
***
*******
************
****************
*********************
*************************
****************************
*****************************
*****************************
****************************
*************************
*********************
****************
***********
*******
***
*


**
*****
*********
**************
*******************
***********************
***************************
*****************************
*****************************


Nota: lembre-se que o valor da função co-seno varia entre -1 e 1. Portanto,
seu programa deve imprimir um número de `*' proporcional a 1 + cos(x).  O
gráfico começa com a linha representando cos(0) e termina com a linha
representando cos(4*pi).


SOLUÇÃO.


#include 
double cos (double x);

int main()
{
  int i, j, n, m;
  double x, y, incremento;

  printf("entre com os valores de m e n:");
  scanf("%d %d", &m, &n);

  incremento = 12.57/(m-1);
  x = 0.0;

  for (j = 0; j < m; j++)
    {
      y = n*(cos(x) + 1)/2;
      for (i = 0; i < (int) y; i++)
         printf("*");
      printf ("\n");
      x = x + incremento;
    }         
  return 0;   
}


Last modified: Tue May 14 09:37:49 EST 2002