Programação C/C++
Prof. Márcio Sarroglia Pinho

Matrizes e Vetores

Declaração de Matrizes e Vetores Acesso aos elementos Exemplos com Vetores Passagem de Matrizes e Vetores como Parâmetro(por valor)
Passagem dos Elementos de Matrizes e Vetores como Parâmetro Acesso a uma linha de uma matriz
Cuidados com os limites dos índices de Matrizes e Vetores
Passagem de Matrizes e Vetores como Parâmetro(por referência)
Exemplos com Matrizes


Introdução

            Uma matriz é uma coleção de variáveis de mesmo tipo, acessíveis com um único nome e armazenados contiguamente na memória.

            A individualização de cada variável de um vetor é feita através do uso de índices.

            Os Vetores são matrizes de uma só dimensão.


Declaração de Matrizes

        int Vetor[5];   // declara um vetor de 5 posições

        int Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas


Acesso aos elementos do vetor

            Para acessar os elementos de um vetor usa-se índices. O índice define a posição da variável dentro do vetor.

            Em todos os vetores tem o primeiro elemento na posição 0(zero). Assim, se tomarmos "K" como sendo o tamanho do vetor a última posição é a de índice "K-1"

               Vetor[0] = 4; // Coloca 4 na primeira posição de "Vetor"
               Vetor[4] = 8; // Coloca 8 na última posição de "Vetor"


Exemplos com Vetores

    int Vetor[5];  // declara um vetor de 5 posições

    int Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas

        Vetor[0] = 9; // coloca 9 na primeira posição do vetor
        Vetor[4] = 30 // coloca 30 na última posição do vetor

        Matriz[0][1] = 15; // coloca 15 na célula que está na primeira linha
                           // e na segunda coluna da matriz

Preenchimento de um vetor com um dado

     for(i=0; i<5; i++)                  for(i=0; i<=4; i++)
        Vetor[i] = 30;                      Vetor[i] = 30;      

Colocar os números de 1 a 5 em Vetor

     for(i=0; i<5; i++)
       Vetor[i] = i+1;

Colocar os números de 5 a 1 em Vetor

     for(i=0; i<5; i++)
       Vetor[i] = 5-i;

Uso de Constantes para definir o tamanho de um vetor

    #define TAM_MAX 10

    double VetReais[TAM_MAX];

    for(i=0; i<TAM_MAX; i++)
       VetReais[i] = TAM_MAX - i;  // coloca 5,4,3,2,1 no vetor

Copiar os dados de um vetor para outro

    #define TAM_MAX 10

    double VetReais[TAM_MAX], Copia[TAM_MAX];

    for(i=0; i<TAM_MAX; i++)
       VetCopia[i] = VetReais[i];  // Copia os dados de um vetor
                                   // para outro

Copiar os dados de um VET1 para as primeiras 5 posições de COPIA e VET2 para as outras 5

    #define TAM_MAX 10

    // Note que a declaração do vetor "Cópia" cria o dobro de posições
    double Vet1[TAM_MAX], Vet2[TAM_MAX], Copia[TAM_MAX*2];

    for(i=0; i<TAM_MAX; i++)
       VetCopia[i] = Vet1[i];  // Copia os dados do primeiro vetor

    for(i=0; i<TAM_MAX; i++)   // Copia os dados do segundo vetor
       VetCopia[i+TAM_MAX] = Vet2[i]; 

// ****** Pergunta: Como fazer a cópia usando um único comando for ?

Leitura dos dados de um um vetor               

  #define TAM_MAX 10

    double Vet1[TAM_MAX];

    for(i=0; i<TAM_MAX; i++)
       scanf("%f",&Vet1[i]);

Encontrar o maior valor dentro de um vetor               

  #define TAM_MAX 10

    double Vet1[TAM_MAX];
    double Maior;

    for(i=0; i<TAM_MAX; i++)
       scanf("%f",&Vet1[i]);// le os   dados

    Maior = Vet1[0];  // assume que o primeiro é o maior
    for(i=0; i<TAM_MAX; i++)
       if Vet1[i] > Maior
          Maior = Vet1[i];

    printf("O maior elemento é %f\n",Maior);

// ****** Pergunta: Como fazer a mesma busca e imprimir também a
// ****** posição do dado dentro do vetor. Tente fazer isto usando
// ****** apenas 1 variável.

