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


PROVA Substitutiva


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 soma(int v[4], int w[4])
{
  int i;

  w[0] = 0;
  for (i = 1; i < 4; i++)
    w[i] = v[i-1] + 1;
}

int mole(int m, int *n)
{
  *n = m + *n;
  m = 11;
  return m;
}

int main()
{
  int m, n, p, i;
  int v[4], w[4];
  int nota;

  printf("Digite a unidade de seu NUSP: ");
  scanf("%d",&n);

  printf("Digite o seu NUSP: ");
  scanf("%d",&p);

  p = p%10;

  if (n != p){
    printf("Tirei zero nesta questao!\n");
    nota = 0;
    return nota;
  }
  else
    printf("Deu %d\n", n);

  printf("Vetor 1:");
  for (i = 0; i < 4; i++){
    v[i] = n + i;
    printf(" %d",v[i]);
  }
  printf("\n");

  soma(v,w);
  printf("Vetor 2:");
  for (i = 0; i < 4; i++)
    printf(" %d",w[i]);
  printf("\n");

  soma(v,v);
  printf("Vetor 3:");
  for (i = 0; i < 4; i++)
    printf(" %d",v[i]);

  printf("\n");

  m = n*p;
  p = mole(m, &n);

  printf("Vetor 4: %d %d %d\n", m, n, p);

  return 0;
}

SOLUÇÃO. A resposta depende, essencialmente, do unidade do número USP. Para NUSP 1234567 a unidade é 7. Teste com o seu no. USP e compare a resposta.

(0) unidade == 0

Digite a unidade de seu NUSP: 0
Digite o seu NUSP: 0
Deu 0
Vetor 1: 0 1 2 3
Vetor 2: 0 1 2 3
Vetor 3: 0 1 2 3
Vetor 4: 0 0 11

(1) unidade == 1

Digite a unidade de seu NUSP: 1
Digite o seu NUSP: 1
Deu 1
Vetor 1: 1 2 3 4
Vetor 2: 0 2 3 4
Vetor 3: 0 1 2 3
Vetor 4: 1 2 11

(2) unidade == 2

Digite a unidade de seu NUSP: 2
Digite o seu NUSP: 2
Deu 2
Vetor 1: 2 3 4 5
Vetor 2: 0 3 4 5
Vetor 3: 0 1 2 3
Vetor 4: 4 6 11

(3) unidade == 3

Digite a unidade de seu NUSP: 3
Digite o seu NUSP: 3
Deu 3
Vetor 1: 3 4 5 6
Vetor 2: 0 4 5 6
Vetor 3: 0 1 2 3
Vetor 4: 9 12 11

(4) unidade == 4

Digite a unidade de seu NUSP: 4
Digite o seu NUSP: 4
Deu 4
Vetor 1: 4 5 6 7
Vetor 2: 0 5 6 7
Vetor 3: 0 1 2 3
Vetor 4: 16 20 11

(5) unidade == 5

Digite a unidade de seu NUSP: 5
Digite o seu NUSP: 5
Deu 5
Vetor 1: 5 6 7 8
Vetor 2: 0 6 7 8
Vetor 3: 0 1 2 3
Vetor 4: 25 30 11

(6) unidade == 6

Digite a unidade de seu NUSP: 6
Digite o seu NUSP: 6
Deu 6
Vetor 1: 6 7 8 9
Vetor 2: 0 7 8 9
Vetor 3: 0 1 2 3
Vetor 4: 36 42 11

(7) unidade == 7

Digite a unidade de seu NUSP: 7
Digite o seu NUSP: 7
Deu 7
Vetor 1: 7 8 9 10
Vetor 2: 0 8 9 10
Vetor 3: 0 1 2 3
Vetor 4: 49 56 11

(8) unidade == 8

Digite a unidade de seu NUSP: 8
Digite o seu NUSP: 8
Deu 8
Vetor 1: 8 9 10 11
Vetor 2: 0 9 10 11
Vetor 3: 0 1 2 3
Vetor 4: 64 72 11

(9) unidade == 9

Digite a unidade de seu NUSP: 9
Digite o seu NUSP: 9
Deu 9
Vetor 1: 9 10 11 12
Vetor 2: 0 10 11 12
Vetor 3: 0 1 2 3
Vetor 4: 81 90 11

QUESTÃO 2.

Faça um programa que lê

  1. um número inteiro m, 0<m<1000,
  2. uma seqüência de m números inteiros,
  3. um número inteiro n, 0<m<n<1000,
  4. uma seqüência de n números inteiros,
e imprime uma mensagem indicando se a primeira seqüência é ou não subseqüência da segunda. Exemplos:
Entrada: 
5 
4  -7   24   5   8
8
4   6   4  -7   24   5   8  -7
Saída:
SIM

