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