Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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:

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

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

Anônimo disse...

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

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

Vinicius disse...

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?

Anônimo disse...

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º

Unknown disse...

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

Anônimo disse...

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!

Unknown disse...

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

Lucas de Lima disse...

Muito bom!

Let's Learn disse...

//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.

Let's Learn disse...

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

Anônimo disse...

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)

Adiel disse...

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!

Anônimo disse...

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

Andrew Barros disse...

Muito obrigado pelo tutorial!