MAC 115 – Introdução à Computação Instituto de Física – Segundo Semestre de 2005

Prova 2 – 25/11/2005

Instruções:

1. Não destaque folhas do caderno de soluções.

2. A prova pode ser feita a lápis. Cuidado com a legibilidade.

3. Não é permitido o uso de folhas avulsas para rascunho.

4. Não é necessário apagar rascunhos no caderno de soluções.

5. A duração da prova é de 1 hora e 40 minutos.

\underline{Questão 1} (valor: 4 pontos)

Simule a execução do programa abaixo, utilizando como dado de entrada o seu número USP. Como resposta, dê a saída do programa (tudo que é impresso).

#include <stdio.h>                            |  void selecao(int x[], int n)
#define NMAX 20                               |  {
                                              |    int i, k, min;
int ind_min(int x[], int k, int n);           |    for (k = 0; k < n; k++) {
void selecao(int x[], int n);                 |      for (i = 0; i < n; i++)
void troque(int *x, int *y);                  |        printf("%d ", x[i]);
void componha_vetor(int x[], int X, int n);   |      printf("\n");
                                              |      min = ind_min(x, k, n);
int main()                                    |      troque(&x[k], &x[min]);
{                                             |    }
  int n, v[NMAX];                             |    for (i = 0; i < n; i++)
  scanf("%d", &n);                            |      printf("%d ", x[i]);
  printf("%d\n", n);                          |    printf("\n");
  componha_vetor(v, n, 6);                    |  }
  selecao(v, 6);                              |
  return 0;                                   |  void troque(int *x, int *y)
}                                             |  {
                                              |    int t = *x;
int ind_min(int x[], int k, int n)            |    *x = *y; *y = t;
{                                             |  }
  int min = k, j;                             |
  for (j = k+1; j < n; j++)                   |  void componha_vetor(int x[], int X, int n)
    if (x[j]<x[min])                          |  {
      min = j;                                |    int i;
  return min;                                 |    for (i = 0; i < n; i++)
}                                             |      { x[i] = X % 10; X /= 10; }
/* Continua ao lado */                        |  }

\underline{Questão 2} (valor: 3 pontos)

Nesta questão, você deve escrever duas funções para manipular conjuntos finitos de inteiros. Para representar um conjunto A, você deve usar um vetor, digamos a, seguindo a convenção vista em sala: se A tem n elementos, então a[0] = n e A = {a[1], …, a[n]}.

(i) Escreva uma função de protótipo

  int pertence(int x, int a[]);

que, ao ser chamado com pertence(x, a), devolve “verdadeiro” se e só se o inteiro x pertence ao conjunto representado pelo vetor a.

(ii) Escreva uma função de protótipo

  void diferenca(int c[], int a[], int b[]);

que, ao ser chamado com diferenca(c, a, b), devolve no vetor c o conjunto representado pelo vetor a menos o conjunto representado pelo vetor b. Você deve usar a função pertence() de (i) acima, mesmo que você não a tenha feito.

Exemplo: Se A = {3, 1, 4, 5, 9} e B = {2, 7, 1, 8, 4, 6}, então o conjunto A menos o conjunto B (usualmente denotado A \ B) é {3, 5, 9}.

\underline{Questão 3} (valor: 3 pontos)

Escreva as duas funções abaixo.

(i) Escreva uma função de protótipo

  int maior_v(int v[], int n);

que, ao ser chamado com maior_v(v, n), devolve o maior inteiro dentre v[0],...,v[n-1]. Suponha que todos os elementos de v são não-negativos.

(ii) Escreva uma função de protótipo

  int maior_m(int a[][NMAX], int m, int n);

que, ao ser chamado com maior_m(a, m, n), devolve o maior inteiro presente na matrix a, de m linhas e n colunas. Suponha que todos os elementos de a são não-negativos. Você deve usar a função maior_v() de (i) acima, mesmo que você não a tenha feito.