MC102MN

Introdução a Algoritmos e programação de computadores

Prova 2

  1. Escreva uma função para, dado uma string com duas palavras separadas por um espaço, copiá-las para outra string com a ordem trocada. Ou seja, se eu tinha "casa vermelha" eu quero ter "vermelha casa" na outra string.

    Solução:

    void troca(char *a, char *b) {
      int i, j;
      for (i = 0; a[i] != ' '; i++);
      for (i = i+1, j = 0; a[i] != '\0'; i++,j++) {
         b[j] = a[i];
      }
      b[j] = ' ';
      for (i = 0, j=j+1; a[i] != ' '; i++,j++) {
        b[j] = a[i];
      }
      b[j] = '\0';
    }
    
  2. Me diga qual o valor de todas as variáveis após executar o seguinte bloco de código. Para variáveis que são ponteiros, me diga para qual variável ou elemento de vetor elas apontam agora. Para vetores, quero saber o valor de todos os elementos do vetor.
    int vetor[2], *p, a, **pp;
    pp = &p;
    p = vetor+1;
    vetor[0] = 0;
    vetor[1] = 1;
    a = *p;
    *pp -= 1;
    *p += 2*a;
    

    Solução:

    vetor[0] = 2, vetor[1] = 1, p = vetor[0], a = 1, pp = p
    
  3. Escreva o código para a seguinte função, que deve somar a matriz a pela matriz b e depois o resultado disso (que com certeza cabe na matriz tmp) deve multiplicar pela matriz c, e guardar o resultado disso na matriz r:
    void soma_mult(double *a, double *b, double *tmp, double *c, double *r,
               int alin, int acol, int blin, int bcol, int clin, int ccol) {
    
    int i,j,k;
    for (i = 0; i < alin; i++) 
      for (j = 0; j < acol; j++)
        tmp[acol*i+j] = a[acol*i+j]+b[acol*i+j];
    
    for (i = 0; i < alin; i++) {
      for (j = 0; j < ccol; j++) {
        r[ccol*i+j] = 0;
        for (k = 0; k < acol; k++) {
          r[ccol*i+j] += tmp[acol*i+k]*c[ccol*k+j];
        }
      }
     }
    }
    
  4. Imagine que eu preciso fazer um programa que guarde, para cada primo que eu tenho um número que indica de que tio ele é filho, o seu nome, o seu sexo (M ou F) e a sua idade. Defina uma struct que eu posso usar para guardar essa informação e escreva uma função para ler e outra para imprimir os dados de uma struct assim.
    struct primo {
      int tio;
      char nome[56], sexo;
      int idade;
    };
    
    Para ler
    struct primo le_primo() {
      struct primo p;
      scanf("%d %s %c %d", &p.tio, p.nome, &p.sexo, &p.idade);
      return p;
    }
    
    e escrever
    void esc_primo(struct primo p) {
      printf("%d %s %c %d", p.tio, p.nome, p.sexo, p.idade);
    }
    
  5. Faça uma função para calcular a função de Ackerman, tal que A(m,n) = n+1 se m = 0, A(m,n) = A(m-1, 1) se n = 0 e m > 0 e A(m,n) = A(m-1,A(m,n-1)) caso contrário.
    int A(int m, int n) {
      if (m == 0) return n+1;
      if ((m > 0) && (n == 0)) return A(m-1, 1);
      return A(m-1,A(m,n-1));
    }
    

Author: Alexandre Tachard Passos <alexandre.tp@gmail.com>

Date: 2010-10-23 11:55:20 BRST

HTML generated by org-mode 6.21b in emacs 23