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

MAC2166 Introdução à Computação

Prova Substitutiva


QUESTÃO 1

  Escreva um programa em C que lê e calcula uma aproximação do cosseno de x através da série infinita
cos(x) = 1 - x2/2! + x4/4! - x6/6! + . . . + (-1)k x2k/(2k)! + . . .
Inclua na aproximação todos os termos da série até o primeiro de valor absoluto (ou seja, módulo) menor do que epsilon. Inclua também na soma esse último termo calculado.

SOLUÇÃO

/* 
 * Solucao 1: curta e grossa
 *
 */
#include <stdio.h>

int main()
{
  float x;       
  float epsilon; /* precisao desejada */
  float termo;   /* termo da serie    */
  float cosx;    /* aproximacao do cosseno de x */
  int k;

  printf("Digite x e epsilon: ");
  scanf("%f %f", &x, & epsilon);

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

  printf("cos(x) = %f\n", cosx);
  return 0;
}

QUESTÃO 2

(a) Escreva uma função de nome ocorre que recebe como parâmetros de entrada e devolve 1 se v ocorre em w a partir da posição i, em caso contrário a função devolve 0.

Exemplo:
Para m = 5, n = 8,
0 1 2 3 4 5 ...       0 1 2 3 4 5 6 7 ...
v 4 -7 24 5 8 ... ...       w 4 6 4 -7 24 5 8 -7 ...

temos que v ocorre em w a partir de i=2 e v não ocorre em w a partir de i=0,1,3,4,5,6,7.

SOLUÇÃO

/* 
 * Solucao:
 */
#define MAX   1000
#define TRUE  1
#define FALSE 0

int ocorre(int m, int v[MAX], int n, int w[MAX], int i)
{
  int e_sub; /* indica se v[0..m-1] == w[i..i+m-1] */
  int j;     /* usado como indice dos vetor  v e w */

  /* verifique se w[i+m-1] e uma posicao valida do vetor w */
  if (i+m-1 > n)
    e_sub = FALSE;
  else 
    e_sub = TRUE;
  
  /* verifique se v[0..m-1] == w[i..i+m-1] */
  j = 0;
  while (j < m && e_sub == TRUE)
    {
      if (v[j] != w[i+j]) e_sub = FALSE;
      j = j + 1;
    }
  
  return e_sub;
}

(b) Escreva um programa em C que lê

e imprime uma mensagem indicando se a primeira seqüência ocorre ou não na segunda seqüência.

O seu programa deve utilizar a função ocorre do item (a). Caso você não tenha feito o item (a) escreva o protótipo da função ocorre antes da resolução deste item.

Exemplos:
  
Entrada: 
5 
4  -7   24   5   8
8
4   6   4  -7   24   5   8  -7
Saída:
SIM. A 1a. sequencia ocorre na 2a.

Entrada: 
3
1  2  3
4
1  2  2  3
Saída:
NAO. A 1a. sequencia nao ocorre na 2a.
  
Entrada: 
1
7
4
10  -2  -2  7
Saída:
SIM. A 1a. sequencia ocorre na 2a.

Entrada: 
3
1  2  3
4
3  2  1  2
Saída:
NAO. A 1a. sequencia nao ocorre na 2a.

SOLUÇÃO

/* 
 * Solucao:
 */
#include <stdio.h>

#define MAX   1000
#define TRUE  1
#define FALSE 0

int main() {
  int m;      /* numero de elementos na 1a. sequencia */
  int v[MAX]; /* numeros na primeira sequencia */
  int n;      /* numero de elementos  na 2a. sequencia */
  int w[MAX]; /* numeros na segunda sequencia */
  int i;      /* usada como indice dos vetores */
  int e_sub;  /* indica se a 1a. sequencia e' subsequencia da 2a. */

  /* 1. leia o numero de elementos da 1a. sequencia */
  printf("Digite m: ");
  scanf("%d", &m);
  
  /* 2. leia a 1a. sequencia */
  for (i = 0; i < m; i++) 
    {
      printf("Entre com o %io. numero da 1a. sequencia: ", i+1);
      scanf("%d", &v[i]);
    }
  
  /* 3. leia o numero de elementos da 2a. sequencia */
  printf("Digite n: ");
  scanf("%d", &n);
  
  /* 4. leia a 2a. sequencia */
  for (i = 0; i < n; i++) 
    {
      printf("Entre com o %io. numero da 2a. sequencia: ", i+1);
      scanf("%d", &w[i]);
    }
  
  /* 5. procure uma ocorrencia de v[0..m-1] em w[0..n-1] */
  e_sub = FALSE;
  i = 0;
  while (i <= n-m && e_sub == FALSE) 
    {
      e_sub = ocorre(m,v,n,w,i);
      i = i + 1;
    }
  
  /* 6. escreva a resposta */   
  if (e_sub == TRUE) 
    {
      printf("SIM. v[0..%d] == w[%d..%d].\n", m-1, i-1, i+m-2);
    }
  else
    {
      printf("NAO. A 1a. sequencia nao e subsequencia da 2a.\n");
    }

  return 0;
}