Entrada: 
3
1  2  3
4
1  2  2  3
Saída:
NAO

Entrada: 
1
7
4
10  -2  -2  7
Saída:
SIM

Entrada: 
3
1  2  3
4
3  2  1  2
Saída:
NAO

SOLUÇÃO.

/*
 * VERSÃO 1:  simples curta e grossa.
 * 
 */
#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 j;      /* usada como indice do vetor w */
  int iguais; /* usada para verifica se v[0..m-1] == w[i..i+m-1] */
  int e_sub;  /* indica se a 1a. sequencia e' subsequencia da 2a. */

  /* 1. leia o numero de elementos da 1a. sequencia */
  printf("Entre com 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("Entre com 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;
  for (i = 0; i <= n-m; i++) 
    {
      /* verifique se v[0..m-1] == w[i..i+m-1] */
      iguais = TRUE;
      for (j = 0; j < m; j++) 
	{
	  if (v[j] != w[i+j]) 
            iguais = FALSE;
	}
      if (iguais == TRUE) e_sub = TRUE;
    }
      
  if (e_sub == TRUE) 
    {
      printf("SIM. A 1a. sequencia e subsequencia da 2a.\n");
    }
  else
    {
      printf("NAO. A 1a. sequencia nao e subsequencia da 2a.\n");
    }
  
  return 0;
}


NA TELA:
Entre com m: 5
Entre com o 1o. numero da 1a. sequencia: 4
Entre com o 2o. numero da 1a. sequencia: -7
Entre com o 3o. numero da 1a. sequencia: 24
Entre com o 4o. numero da 1a. sequencia: 5
Entre com o 5o. numero da 1a. sequencia: 8
Entre com n: 8
Entre com o 1o. numero da 2a. sequencia: 1
Entre com o 2o. numero da 2a. sequencia: 6
Entre com o 3o. numero da 2a. sequencia: 4
Entre com o 4o. numero da 2a. sequencia: -7
Entre com o 5o. numero da 2a. sequencia: 24
Entre com o 6o. numero da 2a. sequencia: 5
Entre com o 7o. numero da 2a. sequencia: 8
Entre com o 8o. numero da 2a. sequencia: -7
SIM. A 1a. sequencia e subsequencia da 2a.

Entre com m: 3
Entre com o 1o. numero da 1a. sequencia: 1
Entre com o 2o. numero da 1a. sequencia: 2
Entre com o 3o. numero da 1a. sequencia: 3
Entre com n: 4
Entre com o 1o. numero da 2a. sequencia: 1
Entre com o 2o. numero da 2a. sequencia: 2
Entre com o 3o. numero da 2a. sequencia: 2
Entre com o 4o. numero da 2a. sequencia: 3
NAO. A 1a. sequencia nao e subsequencia da 2a.

Entre com m: 3
Entre com o 1o. numero da 1a. sequencia: 1
Entre com o 2o. numero da 1a. sequencia: 2
Entre com o 3o. numero da 1a. sequencia: 3
Entre com n: 3
Entre com o 1o. numero da 2a. sequencia: 1
Entre com o 2o. numero da 2a. sequencia: 2
Entre com o 3o. numero da 2a. sequencia: 3
SIM. A 1a. sequencia e subsequencia da 2a.


/*
 * VERSÃO 2: Variante da versao 1. Indica as posicoes onde a 1a. sequencia
 *  ocorre na 2a. Deixa de comparar assim que detecta a ocorrencia.
 *
 */