Crie um programa que copie para um vetor os elementos de outro em ordem crescente.

// A ideia aqui é encontrar o menor elemento do vetor 1 e colocar no vetor 2. Tirar este número de vet1, por exemplo,
// colocando no seu lugar, no vetor 1, um número grande e recomeçar a busca pelo novo número menor.

  #define TAM_MAX 10

    double Vet1[TAM_MAX], VetOrdenado[TAM_MAX];
    double Menor, Maior;

    for(i=0; i<TAM_MAX; i++)
       scanf("%f",&Vet1[i]);// le os   dados

    PosMaior = 0;  // assume que o maior está na 1a. posição
    for(i=0; i<TAM_MAX; i++)
       if Vet1[i] > Vet1[PosMaior]
          PosMaior = i;   // acha a posição do maior

    for(j=0; j<TAM_MAX;j++)
    {
      PosMenor = 0;  // assume que o primeiro é o menor
      for(i=0; i<TAM_MAX; i++)
         if Vet1[i] < Vet1[PosMenor]
           PosDoMenor = i;
      VetOrdenado[j]= Vet1[PosMenor]; // copia menor para o novo vetor
// inutiliza a posição do menor colocando nela um número grande
      Vet1[PosMenor] = Vet1[PosMaior]; // no caso o maior do vetor
                              
   }

   for(i=0; i<TAM_MAX; i++)
       print("%f\n",VetOrdenado[i]);// Imprime os dados


Passagem de Matrizes e Vetores como Parâmetro

            Para passar uma matriz ou vetor como parâmetro, basta declarar o parâmetro da mesma forma que a matriz/vetor foi declarado.

            Por definição da linguagem C, um vetor é sempre passado por referência, logo, qualquer alteração em seus elementos, altera a variável usada como parâmetro na chamada da rotina.

    #include <stdio.h>

    #define TAM_MAX 10

    void ImprimeVet (int Tam, int Vet[TAM_MAX])
    {
        int i;
        for (i=0; i< Tam; i++)
        {
          printf("%d", Vet[i]);
        }    
    }

    int main()
    {
      int Notas[TAM_MAX];

        ImprimeVet(TAM_MAX, Notas); // Passa o vetor 'Notas' como
                                     // parâmetro

        return 0;

    }


Exemplos com Matrizes


    #define NLIN 10
    #define NCOL 10
    int Matriz[NLIN][NCOL];

Preencher uma matriz com um dado

   for(i=0; i < NLIN; i++)     
       for(j=0; j < NCOL; j++)    
        Matriz[i][j] = 30;

Somar um número a uma linha/coluna de uma matriz

void SomaValorNaColuna(int Valor, int Matriz[NLIN][NCOL], int Coluna)
{
   for(i=0; i < NLIN; i++) // para cada linha de 'Coluna'
     Matriz[i][Coluna] = Matriz[i][Coluna] + 30;
}

Criar uma matriz identidade

void CriaIdent(int Colunas, int linhas, int Matriz[NLIN][NCOL])
{
  
}

Criar uma matriz transposta

void CriaTransp(int Colunas, int linhas,
                int Matriz[NLIN][NCOL], int Trasposta[NLIN][NCOL])
{
  
}

Cria uma rotina que some duas matrizes

void SomaMatrizes(int Colunas, int linhas,
                  int MatrizA[NLIN][NCOL], int MatrizB[NLIN][NCOL],
                  int MatrizSOMA[NLIN][NCOL])
{
  
}

Cria uma rotina que multiplique duas matrizes

void MultMatrizes(int Colunas, int linhas,
                  int MatrizA[NLIN][NCOL], int MatrizB[NLIN][NCOL],
                  int MatrizMULT[NLIN][NCOL])
{

}


Acesso a uma linha de uma matriz

Uma linha de uma matriz é vista, em C, como sendo um vetor. O acesso à linha é feito informando apenas a primeira das dimensões da matriz.
No exemplo a seguir as funções
InicializaVet e ImprimeVet
são usadas para manipular os dados de cada uma das linhas de uma matriz.

#include <stdio.h>

#define NLinhas 10
#define NColunas 5

void ImprimeVet(int Vet[NColunas])
{
    int i;
    for(i = 0; i < NColunas; i++) {
    printf("%d ", Vet[i]);
    }
}
void InicializaVet(int Vet[NColunas], int n)
{
    int i;
    for(i = 0; i < NColunas; i++) {
    Vet[i] = i * n;
    }
}

