Vetores multidimensionais (Matrizes) em C: vetor de vetores

Agora que a apostila C Progressivo mostrou como declarar,inicializar e usar vetores de vários tipos de variáveis, vamos ensinar a usar os vetores para armazenar outros vetores.

Isso mesmo, vetor com vetores dentro. No mundo real, são conhecidos por tabelas.



Vetores multidimensionais, ou Matrizes: o que são e para quê servem

Nos exemplos passados, sobre vetores, o portal CProgressivo vinha usando somente um tipo de vetor: vetores unidimensionais.

Nossos vetores, ou arrays, tinham uma linha e várias colunas.
Seja ‘n’ o número de colunas, nossos vetores eram matrizes 1 x n.
Sim, uma linha de elementos também é uma matriz.

Vamos agora aprender para que servem e como trabalhar com vetores de mais de uma linha.
Para isso, vamos voltar ao exemplo do colégio, onde declaramos um vetor para armazenar as notas de um aluno.

Na escola, esse aluno tem várias matérias: Matemáticas, Física, Química, Biologia etc.
Vamos supor que existam 5 provas ao longo do ano, para cada matéria.
Poderíamos representar as notas de cada aluno da seguinte maneira:

float notasMatematica[5];
float notasFisica[5];
float notasQuimica[5];


Como declarar e trabalhar com Matrizes em C

Existe, porém, uma maneira bem mais fácil, lógica e organizada de trabalhar com vários vetores. Quando nós falarmos de vetor, lembre de uma linha com vários elementos.

Pois bem, uma maneira melhor de ver esses vetores de notas, seria na forma de uma tabela.
Uma linha tem as notas de Matemática, na outra as notas de Física e assim vai.
Cada coluna representa as provas feitas: prova 1, prova 2, ... etc.








Vamos fazer isso!

Por exemplo, vamos supor que ele tirou as seguintes notas em Matemática (é uma matriz 1x5):
8.0
7.5
8.5
9.0
8.0


Agora vamos representar as notas em Física, abaixo das de Matemática. Teremos uma matriz 2x5, ou seja, uma matriz de duas linhas e 5 colunas:
8.0
7.5
8.5
9.0
8.0
8.9
9.0
8.6
8.4
8.0


Agora vamos representar as notas de Química, abaixo das notas de Física.
Teremos uma matriz 3x5, ou seja, uma matriz de três linhas e 5 colunas:
8.0
7.5
8.5
9.0
8.0
8.9
9.0
8.6
8.4
8.0
6.8
7.1
7.0
7.6
6.5


Ok, agora vamos partir para a programação e ver como declarar e passar isso pra linguagem C.

Para  declarar a matriz 2x5, fazemos:
float notas[2][5];

Note que temos duas linhas: notas[0][] e notas[1][], e em cada linha dessa temos 5 elementos.
Ou seja, é uma matriz de duas linhas e cinco colunas.
Sempre o primeiro número é a linha e o segundo é a coluna.

Para declarar matrizes e inicializar, devemos colocar cada linha entre chaves {}, e separar elas por vírgulas, veja:
float notas[2][5] = { {8.0, 7.5, 8.5, 9.0, 8.0 }, {8.9, 9.0, 8.6, 8.4, 8.0 } };

Uma maneira mais simples de ver essas linhas e colunas, como tabela, é da seguinte maneira:
float notas[2][5] = { {8.0, 7.5, 8.5, 9.0, 8.0 },
                              {8.9, 9.0, 8.6, 8.4, 8.0 } };


Para declarar a matriz 3x5, fazemos::
float notas[3][5];

Veja como fica nossa matriz, ou tabela, declarada e inicializada:
float notas[3][5] = { {8.0, 7.5, 8.5, 9.0, 8.0 }, {8.9, 9.0, 8.6, 8.4, 8.0 }, {6.8, 7.1, 7.0, 7.6, 6.5 } };

De uma maneira mais fácil de entender:
float notas[3][5] = { {8.0, 7.5, 8.5, 9.0, 8.0 }, 
                             {8.9, 9.0, 8.6, 8.4, 8.0 }, 
                             {6.8, 7.1, 7.0, 7.6, 6.5 } };


Note que notas[0] se refere ao vetor de notas de Matemática.
Note que notas[1] se refere ao vetor de notas de Física.
Note que notas[2] se refere ao vetor de notas de Química.

