Funções, vetores e matrizes

From Applied Science

Depois de aprender a utilizar funções, vetores e matrizes, é hora de aprender a utilizar matrizes e vetores como parâmetros de funções. Uma diferença que ocorre aqui diz respeito ao seguinte: considere que vetores ou matrizes não guardam um valor, mas um conjunto. Sendo assim, quando usados com funções, não se passam todos os valores do conjunto de uma vez. Apenas uma referência ao conjunto como um todo, o nome do vetor. Da mesma forma, a função não devolve o conjunto de valores, a função pode apenas devolver um valor que tenha algum tipo de relação com o vetor ou a matriz.

A questão da sintaxe, os colchetes terem o primeiro índice vazio, precisa de uma explicação tanto com relação à forma com que vetores são armazenados na memória quanto uma sobre os ponteiros. Por enquanto podemos aprender a utilizar vetores e funções sem pensar nisso.

Erros de lógica:

  • Os mesmos com matrizes e vetores em separado das funções;
  • Erros nas operações com matrizes ou vetores dentro da função costumam causar travamentos do programa;
  • Não é possível devolver uma matriz ou vetor, isso será explicado com o estudo dos ponteiros.


O que vem abaixo depende dos conhecimentos de vetores, matrizes e funções


  • Função que conta quantas vezes um número aparece num vetor:
/* recebe o vetor, o número máximo de elementos para comparar e o valor x
   a ser comparado com todos os valores do vetor[] */
int conte (int vetor[], int ind_max, int x) {
    int i, achei = 0;
    
    for (i = 0; i < ind_max; i++)
         if (vetor[i] == x)
             achei++;

return achei;
}

Problema bastante simples. É apenas uma operação de contagem e outra de comparação.


  • Função que conta quantas linhas de uma matriz tem todos os elementos com o mesmo valor:
/* Conta quantas linhas da matriz tem o mesmo número em todas as colunas 
   Se um elemento de uma linha for diferente do elemento na mesma linha
   e na coluna seguinte, pare 
   Se o laço não parou, então todos os elementos da linha são iguais,
   então conte uma linha encontrada */
int conte (int matriz[][max], int imax, jmax) {
    int i, lin_cont = 0;
    
    for (i = 0; i < imax; i++) {
         for (j = 0; j < jmax - 1; j++)
              if (matriz[i][j] != matriz[i][j + 1]) break;
         
         if (j == jmax)
             lin_cont++;
    }

return lin_cont;
}

O algoritmo é bastante simples, mas cuidado com a contagem! Preste bastante atenção à contagem dos índices! Como exercício, tente modificar este algoritmo para os seguintes problemas: conte quantas linhas da matriz são iguais a um número x; no lugar de linhas com um número que se repete, faça com colunas.


  • Função que multiplica matriz por matriz:
/* Recebe a matriz a, de n linhas e max colunas
   e a matriz b, de n linhas e m colunas. Multiplica
   a por b e armazena o resultado na matriz c, de 
   n linhas e mm colunas
   Se m colunas for diferente de nn linhas, devolva 0
   sem multiplicar as matrizes */
int multmat (int a[][max], int b[][max], int c[][max], int n, int m, int nn, int mm) {
     int i, j, k = 0;

     if (m != nn)
         return 0;

     for (i = 0; i < n; i++)
          for (j = 0; j < m; j++) {
               c[i][j] = 0;
              
               for (k = 0; k < mm; k++)
                    c[i][j] += a[i][k] * b[k][j];
          }
}

O algoritmo segue a regra da multiplicação de matrizes. É um pouco difícil de acompanhar porque são três laços em cascata. Aqui a velocidade do algoritmo é sacrificada em troca de um algoritmo que realiza a multiplicação elemento a elemento como se faria no papel.

O valor 0 serve para indicar que a multiplicação é impossível de ser realizada. Este é um típico caso onde a função inclui uma verificação para impedir que uma operação indevida seja realizada se a entrada for inválida.