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", &notas[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.


Descubra mais sobre Apprendendo

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continue lendo