#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 j;      /* usada como indice do vetor w */
  int iguais; /* usada para verifica se v[0..m-1] == w[i..i+m-1] */
  int e_sub;  /* indica se a 1a. sequencia e' subsequencia da 2a. */

  /* 1. leia o numero de elementos da 1a. sequencia */
  printf("Entre com 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("Entre com 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;
  for (i = 0; i <= n-m && e_sub == 0; i++) 
    {
      /* verifique se v[0..m-1] == w[i..i+m-1] */
      iguais = TRUE;
      for (j = 0; j < m && iguais == TRUE; j++) 
	{
	  if (v[j] != w[i+j]) iguais = FALSE;
	}
      if (iguais == TRUE) e_sub = TRUE;
    }
   
  /* 6. imprima 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;
}


NA TELA:
Entre com m: 5
Entre com o 1o. numero da 1a. sequencia: 4
Entre com o 2o. numero da 1a. sequencia: -7
Entre com o 3o. numero da 1a. sequencia: 24
Entre com o 4o. numero da 1a. sequencia: 5
Entre com o 5o. numero da 1a. sequencia: 8
Entre com n: 8
Entre com o 1o. numero da 2a. sequencia: 4
Entre com o 2o. numero da 2a. sequencia: 6
Entre com o 3o. numero da 2a. sequencia: 4
Entre com o 4o. numero da 2a. sequencia: -7
Entre com o 5o. numero da 2a. sequencia: 24
Entre com o 6o. numero da 2a. sequencia: 5
Entre com o 7o. numero da 2a. sequencia: 8
Entre com o 8o. numero da 2a. sequencia: -7
SIM. v[0..4] == w[2..6].

Entre com m: 5
Entre com o 1o. numero da 1a. sequencia: 4
Entre com o 2o. numero da 1a. sequencia: -7
Entre com o 3o. numero da 1a. sequencia: 24
Entre com o 4o. numero da 1a. sequencia: 5
Entre com o 5o. numero da 1a. sequencia: 8
Entre com n: 8
Entre com o 1o. numero da 2a. sequencia: 4 
Entre com o 2o. numero da 2a. sequencia: 6
Entre com o 3o. numero da 2a. sequencia: 4
Entre com o 4o. numero da 2a. sequencia: 4
Entre com o 5o. numero da 2a. sequencia: -7
Entre com o 6o. numero da 2a. sequencia: 24
Entre com o 7o. numero da 2a. sequencia: 5
Entre com o 8o. numero da 2a. sequencia: 8
SIM. v[0..4] == w[3..7].


/*
 * VERSÃO 3: Variante da versao 1. Indica as posicoes onde a 1a. sequencia
 *  ocorre na 2a. Pára o programa assim que detecta a ocorrencia.
 *
 */
#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 j;      /* usada como indice do vetor w */
  int iguais; /* usada detectar se v ocorre em w */

  /* 1. leia o numero de elementos da 1a. sequencia */
  printf("Entre com 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("Entre com 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] */
  for (i = 0; i <= n-m; i++) 
    {
      /* verifique se v[0..m-1] == w[i..i+m-1] */
      iguais = TRUE;
      for (j = 0; j < m && iguais == TRUE; j++) 
	{
	  if (v[j] != w[i+j]) iguais = FALSE;
	}
      if (iguais == TRUE)
	{
	  printf("SIM. v[0..%d] == w[%d..%d].\n", m-1, i, i+m-1);
          return 0;
	}
    }

  /* neste ponto sabemos que v[0..m-1] nao ocorre em w[0..n-1] */
  printf("NAO. A 1a. sequencia nao e subsequencia da 2a.\n");
  return 0;
}

QUESTÃO 3

Esta questão consiste na implementação de duas funções e do main. Em todas elas, no lugar conveniente, você pode supor que já existam as seguintes linhas:

#include <stdio.h>
#define MAX 1024
Seja A uma matriz de elementos inteiros diferentes 2-a-2. O sucessor do elemento A[i][j] é: Por exemplo, na matriz abaixo, o sucessor de 13 é o 5, o sucessor de 5 é o 17, o sucessor de 17 é o 0, o sucessor de 0 é o 9, ..., o sucessor de 3 é o 15, ..., e o 7 não tem sucessor.
  13  5 17  0
   9 -1  6  3
  15 10 20  7 

Dizemos que a matriz está ordenada se cada elemento dela é menor do que seu sucessor. Exemplo de matriz ordenada:

  -1  0  3  5
   6  7  9 10
  13 15 17 20 
Exemplo de matrizes que não estão ordenadas:
  -1  0  3  5       -1  0  5  3                -1  0  3  5  
  13 15 17 20        6  7  9 10                 6  7  9 13  
   6  7  9 10       13 15 17 20                10 15 17 20  

Item (a) Escreva uma função de protótipo
 int verifica_ordem(int A[MAX][MAX], int m, int n, int *lin, int *col);

que recebe uma matriz A com m linhas e n colunas e devolve 1 se a matriz está ordenada e 0 caso contrário. Além disso, no caso da matriz não estar ordenada, a função devolve em *lin e *col os índices de um elemento A[*lin][*col] que seja maior que o seu sucessor.

Exemplos: Para m==3, n==4, e matriz

  -1  0  3  5
   6  7  9 10
  13 15 17 20 
a função devolve 1.
Para m==3, n==4, e matriz
  -1  0  3  5
  13 15 17 20 
   6  7  9 10
o valor de *lin determinado pela função deve ser 1, o valor de *col deve ser 3, e a função devolve 0.
Para m==3, n==4, e matriz
  -1  0  3  5
  13 17 15 20 
   6  7  9 10
os valores de *lin e *col podem ser 1 e 3, ou 1 e 1, tanto faz, e a função devolve 0.

SOLUÇÃO.

/*
 * VERSÃO 1
 *
 */
