Trabalhando com Tabelas e Dados Multidimensionais
Vamos sim falar sobre matrizes antes de strings, pois são uma extensão natural dos arrays. Matrizes são essenciais para trabalhar com dados tabulares, como planilhas, imagens digitais, jogos 2D e muito mais.
🧩 1. O que são Matrizes?
Analogia:
Pense em uma matriz como uma tabela do Excel ou jogo da velha:
- Linhas: Número de linhas da tabela
- Colunas: Número de colunas da tabela
- Células: Interseção de linha e coluna (cada elemento)
Definição Formal:
Uma matriz é um array multidimensional – basicamente um “array de arrays”. A mais comum é a matriz 2D (duas dimensões).
⚙️ 2. Declaração e Inicialização de Matrizes
2.1 Declaração Básica
tipo nome_matriz[linhas][colunas];
#include <stdio.h>
int main() {
// Declaração de matrizes
int matriz[3][3]; // 3x3 (9 elementos)
float notas[4][2]; // 4 linhas, 2 colunas
char tabuleiro[8][8]; // 8x8 (tabuleiro de xadrez)
return 0;
}
2.2 Inicialização na Declaração
#include <stdio.h>
int main() {
// Inicialização direta
int matriz[2][3] = {
{1, 2, 3}, // Primeira linha
{4, 5, 6} // Segunda linha
};
// Matriz 3x3 para tabuleiro
char jogo_velha[3][3] = {
{'X', 'O', ' '},
{' ', 'X', 'O'},
{'O', ' ', 'X'}
};
return 0;
}
🔍 3. Acessando Elementos da Matriz
3.1 Acesso Individual
#include <stdio.h>
int main() {
int matriz[2][3] = {
{10, 20, 30},
{40, 50, 60}
};
// Acessando elementos individuais
printf("Elemento [0][1]: %d\\\\n", matriz[0][1]); // 20
printf("Elemento [1][2]: %d\\\\n", matriz[1][2]); // 60
// Modificando elementos
matriz[0][0] = 100;
printf("Novo valor [0][0]: %d\\\\n", matriz[0][0]); // 100
return 0;
}
3.2 Percorrendo Matrizes com Loops Aninhados
#include <stdio.h>
int main() {
int matriz[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int i, j;
// Percorrendo todas as células
printf("Matriz completa:\\\\n");
for (i = 0; i < 3; i++) { // Para cada linha
for (j = 0; j < 3; j++) { // Para cada coluna na linha i
printf("%d ", matriz[i][j]);
}
printf("\\\\n"); // Nova linha após cada linha da matriz
}
return 0;
}
Saída:
1 2 3
4 5 6
7 8 9
📊 4. Exemplos Práticos Completos
Exemplo 1: Sistema de Notas por Matéria
#include <stdio.h>
#define NUM_ALUNOS 3
#define NUM_MATERIAS 2
int main() {
float notas[NUM_ALUNOS][NUM_MATERIAS];
int i, j;
// Entrada de dados
printf("=== SISTEMA DE NOTAS ===\\\\n");
for (i = 0; i < NUM_ALUNOS; i++) {
printf("\\\\nAluno %d:\\\\n", i + 1);
for (j = 0; j < NUM_MATERIAS; j++) {
printf("Nota da matéria %d: ", j + 1);
scanf("%f", ¬as[i][j]);
}
}
// Exibindo todas as notas
printf("\\\\n=== RELATÓRIO DE NOTAS ===\\\\n");
printf("Aluno | Matéria 1 | Matéria 2 | Média\\\\n");
printf("------|-----------|-----------|------\\\\n");
for (i = 0; i < NUM_ALUNOS; i++) {
float soma = 0;
printf("%5d |", i + 1);
for (j = 0; j < NUM_MATERIAS; j++) {
printf(" %9.1f |", notas[i][j]);
soma += notas[i][j];
}
printf(" %5.1f\\\\n", soma / NUM_MATERIAS);
}
return 0;
}
Exemplo 2: Tabuada Completa
#include <stdio.h>
#define LINHAS 10
#define COLUNAS 10
int main() {
int tabuada[LINHAS][COLUNAS];
int i, j;
// Preenchendo a matriz de tabuada
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
tabuada[i][j] = (i + 1) * (j + 1);
}
}
// Exibindo a tabuada completa
printf("=== TABUADA COMPLETA ===\\\\n");
printf(" |");
for (j = 1; j <= COLUNAS; j++) {
printf("%4d", j);
}
printf("\\\\n---|");
for (j = 0; j < COLUNAS; j++) {
printf("----");
}
printf("\\\\n");
for (i = 0; i < LINHAS; i++) {
printf("%2d |", i + 1);
for (j = 0; j < COLUNAS; j++) {
printf("%4d", tabuada[i][j]);
}
printf("\\\\n");
}
return 0;
}
🎮 5. Aplicações Práticas com Matrizes
Exemplo 3: Jogo da Velha
#include <stdio.h>
#define TAMANHO 3
void imprimir_tabuleiro(char tabuleiro[TAMANHO][TAMANHO]) {
int i, j;
printf("\\\\n ");
for (j = 0; j < TAMANHO; j++) {
printf("%d ", j + 1);
}
printf("\\\\n");
for (i = 0; i < TAMANHO; i++) {
printf("%d |", i + 1);
for (j = 0; j < TAMANHO; j++) {
printf("%c|", tabuleiro[i][j]);
}
printf("\\\\n");
}
printf("\\\\n");
}
int main() {
char tabuleiro[TAMANHO][TAMANHO];
int i, j;
// Inicializando tabuleiro vazio
for (i = 0; i < TAMANHO; i++) {
for (j = 0; j < TAMANHO; j++) {
tabuleiro[i][j] = ' ';
}
}
// Simulando algumas jogadas
tabuleiro[0][0] = 'X';
tabuleiro[1][1] = 'O';
tabuleiro[2][2] = 'X';
tabuleiro[0][2] = 'O';
printf("=== JOGO DA VELHA ===\\\\n");
imprimir_tabuleiro(tabuleiro);
return 0;
}
Exemplo 4: Transformações Geométricas
#include <stdio.h>
#define LINHAS 3
#define COLUNAS 3
void imprimir_matriz(int mat[LINHAS][COLUNAS]) {
int i, j;
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
printf("%3d", mat[i][j]);
}
printf("\\\\n");
}
printf("\\\\n");
}
int main() {
int original[LINHAS][COLUNAS] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int transposta[COLUNAS][LINHAS];
int i, j;
// Calculando matriz transposta
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
transposta[j][i] = original[i][j];
}
}
printf("Matriz Original:\\\\n");
imprimir_matriz(original);
printf("Matriz Transposta:\\\\n");
imprimir_matriz(transposta);
return 0;
}
🔧 6. Matrizes e Funções
6.1 Passando Matrizes para Funções
#include <stdio.h>
#define LINHAS 3
#define COLUNAS 3
// Protótipos
void preencher_matriz(int mat[LINHAS][COLUNAS]);
void somar_matrizes(int a[LINHAS][COLUNAS], int b[LINHAS][COLUNAS], int resultado[LINHAS][COLUNAS]);
void imprimir_matriz(int mat[LINHAS][COLUNAS]);
int main() {
int matrizA[LINHAS][COLUNAS];
int matrizB[LINHAS][COLUNAS];
int resultado[LINHAS][COLUNAS];
printf("Preencha a matriz A:\\\\n");
preencher_matriz(matrizA);
printf("Preencha a matriz B:\\\\n");
preencher_matriz(matrizB);
somar_matrizes(matrizA, matrizB, resultado);
printf("Matriz A:\\\\n");
imprimir_matriz(matrizA);
printf("Matriz B:\\\\n");
imprimir_matriz(matrizB);
printf("Soma (A + B):\\\\n");
imprimir_matriz(resultado);
return 0;
}
void preencher_matriz(int mat[LINHAS][COLUNAS]) {
int i, j;
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
printf("Elemento [%d][%d]: ", i + 1, j + 1);
scanf("%d", &mat[i][j]);
}
}
}
void somar_matrizes(int a[LINHAS][COLUNAS], int b[LINHAS][COLUNAS], int resultado[LINHAS][COLUNAS]) {
int i, j;
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
resultado[i][j] = a[i][j] + b[i][j];
}
}
}
void imprimir_matriz(int mat[LINHAS][COLUNAS]) {
int i, j;
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
printf("%3d", mat[i][j]);
}
printf("\\\\n");
}
printf("\\\\n");
}
📈 7. Matrizes de Mais de 2 Dimensões
7.1 Matriz 3D (Cubo)
#include <stdio.h>
int main() {
// Matriz 3D: [camadas][linhas][colunas]
int cubo[2][3][3] = {
{ // Primeira camada
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
},
{ // Segunda camada
{10, 11, 12},
{13, 14, 15},
{16, 17, 18}
}
};
int c, i, j;
// Percorrendo a matriz 3D
for (c = 0; c < 2; c++) {
printf("Camada %d:\\\\n", c + 1);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%2d ", cubo[c][i][j]);
}
printf("\\\\n");
}
printf("\\\\n");
}
return 0;
}
⚠️ 8. Cuidados Importantes com Matrizes
8.1 Limites das Dimensões
#include <stdio.h>
int main() {
int matriz[2][2] = {{1, 2}, {3, 4}};
// CUIDADO: Acessando índices inválidos!
// printf("%d\\\\n", matriz[2][2]); // COMPORTAMENTO IMPREVISÍVEL
return 0;
}
8.2 Uso de Constantes para Tamanhos
#include <stdio.h>
#define MAX_LINHAS 100
#define MAX_COLUNAS 100
int main() {
int matriz[MAX_LINHAS][MAX_COLUNAS];
int linhas, colunas, i, j;
printf("Digite número de linhas (max %d): ", MAX_LINHAS);
scanf("%d", &linhas);
printf("Digite número de colunas (max %d): ", MAX_COLUNAS);
scanf("%d", &colunas);
if (linhas > MAX_LINHAS || colunas > MAX_COLUNAS) {
printf("Tamanho excede o máximo permitido!\\\\n");
return 1;
}
// Uso seguro da matriz
for (i = 0; i < linhas; i++) {
for (j = 0; j < colunas; j++) {
matriz[i][j] = i * j;
}
}
return 0;
}
🏆 9. Exercícios Práticos
Exercício 1: Calculadora de Matrizes
// Crie funções para:
// - Somar duas matrizes
// - Multiplicar duas matrizes
// - Calcular determinante (para 2x2 e 3x3)
Exercício 2: Sistema de Reservas
// Crie um sistema de reservas de assentos para cinema
// Use matriz para representar a sala (ex: 10x15 assentos)
Exercício 3: Análise de Dados Meteorológicos
// Use matriz para armazenar temperaturas de várias cidades
// Calcule: média por cidade, máxima/mínima geral, etc.
📌 Resumo do que Aprendemos:
✅ O que são matrizes e suas aplicações práticas
✅ Declaração e inicialização de matrizes 2D e 3D
✅ Acesso e manipulação de elementos
✅ Percorrendo matrizes com loops aninhados
✅ Matrizes com funções
✅ Aplicações reais: jogos, tabulares, transformações
✅ Cuidados importantes com limites e tamanhos
🚀 Próxima Aula: STRINGS em C!
Agora sim, vamos aprender a trabalhar com texto e manipulação de strings!
Comentem suas dúvidas e compartilhem suas soluções para os exercícios!
💻 Dica Extra: Pratique criando programas que usam matrizes para problemas do mundo real, como controle de estoque de produtos em várias lojas, grades horárias escolares, ou processamento de imagens simples.

