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


PROVA 3

QUESTÃO 1 (VERSÃO A).

Simule a execução do programa abaixo, destacando a saída do programa.
A saída do programa é tudo que resulta dos comandos printf. Como
entrada use os seguintes dados: 

      13    6     8    13   14   7    10    0 

#include < stdio.h >
#define MAX 10
int main()
{
  int aux, i, n, comeco, fim, vet[MAX];

  n = 0;
  scanf("%d", &(vet[n]));
  while(vet[n] != 0){
    n++;
    scanf("%d", &(vet[n]));
  }
  printf("Vetor inicial: ");
  for( i = 0; i <= n; i++) printf("%d ", vet[i]);
  printf("\n");
  comeco = 0; 
  fim = n-1;
  while (comeco < fim){
    while (vet[comeco] % 2 == 0 && comeco < fim) 
      comeco = comeco + 1;
    while (vet[fim] % 2 == 1 && comeco < fim)
      fim = fim - 1;
    if (comeco < fim){
      printf("Troca %d com %d\n", comeco, fim);
      aux = vet[comeco];
      vet[comeco] = vet[fim];
      vet[fim] = aux;
    }
  }
  printf("Vetor modificado: ");
  for( i = 0; i <= n; i++) printf("%d ", vet[i]);
  printf("\n");
  return (0);
}

SOLUÇÃO.

Vetor inicial: 13 6 8 13 14 7 10 0 
Troca 0 com 6
Troca 3 com 4
Vetor modificado: 10 6 8 14 13 7 13 0 


----------------------------------------------------------------

QUESTÃO 1 (VERSÃO B).

Simule a execução do programa abaixo, destacando a saída do programa.
A saída do programa é tudo que resulta dos comandos printf. Como
entrada use os seguintes dados: 

           10    7     14    13    8    6   13  0

#include < stdio.h >
#define MAX 10
int main()
{
  int aux, i, n, comeco, fim, vet[MAX];

  n = 0;
  scanf("%d", &(vet[n]));
  while(vet[n] != 0){
    n++;
    scanf("%d", &(vet[n]));
  }
  printf("Vetor inicial: ");
  for( i = 0; i <= n; i++) printf("%d ", vet[i]);
  printf("\n");
  comeco = 0; 
  fim = n-1;
  while (comeco < fim){
    while (vet[comeco] % 2 == 1 && comeco < fim) 
      comeco = comeco + 1;
    while (vet[fim] % 2 == 0 && comeco < fim)
      fim = fim - 1;
    if (comeco < fim){
      printf("Troca %d com %d\n", comeco, fim);
      aux = vet[comeco];
      vet[comeco] = vet[fim];
      vet[fim] = aux;
    }
  }
  printf("Vetor modificado: ");
  for( i = 0; i <= n; i++) printf("%d ", vet[i]);
  printf("\n");
  return (0);
}

SOLUÇÃO.

Vetor inicial: 10 7 14 13 8 6 13 0 
Troca 0 com 6
Troca 2 com 3
Vetor modificado: 13 7 13 14 8 6 10 0 

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

Dada uma matriz real A com m linhas e n colunas, dizemos que uma posição (i,j)
da matriz é um l-máximo se for o máximo da linha i, ou seja, se

         A[i][j] >= A[i][k] , para todo k=0,...,n-1.

De forma análoga, podemos definir que uma posição da matriz é um
\textbf{c-máximo} se for o elemento máximo da sua coluna.

Exemplos: Considere a matriz abaixo: 

        13    6     4    28    7.5    1.05 
         4    0   0.3   -13   12.3   128.1 
        -1    8     2  -1.9     12       2     
        -2    7     5     0      4      12    


o elemento  5 na posição (3,2) é um c-máximo; 
o elemento 12 na posição (2,4) é um l-máximo; 
o elemento 28 na posição (0,3) é um lc-máximo e 
o elemento  4 na posição (1,0) não é um máximo. 

Faça um programa em C que leia inteiros positivos m e n (onde 1 <= m <= 100 e
1 <= n <= 100), uma matriz real A com m linhas e n colunas, um inteiro k e em
seguida lê k pares de inteiros correspondentes a posições da matriz A e, para
cada posição indica se esta é um l-máximo, c-máximo, lc-máximo ou não é um
máximo.

SOLUÇÃO.

#include < stdio.h >
#define MMAX  100
#define NMAX  100
#define FALSE   0 
#define TRUE    1

void le_matriz (double mat[MMAX][NMAX], int *no_linhas, int *no_colunas)
{

  int m, n, i, j;

  printf("Entre com o numero de linhas e colunas da matriz: ");
  scanf("%d %d", &m, &n);

  for (i = 0; i < m ; i++) 
    {
      /* Leitura de i-esima linha da matriz */
      for (j = 0; j < n; j++) 
	{
          printf("Entre com o elemento da posicao (%d,%d): ", i, j);
          scanf("%lf", &mat[i][j]); 
	}
    }

  *no_linhas  = m;
  *no_colunas = n;
}

/* 
 * Funcao l_maxima devolve TRUE se o elemento na posica (linha,coluna) e' l-maximo 
 *                 devolve FALSE caso contraio.
 * no_colunas indica o numero de colunas da matriz mat.
 */
 
int l_maximo (double mat[MMAX][NMAX], int no_colunas,  int linha, int coluna)
{
  int j;
  
  for (j = 0; j < no_colunas; j++) 
    {
      if (mat[linha][j] > mat[linha][coluna])
	return FALSE;
    }

  return TRUE;
}

/* 
 * Funcao c_maxima devolve TRUE se o elemento na posica (linha,coluna) e' l-maximo 
 *                 devolve FALSE caso contraio.
 * no_linhas indica o numero de linhas da matriz mat.
 */