Por exemplo: qual foi a quarta nota de Física do aluno?
Ora, o vetor de Física é notas[1], e a quarta nota é o elemento [3] desse vetor.
Então a quarta nota de Física do aluno está armazenada em: notas[1][3], que é 8.4

Generalizando, para declarar uma matriz de ‘linha’ linhas e de ‘coluna’ colunas, fazemos:
tipo nome[linha][coluna];

Para acessar o elemento da i-ésima linha e de j-ésima coluna, acessamos pela variável:
nome[i][j];

É uma variável como outra qualquer em linguagem de programação C.
Podemos somar, incrementar, zerar etc.

Bom, agora a apostila C Progressivo sai da teoria para, como de costume, ir para a prática com exemplos resolvidos e comentados.

Exemplo de código C: Criar e exibir uma matriz 3x3
Crie um aplicativo em C que peça ao usuário para preencher uma matriz 3x3 com valores inteiros e depois exiba essa matriz.

A grande novidade, e importância, nesse tipo de aplicativo são os laços for aninhados, ou seja, um dentro do outro, e do uso do #define, para tratar da constante DIM, que representa a dimensão da matriz.
É importante, como foi explicado no artigo passado, você usar #define ou const para trabalhar com constantes em C

Primeiro criamos um laço que vai percorrer todas as linhas da matriz. Podemos, e devemos, ver cada linha como um vetor de 3 elementos.

Dentro de cada linha, temos que percorrer cada elemento do do vetor e fornecer seu valor. Fazemos isso através de outro laço for, que ficará responsável pelas 'colunas', formando nossos laços aninhados.

Para imprimir, o esquema é exatamente o mesmo. Imprimimos linha por linha, e em cada linha, imprimimos coluna por coluna.

#include <stdio.h>
#define DIM 3
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito!
// Artigos, apostilas, tutoriais e 
// vídeo-aulas sobre a linguagem de programação C!

int main()
{
    int matriz[DIM][DIM];
    int linha, coluna;

    //escrevendo na Matriz
    for(linha = 0 ; linha < DIM ; linha++)
        for(coluna = 0 ; coluna < DIM ; coluna++)
        {
            printf("Elemento [%d][%d]: ", linha+1, coluna+1);
            scanf("%d", &matriz[linha][coluna]);
        }

    // imprimindo a matriz na tela
    for(linha = 0 ; linha < DIM ; linha++)
    {
        for(coluna = 0 ; coluna < DIM ; coluna++)
            printf("%3d", matriz[linha][coluna]);

        printf("\n"); //após cada linha ser impressa, um salto de linha
    }
}


Exemplo 2: Como calcular o traço de uma matriz em C
Use o programa feito no exemplo anterior para calcular o traço de uma matriz.
Lembrando que o traço de uma matriz é a soma dos elementos da diagonal principal.

Os elementos das diagonal principal são os que tem índice da linha igual ao índice da coluna:
matriz[0][0], matriz[1][1] e matriz[2][2].

Aproveitamos o laço for das linhas para calcular a soma desses elementos:
matriz[linha][linha]

Visto que a variável 'linha', assim como a 'coluna', vão de 0 até 2.
Logo, nosso código C fica:

#include <stdio.h>
#define DIM 3
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C, online e gratuito
// Artigos, apostilas, tutoriais e 
// vídeo-aulas sobre a linguagem de programação C
 
int main()
{
    int matriz[DIM][DIM];
    int linha, coluna, traco = 0;
 
    //escrevendo na Matriz
    for(linha = 0 ; linha < DIM ; linha++)
        for(coluna = 0 ; coluna < DIM ; coluna++)
        {
            printf("Elemento [%d][%d]: ", linha+1, coluna+1);
            scanf("%d", &matriz[linha][coluna]);
        }
 
    // imprimindo a matriz na tela
    for(linha = 0 ; linha < DIM ; linha++)
    {
        for(coluna = 0 ; coluna < DIM ; coluna++)
            printf("%3d", matriz[linha][coluna]);
 
        traco += matriz[linha][linha];
        printf("\n"); //após cada linha ser impressa, um salto de linha
    }
 
    printf("\nTraco da matriz: %d\n", traco);
}     

