5950257 - Programação de Computadores
Aula 08b - Matrizes e Arrays Multi-dimensionais
Prof. Dr. Denis M. L. Martins
DCM | FFCLRP | USP

top-right

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Objetivos de Aprendizagem

  • Compreender o conceito de matrizes e arrays multidimensionais em C
  • Declarar e inicializar arrays multidimensionais
  • Acessar elementos de matrizes utilizando índices
  • Utilizar estruturas de repetição com matrizes
  • Desenvolver algoritmos utilizando matrizes

Para os exercícios desta aula, você pode utilizar IDEs online como:
https://www.onlinegdb.com/online_c_compiler
https://www.programiz.com/c-programming/online-compiler/

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Matriz em C

Uma matriz é:

  • Um array multidimensional
  • Uma estrutura de dados organizada em:
    • linhas
    • colunas
  • Utilizada para representar tabelas, imagens, mapas e grades

Sintaxe Geral

tipo nome[linhas][colunas];
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Matrizes em C

C não possui "matrizes" como objeto nativo distinto. Ele trata matrizes como arrays de arrays.

int mat[3][4] é um array com 3 elementos.

Em C, o tamanho da segunda dimensão (colunas) é obrigatório na declaração. O compilador precisa saber o tamanho do bloco para calcular endereços corretamente.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Criando e Inicialização de Matrizes

int matrix[2][3]; // Contém valores de "garbage" (indeterminados)
// SEMPRE INICIALIZAR EXPLICITAMENTE EM C!
int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exemplo

Armazenar notas de:

  • 3 alunos
  • 2 provas
float notas[3][2];
Aluno 0 -> Prova 1 e Prova 2
Aluno 1 -> Prova 1 e Prova 2
Aluno 2 -> Prova 1 e Prova 2
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Onde matrizes são utilizadas?

  • Jogos
  • Inteligência Artificial e Machine Learning
  • Computação Gráfica
  • Processamento de Imagens
  • Sistemas de Navegação
  • Análise Experimental
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Matrizes em Processamento de Imagens

Matrix , onde e é o número de bits por pixel.

center

Na imagem: Representação de pixels de uma imagem. Fonte: OpenFrameworks - Image Processing.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Matrizes em Machine Learning

center

Fonte da imagem: Sebastian Raschka

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Navegando na Matriz

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

Acesso Direto:

printf("%d", matriz[0][1]); // Imprime o elemento da linha 0, coluna 1

Iteração (Loop Aninhado):

for (int i = 0; i < 2; i++) {      // Percorre Linhas
    for (int j = 0; j < 3; j++) {  // Percorre Colunas
        printf("%d ", matriz[i][j]);
    }
    printf("\n"); // Quebra linha após cada linha da matriz
}
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exemplo: Soma de Elementos

#include <stdio.h>

int main() {
    int matriz[2][2] = {
        {1,2},
        {3,4}
    };
    int soma = 0;
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 2; j++) {
            soma += matriz[i][j];
        }
    }
    printf("Soma = %d", soma);
    return 0;
}
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exemplo: Lendo Matriz do Teclado

#include <stdio.h>

#define TAMANHO_LINHAS 3
#define TAMANHO_COLUNAS 3

int main() {
    int matriz[TAMANHO_LINHAS][TAMANHO_COLUNAS];
    printf("Por favor, insira os 9 valores da matriz:\n\n");
    for (int i = 0; i < TAMANHO_LINHAS; i++) {
        // A cada nova linha, pedimos ao usuário para preencher os valores da coluna.
        printf("Insira os %d valores da Linha %d:\n", TAMANHO_COLUNAS, i + 1);
        for (int j = 0; j < TAMANHO_COLUNAS; j++) {
            printf("  Elemento [%d][%d]: ", i, j);
            scanf("%d", &matriz[i][j]);
        }
    }
    printf("\nLeitura da matriz concluída com sucesso!\n");

    return 0;
}
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício A

Crie um programa que leia uma matriz 4x4 imprima:

  • maior valor
  • menor valor
  • soma da diagonal principal
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício B

Crie um programa que inicializa duas matrizes 5x3 e pede que o usuário selecione uma das opções abaixo:

  • Opção 1: Calcular a soma das matrizes
  • Opção 2: Calcular a subtração das matrizes

O programa deve exibir o resultado da operação selecionada.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Matriz em Memória

Row-Major Order: C armazena matrizes na ordem das linhas.

  • Todas as colunas da linha 0 vêm primeiro.
  • Depois, todas as colunas da linha 1.
Endereço Base: &mat[0][0]

| [0][0] | [0][1] | [0][2] | <- Linha 0 (4 bytes * 3)
+---------------------------+
| [1][0] | [1][1] | [1][2] | <- Linha 1
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Conclusão

Matrizes são fundamentais porque:

  • permitem representar dados bidimensionais
  • são amplamente utilizadas em computação científica
  • servem como base para:
    • imagens
    • simulações
    • jogos
    • inteligência artificial

Próximo Tópico: Strings em C

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Dúvidas e Discussão

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício e Questões

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Questão 1

Qual das alternativas representa corretamente uma matriz 3x4 em C?

A)

int matriz[3,4];

B)

int matriz[3][4];

C)

int matriz(3)(4);
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Questão 2

Qual é o erro abaixo?

int matriz[2][2];

matriz[2][0] = 5;
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício 1

Crie um programa que inicialize uma matriz 4 x 3 e imprima a matriz transposta.

Transposta: Dado uma matriz de , a matriz transposta é definida como .

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício 2

Crie um programa que calcule e imprime a multiplicação de duas matrizes. Se as matrizes forem incompatíveis, o programa deve exibir uma mensagem de erro.

Fonte da Imagem: Wikipedia.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício 3

Crie um programa que lê uma matriz quadrada do usuário e verifica se ela é simétrica, ou seja para todo .

O programa deve imprimir a mensagem "SIM", se a matriz for simétrica. Senão, deve imprimir "NÃO".

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Resposta: B

Resposta: índice de linha inválido