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.



Como obter certificado de programação C

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);
}     

11 comentários:

Anônimo disse...

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.

Alexandre_AAP disse...

Excelente tutorial!!!!

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

TutorFree disse...

Parabéns pela iniciativa.
Obrigado.

Gisa-chan disse...

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?

Apostila C Progressivo disse...

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.

Anônimo disse...

Muitos Parabéns pelo excelente site.

Sou estudante universitário e é uma grande ajuda

ALMEDINO A V WANTE disse...

esta sendo optmo fazer parte desta turma

Anônimo disse...

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?

Anônimo disse...

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");
}

Gabriel Silva disse...

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?

Anônimo disse...

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

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.