int main()
{
    int Matriz[NLinhas][NColunas];

    int i;
    for(i = 0; i < NLinhas; i++) {
        InicializaVet(Matriz[i], i);
        printf("\n");
    }

    for(i = 0; i < NLinhas; i++) {
        ImprimeVet(Matriz[i]);
        printf("\n");
    }
    return 0;
}




Cuidados com os limites dos índices de Matrizes e Vetores

A linguagem C não faz nenhum teste de verificação dos índices usados para acessar os elementos de um vetor.

Isto significa que, se estes limites não forem respeitados, resultados indesejados serão obtidos.

No exemplo a seguir, a matriz int M[2][3] é acessada com índices fora dos limites corretos, o que gera um resultado diferente do esperado.

#include <stdio.h>


void ImprimeVet(int Vet[3])
{
    int i;
    for(i = 0; i < 3; i++) {
    printf("%d ", Vet[i]);
    }
}

int main()
{
    int Matriz[2][3];

    int i;
    for(i = 0; i < 10; i++)
    {
        Matriz[0][i] = i;  // a matriz tem 3 colunas, mas o laço do for vai até 10
    }

    for(i = 0; i < 2; i++) {
        ImprimeVet(Matriz[i]);
    printf("\n");
    }
    return 0;
}


No caso deste exemplo, no primeiro for, após atribuir um valor para a posição Matriz[0][2], o código avança sobre os dados da segunda linha, mesmo sendo a linha definida como 0, como se pode observar na saída do programa, apresentada a seguir:

0 1 2
3 4 5

Outro exemplo, desta vez usando strings, também ocorre o mesmo problema, neste caso porque a string colocada em cada linha da matriz é maior do que os espaço disponível para armazená-la.

#include <stdio.h>
#include <string.h>

void ImprimeVet(int Vet[3])
{
    int i;
    for(i = 0; i < 3; i++) {
    printf("%d ", Vet[i]);
    }
}

int main()
{
    char Texto[2][17];

    int i;

    strcpy(Texto[0], "Aula de Programacao");  // esta string não cabe na linha
da matriz
                                             
    strcpy(Texto[1], "em linguagem C."); 

    for(i = 0; i < 2; i++) {
        printf("%s\n", Texto[i]);
    }
    return 0;
}


A saída do programa é :

Aula de Programacem linguagem C.
em linguagem C.


Passagem dos Elementos de Matrizes e Vetores como Parâmetro (por valor)

A passagem dos elementos de um vetor como parâmetro é idêntica à passagem de uma variável. Ou seja, quando a passagem for por valor usa-se vet[i] e quando for por referência usa-se &vet[i].

    #include <stdio.h>
    #include <string.h>
    void Imprime (int N) // função com um parâmetro por valor
    {
        printf("%d", N);
    }

    int main()
    {
        int i;

        int Vet[10];

        for(i = 0; i < 10; i++)
        {
            Vet[i] = i;
        }      
        for (i=0; i< 10; i++)
        {
           Imprime(Vet[i]);// passa o valor de cada um dos elementos do vetor como parâmetro
        }
        return 0;
      }

A saída do programa é :
0123456789


Sugere-se, antes da leitura das próximas seções, a consulta à página sobre ponteiros.


Passagem dos Elementos de Matrizes e Vetores como Parâmetro (por referência)

A passagem dos elementos de um vetor como parâmetro é idêntica à passagem de uma variável. Ou seja, quando a passagem for por valor usa-se vet[i] e quando for por referência usa-se &vet[i].

   #include <stdio.h>
   #include <string.h>

    void Imprime (int N) // função com um parâmetro por valor
    {
        printf("%d", N);
    }

   void Set (int *N, int i) // função com um parâmetro por referência
    {
      *N = i;
    }

   int main()
    {
        int i;

        int Vet[10];

        for (i=0; i< 10; i++)
        {
           Set(&Vet[i], i); // Note que é preciso colocar o '&' antes
                          // de Vet[i] pois a função 'Incr' espera um
                          // parâmetro por REFERÊNCIA

           Imprime(Vet[i]); // Note que NÃO se deve colocar nada antes
                            // de Vet[i] pois a função 'Imprime' espera um
                            // parâmetro por VALOR

        }

        return 0; 

      }


A saída do programa é :
0123456789