24 comentários:

  1. Meu nome é Aléx, sou estudante de sistemas, e esse tutorial me ajudou esclarecer muitas dúvidas, fico muito grato a todos os responsáveis por esse projeto.
    Sucesso.

    ResponderExcluir
  2. Excelente tutorial!!!!

    Eu tinha certas duvidas quanto a como fazer a matriz aparecer ao usuario......... vlw!!!!

    ResponderExcluir
  3. Olá, gostei do tutorial e queria Parabenizar pela iniciativa. Só que a gente esta aprendendo a fazer exercícios com matriz sem usar constante ou define... Entao na hora de declarar a matriz a gente tem que colocar int matriz[3][3] por exemplo, e pra mostrar uma matriz preenchida desse modo, o que colocar no lugar do elemento "%3d" que foi colocado nesse exemplo?

    ResponderExcluir
  4. Olá Gisa,

    Como assim mostrar uma matriz preenchida?
    O código mostrado exibe toda a matriz.

    É preciso exibir elemento por elemento da matriz.
    Como ela é uma matriz de inteiros, usamos o %d pra exibir esses números.

    Colocamos %3d para que cada número ocupe o espaço de 3 casas, deixando a exibição da matriz bem alinhada.

    ResponderExcluir
  5. Muitos Parabéns pelo excelente site.

    Sou estudante universitário e é uma grande ajuda

    ResponderExcluir
  6. Fiquei com uma dúvida, e se na matriz ao invés de números, eu quisesse que fossem inseridas palavras? o que deveria mudar no código?

    ResponderExcluir
  7. ola meu nome é salim e sou muito grato ao pessoal k desemvolveu esse site , assim como eu muitos apaixonados pela informatica tem tirado um bom proveito desse site, tudo que ja aprende foi graças ao C PRGSSV.

    Dessa forma deixo o meu contributo publicando um dos exercicios ja feitos mas com alguns detales acrescentado ....

    #include
    #include
    #define TRES 3

    int main() {

    int numero[TRES][TRES];
    int i,j;


    for(i=0;i<TRES;i++){
    for(j=0;j<TRES;j++){
    printf("posicoes [%d][%d]\n",i+1,j+1);
    scanf("%d",&numero[i][j]);
    }
    }


    for(i=0;i<TRES;i++){
    for(j=0;j<TRES;j++)
    printf("linha%d=%d\t coluna%d=%d\t",i+1,numero[i][j],j+1,numero[i][j]);
    }

    system("pause");
    }

    ResponderExcluir
  8. Boa noite a todos, em primeiro lugar gostaria de parabenizar pelo excelente site e pelas maravilhosas aulas, tenho aprendido muito no site.
    Tenho uma pergunta que me deixou confuso no código, quando entramos nos laços for() e efetuamos a soma da variável int traco, notei que ela estava efetuando a mesma somas três vezes na mesma posição da matriz, queria saber se ficaria correto efetuarmos um novo laço for() para com a variavel linha para que a variável int traco possa ser preenchida corretamente com a soma apenas uma vez de cada posição da matriz. Ex.:

    for(linha=0;linha<DIM;linha++)
    {
    traco+=matriz[linha][linha];
    }

    printf("%d",traco);

    ResponderExcluir
  9. Na Linha de adicionar a matriz , está sendo adicionado no primeiro elemento da la linha posterior o mesmo da última coluna da primeira linha

    ex:
    v[0][1] = 5

    e v[1][0] = 5 , também , alguém poderia me dizer o por que?

    ResponderExcluir
  10. Elabore um programa, em C, que leia uma frase e conte o número de vogais existentes,
    tanto maiúsculas como minúsculas

    ajudem me

    ResponderExcluir
  11. Não entendi o que faz o operador "+=" no calculo da soma da linha diagonal principal. Em "traco += matriz[linha][coluna];". Nunca vi dessa forma... Alguém pode me explicar?

    ResponderExcluir
  12. Me ajudem por favor: Criar um programa para apresentar em tela uma tabela trigonométrica contendo o seno, cosseno e tangente dos ângulos: 30º, 45º e 60º

    ResponderExcluir
  13. Tem um erro na nota... Esta [1] [3], e seria [1] [4].

    ResponderExcluir
  14. Cara, toda essa apostila está me ajudando muito! Sou estudando de Eng. Elétrica e programação estava sendo muito difícil pra mim, mas depois que comecei a estudar pelo site, melhorou muito. Parabéns pelo trabalho excelente!

    ResponderExcluir
  15. Olá,sou estudante de Engenharia Elétrica, e esse material estar me ajudando muito! Obrigado!!!!

    ResponderExcluir
  16. //Exemplo 2: Como calcular o traço de uma matriz em C
    //Use o programa feito no exemplo anterior para calcular o traço de uma matriz.
    //Lembrando que o traço de uma matriz é a soma dos elementos da diagonal principal.


    #include
    #include

    int main()
    {
    setlocale(LC_ALL, "Portuguese");
    int row = 1, width = 1, counter_row, counter_width, traco = 0,
    matrix[row][width];

    printf("\t Entre com as dimensoes da matrix: [ ][ ]");
    printf("\n\t Quantidade de linhas: ");
    scanf("%d", &row);
    printf("\t Quantidade de colunas: ");
    scanf("%d", &width);

    for(counter_row = 0; counter_row < row; counter_row++)
    {
    printf("\n");
    for (counter_width = 0; counter_width < width; counter_width++)
    {
    printf("Entre com o elemento [%d][%d]: ", counter_row + 1, counter_width + 1 );
    scanf("%d", &matrix[counter_row][counter_width]);
    }
    }

    for(counter_row = 0; counter_row < row; counter_row++)
    {
    printf("\n\t");
    for (counter_width = 0; counter_width < width; counter_width++)
    printf("%4d ", matrix[counter_row][counter_width]);
    }
    printf("\n");

    for(counter_row = 0; counter_row < row; counter_row++)
    for (counter_width = 0; counter_width < width; counter_width++)
    {
    if(counter_row == counter_width)
    traco += matrix[counter_row][counter_width];

    }
    printf("\n \tO traço da Matrix é: %4d \n", traco);
    }l.

    ResponderExcluir
  17. //Exemplo 2: Como calcular o traço de uma matriz em C
    //Use o programa feito no exemplo anterior para calcular o traço de uma matriz.
    //Lembrando que o traço de uma matriz é a soma dos elementos da diagonal principal.

    //http://www.cprogressivo.net/2013/03/Vetores-multidimensionais-Matrizes-em-C--vetor-de-vetores.html

    #include
    #include

    int main()
    {
    setlocale(LC_ALL, "Portuguese");
    int row, width, counter_row, counter_width, traco = 0;

    printf("\t Entre com as dimensoes da matrix: [ ][ ]");
    printf("\n\t Quantidade de linhas: ");
    scanf("%d", &row);
    printf("\t Quantidade de colunas: ");
    scanf("%d", &width);
    int matrix[row][width];

    for(counter_row = 0; counter_row < row; counter_row++)
    {
    printf("\n");
    for (counter_width = 0; counter_width < width; counter_width++)
    {
    printf("Entre com o elemento [%d][%d]: ", counter_row + 1, counter_width + 1 );
    scanf("%d", &matrix[counter_row][counter_width]);
    }
    }

    for(counter_row = 0; counter_row < row; counter_row++)
    {
    printf("\n\t");
    traco += matrix[counter_row][counter_row];
    for (counter_width = 0; counter_width < width; counter_width++)
    printf("%4d ", matrix[counter_row][counter_width]);
    }
    printf("\n");

    // for(counter_row = 0; counter_row < row; counter_row++)
    // for (counter_width = 0; counter_width < width; counter_width++)
    // {
    // if(counter_row == counter_width)
    // traco += matrix[counter_row][counter_width];
    //
    // }
    printf("\n \tO traço da Matrix é: %4d \n", traco);
    }

    ResponderExcluir
  18. podem me ajudar com esses:Desenvolva um programa em linguagem C para resolver os seguintes problemas com matrizes
    quadradas de dimensão “DIM” (constante):
    1) Preencher os dados de uma matriz;
    2) Modificar a Matriz de forma que os dados fiquem de cabeça para baixo. Exemplo (3x3).
    3)4) Rotacione a Matriz para a esquerda. Exemplo (3x3)

    ResponderExcluir
  19. Obrigado do fundo do meu coração pois entendi perfeitamente como funciona e abriu minha mente para diversas aplicações no qual matriz pode ser utilizada!! Excelente trabalho!

    ResponderExcluir
  20. Parabéns pela iniciativa. Seus tutoriais são muito bons, muito didáticos e diretos, muito obrigado por disponibilizar este conteúdo.

    ResponderExcluir

É quase impossível criar centenas de páginas voltadas para programação C e não cometer algum erro.

- Se notar algum conceito, letra ou trecho de código errado, deixe sua correção

- Se perceber uma maneira melhor ou mais eficiente de fazer algo, deixe sua ideia

- Se algo não ficar claro ou for confuso, nos avise

Aos poucos vamos aumentando e melhorando a qualidade de nosso material, e para isso contamos com sua ajuda.