int verifica_ordem(int A[MAX][MAX], int m, int n, int *lin, int *col)
{
  int ordenada; /* indica se a matriz esta ordenada */
  int i;  /* usado como indices de linhas */
  int j;  /* usado como indices de colunas */

  ordenada = 1; /* esta ordenada ate que se prove o contrario */
  for (i = 0; i < m; i++) 
    {
      for (j = 0; j < n-1; j++)
	{
          if (A[i][j] > A[i][j+1]) 
	    {
              *lin = i; 
              *col = j;
              ordenada = 0;
	    }
	} 
      if (i != m-1) /* A[m-1][n-1] nao possui sucessor */
	{
	  if (A[i][n-1] > A[i+1][0]) 
	    {
	      *lin = i; 
	      *col = j;
	      ordenada = 0;
	    }
	}
    }
  
  return ordenada;
}s

/*
 * VERSÃO 2
 *  
 */
int verifica_ordem(int A[MAX][MAX], int m, int n, int *lin, int *col)
{
  int ordenada; /* indica se a matriz esta ordenada */
  int i;    /* usado como indices de linhas */
  int j;    /* usado como indices de colunas */
  int isuc; /* indice da linha do sucessor de A[i][j] */
  int jsuc; /* indice da coluna do sucessor de A[i][j] */

  ordenada = 1; /* esta ordenada ate que se prove o contrario */
  for (i = 0; i < m; i++) 
    {
      for (j = 0; j < n; j++)
	{
          if (i != m-1 || j != n-1) 
	    {
	      if (j < n-1) 
		{
		  isuc = i;
		  jsuc = j+1;
		}
	      else
		{
                  isuc = i+1;
		  jsuc = 0;
		}
	      if (A[i][j] > A[isuc][jsuc]) 
		{
		  *lin = i; 
		  *col = j;
		  ordenada = 0;
		}
	    } 
	}
    }
  
  return ordenada;
}

Item (b)

Escreva uma função de protótipo

    void troca(int A[MAX][MAX], int m, int n, int lin, int col);
que recebe uma matriz A com m linhas e n colunas e troca o valor do elemento A[lin][col] com o valor de seu sucessor. Você pode supor que o elemento A[lin][col] tem sucessor.

Exemplo: Para m==3, n==4, lin==0, col==3, e matriz

  -1  0  3  5
  13 17 15 20 
   6  7  9 10
a matriz determinada pela função deve ser
  -1  0  3 13
   5 17 15 20 
   6  7  9 10

SOLUÇÃO.

/*
 * Solucao simples, curta e grossa.
 *
 */
void troca(int A[MAX][MAX], int m, int n, int lin, int col)
{
  int aux; /* variavel auxiliar usada na troca */
  
  aux = A[lin][col];
  if (col != n-1) 
    {
      A[lin][col] = A[lin][col+1];
      A[lin][col+1] = aux;   
    }
  else
    {
      A[lin][col] = A[lin+1][0];
      A[lin+1][0] = aux;
    }
}     

Item (c)

Escreva um programa que lê dois inteiros m e n e uma matriz A de inteiros com m linhas e n colunas. Seu programa deve ordenar a matriz A e imprime a matriz ordenada. Você pode supor que 0 < m <= 50, 0 < n <= 50, e que os elementos da matriz A são 2-a-2 distintos.

Sugestão: Você pode usar as funções dos itens (a) e (b), mesmo que não as tenha feito, e ir trocando elementos da matriz até obter uma matriz ordenada.

Exemplo: Para m==3, n==4, e matriz

  13  5 17  0
   9 -1  6  3
  15 10 20  7 
seu programa deve determinar e imprimir a matriz
  -1  0  3  5
   6  7  9 10
  13 15 17 20 

SOLUÇÃO.

int main()
{
  int A[MAX][MAX]; 
  int m; /* numero de linhas da matriz  A */
  int n; /* numero de colunas da matriz A */
  int i; /* indice das linhas da matriz */
  int j; /* indice das colunas da matriz */

  /* 1. leia o numero de linhas da matriz */
  printf("Entre com o numero de linhas: ");
  scanf("%d", &m);

  /* 2. leia o numero de colunas da matriz */
  printf("Entre com o numero de colunas: ");
  scanf("%d", &n);

  /* 3. leia os elementos da matriz */
  for (i = 0; i < m; i++) 
    {
      for (j = 0; j < n; j++) 
	{
          printf("Entre com o elemento da posicao (%d,%d): ", i,j);
          scanf("%d", &A[i][j]);
	}
    }
 
  /* 4. ordene a matriz */
  while (verifica_ordem(A, m, n, &i, &j) == 0) 
    {
      troca(A, m, n, i, j);
    }


  /* 5. imprima a matriz ordenada */
  for (i = 0; i < m; i++) 
    {
      for (j = 0; j < n; j++) 
	{
          printf(" %d",A[i][j]);
	}
      printf("\n");
    }

 
  return 0;
}

Last modified: Fri Jul 11 17:08:59 EST 2003