QUESTÃO 3

(a) Escreva uma função identidade que recebe como parâmetros e devolve em A a matriz identidade n × n.

Exemplo:
Para n = 3 devemos ter
A 0 1 2 3
0 1 0 0 ...
1 0 1 0 ...
2 0 0 1 ...
3 ... ... ... ...

As posições indicadas por ``...'' não foram alteradas pela função.

SOLUÇÃO

/*
 * Solucao:
 *
 */
#define MAX 100

void identidade (int n, int A[MAX][MAX])
{
  int i; /* indice de linha  */
  int j; /* indice de coluna */
  
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      if (i == j)
        A[i][j] = 1;
      else
        A[i][j] = 0;
}

(b) Escreva uma função multimat que recebe como parâmetros

e devolve em C o produto da matriz A pela matriz B, onde Ci,j = Ai,0 B0,j + Ai,1 B1,j + . . . + Ai,n-1 Bn-1,j.

Exemplo:
Para m=2, n=3, p=2
A 0 1 2 3       B 0 1 2
0 1 0 2 ...       0 1 0 ...
1 -1 2 1 ...       1 -1 1 ...
2 ... ... ... ...       2 3 1 ...
                3 ... ... ...
teremos
C 0 1 2
0 7 2 ...
1 0 3 ...
2 ... ... ...

SOLUÇÃO

/*
 * Solucao: A matriz C recebe o produto de A por B; C <- A x B 
 *
 */
void multimat (int m, int n, int p, 
               int C[MAX][MAX], int A[MAX][MAX], int B[MAX][MAX])
{
  int i;
  int j;
  int k;
  int prod[MAX][MAX]; /* matriz auxiliar para guardar o
  produto */

  for (i = 0; i < m; i++)
    for (j = 0; j < p; j++)
      {
        /* faz o produto da linha i de A pela coluna j de B */ 
        prod[i][j] = 0;
        for (k = 0; k < n; k++)
          prod[i][j] = prod[i][j] + A[i][k]*B[k][j];
      }      

  for (i = 0; i < m; i++)
    for (j = 0; j < p; j++)
      C[i][j] = prod[i][j];
}

(c) Escreva um programa em C que lê:

e imprime a matriz Ak.

O seu programa deve utilizar a função identidade do item (a) e a função multmat do item (b). Caso você não tenha feito o item (a) escreva o protótipo da função identidade antes da resolução deste item. Caso você não tenha feito o item (b) escreva o protótipo da função multimat antes da resolução deste item.

Exemplos:

Para n = 3 e
A 0 1 2 3
0 1 0 2 ...
1 -1 2 1 ...
2 0 -1 1 ...
3 ... ... ... ...
temos que
  
A elevada a 0:
   1   0   0
   0   1   0
   0   0   1
  
A elevada a 1:
   1   0   2
  -1   2   1
   0  -1   1

A elevada a 2:
   1  -2   4
  -3   3   1
   1  -3   0

A elevada a 3:
   3  -8   4
  -6   5  -2
   4  -6  -1

SOLUÇÃO

/*
 * Solucao:
 *
 */
#include <stdio.h>
#define MAX 100

int main()
{
  int A[MAX][MAX];  
  int n;    /* dimensao da matriz */
  int k;    /* potencia de A a ser calculada */

  int Ai[MAX][MAX]; /* usada para armazenar A^i */

  int i;
  int j;
    
  /* 0. leia a dimensao da matriz A */
  printf("Digite a dimensao da matriz: ");
  scanf("%d", &n);
    
  /* 1. leia a matriz A */
  for (i = 0; i < n; i++) 
    for (j = 0; j < n; j++)
      {
        printf("Digite o elemento (%d,%d) da matriz: ", i,j);
        scanf("%d", &A[i][j]);
      }

  /* 2. leia o valor da potencia a ser calculada */
  printf("Digite k: ");
  scanf("%d", &k);

  
  /* 3. inicialize Ai com a matriz identidade */
  identidade(n, Ai);   /* ai <- 1 */
  for (i = 0; i < k; i++) 
    {
      multimat(n, n, n, Ai, Ai, A); /* ai <- ai * a */
    }

  /* 4. imprima Ai */
  printf("A elevada a %d:\n", k);
  for (i = 0; i < n; i++)
    {
      for (j = 0; j < n; j++) 
        {
          printf(" %3d", Ai[i][j]);
        }
      printf("\n");
    }

  return 0;
}

 

 

 


Last modified: Wed Jul 6 09:33:50 BRT 2005