int c_maximo (double mat[MMAX][NMAX], int no_linhas,  int linha, int coluna)
{
  int i;
  
  for (i = 0; i < no_linhas; i++) 
    {
      if (mat[i][coluna] > mat[linha][coluna])
	return FALSE;
    }

  return TRUE;
}

int main()
{
  int 
    m, /* numero de linhas da matriz dada */
    n, /* numero de colunas da matriz dada */
    i,
    k, /* numero de posicoes a serem verificadas */
    linha, coluna, /* para guardar uma posicao da matriz */
    l_max, /* indica se o elemnto de uma posicao (linha,coluna) e' l-maximo */
    c_max; /* indica se o elemento de uma posicao (linha,coluna) e' c-maximo */

  double a[MMAX][NMAX];

  /* 1. Leia a matriz */
  le_matriz(a, &m, &n);

  /* 2. Leia o numero de pares */
  printf("Entre com o numero de posicoes: ");
  scanf ("%d", &k);

  /* 3. Verifique se uma dada posicao e' l-maxima, c-maxima ou lc-maxima */
  for (i = 1; i <= k; i++)
    {
      /* 3.1. Le uma posicao da matriz */
      printf("Entre com a %d posicao a ser verificada : ", i);
      scanf("%d %d", &linha, &coluna);
      
      /* 3.2. Verifica se o elemento na posicao (linha,coluna) e' l-maximo */
      l_max = l_maximo(a, n, linha, coluna);

      /* 3.3. Verifica se o elemento na posicao (linha,coluna) e' c-maximo */
      c_max = c_maximo(a, m, linha, coluna);

      /* 3.4 Escreve o resposta. */
      printf("o elemento %g da posicao (%d,%d) ",a[linha][coluna], linha, coluna);
      if (l_max == TRUE && c_max == TRUE)
	printf ("e' lc-maximo.\n"); 
      else if (l_max == TRUE) 
	printf ("e' l-maximo.\n");
      else if (c_max == TRUE) 
	printf ("e' c-maximo.\n");
      else
	printf ("nao e' maximo.\n");
    }

  return 0;
}

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

Notação: abaixo, a^b significa a elevado a b.

Escreva a função cos(x) que receba dois parâmetros de entrada: x e epsilon,
que definem o ângulo e a precisão desejada. Utilize a série abaixo para
calcular o cos(x):

cos(x) = 1- x^2/2! + x^4/4! - x^6/6! - ... + (-1)^k x^{2k}/(2k)! + ...


A função deve retornar a aproximação do valor do cosseno do ângulo x até o que
o termo x^{2k}/(2k)! seja menor que epsilon (INCLUA também esse último termo
x^{2k}(2k)! < epsilon  no cálculo do cosseno).


SOLUÇÃO.

double cosseno(double x, double epsilon)
{
  double cosx = 1, termo = 1;
  int    k = 1;

  while (termo <= -epsilon || epsilon <= termo)
    {
      termo = -termo * x * x / (k * (k+1));
      k = k + 2;
      cosx = cosx + termo;  
    }

  return cosx;
}


----------------------------------------------------------------

QUESTÃO 4.

Deseja-se desenvolver um programa em C que integre numericamente a função
cosseno, sobre o intervalo (a,b), onde -pi/2 <= a < b <= pi/2. Para isso
deve-se utilizar o método do trapézio, dado por:

integral da função cosseno no intervalo (a,b)=

            h/2 (f(a) + 2 f(a+h) + 2 f(a + 2 h) +...+ 2 f(a + (n-1) h) + f(b)),

onde:
       f(x) = cos (x);
       a e b definem o intervalo de integração, a < b;
       n - é o número de subintervalos, n >= 1;
       h - é constante e determinada por h = (b-a)/n.

Escreva um programa em C para calcular a integral da função cosseno no
intervalo (a,b) utilizando n trapézios.  Seu programa deve ler quatro valores:
a, b, n e epsilon.  Os 3 primeiros valores a, b e n definem o intervalo e
o número de trapézios usados para integração, e o valor epsilon define a
precisão a ser utilizada no cálculo dos cossenos. Ao final o seu programa deve
imprimir o valor da integral calculada através do método dos trapézios,
utilizando OBRIGATORIAMENTE a função cos definida na questão anterior, mesmo
que você não a tenha escrito.

SOLUÇÃO.

#include < stdio.h >

int main()
{
  double 
    a, b,     /* Define o intervalo (a,b) de integracao. */
    epsilon,  /* Precisao desejada */
    h,        /* medida da base do trapezio */
    integral; /* valor da integral do cosseno no intervalo (a,b) */

  int 
    i,
    n;  /* Numero de intervalos/trapezios. Dev ser >= 1. */

  printf("Calculo da funcao cosseno atraves do metodo dos trapezios.\n");

  /* 1. Leia dos dados */
  printf ("Entre com o intervalo de integracao: ");
  scanf ("%lf %lf", &a, &b);

  printf ("Entre com o numero de trapezios: ");
  scanf ("%d", &n);

  printf ("Entre com a precisao epsilon desejada: ");
  scanf ("%lf", & epsilon);

  /* 2. Calcule a base dos trapezios. */
  h = (b-a) / n;

  /* 3. Calcule a integral */
  integral = (cosseno(a, epsilon)+ cosseno(b, epsilon))/2;
  for (i = 1; i < n; i++) 
   {
     integral = integral + cosseno(a+i*h,epsilon);
   } 
  integral = h * integral;

  /* 4. Escreva o valor da integral. */
  printf("Valor da integral da funcao cosseno no intervalo (%g,%g) "
         "com %d trapezios e precisao %g = %g.\n", a, b, n, epsilon, integral);

  return 0;    
}



Last modified: Wed Jul 3 12:33:50 BRT 2002