Introdução à Programação em C++
Aula 5 - Matrizes

Lucas S. Vieira


Universidade Federal dos Vales do Jequitinhonha e Mucuri
Novembro de 2019

Introdução

Vimos que vetores são úteis para armazenar \(n\) variáveis do mesmo tipo.

O armazenamento dessas informações é um meio de combinação de C++.

O grande volume de dados pode tornar inviável o armazenamento de valores do mesmo tipo em vetores.

Situação-problema

Construa um programa que recebe  as porcentagens de notas de
cinco   provas   dos  alunos   de   uma   turma  de   trinta
pessoas. Calcule  a média  final para cada  aluno e  exiba a
média final da sala.

Precisaríamos armazenar cinco porcentagens para cada aluno.

%3 Alunos: Alunos: values (notas) (notas) (notas) (notas) ... (notas)

Uma alternativa: armazenar todas as notas sequencialmente. Assim, os dados de cada aluno apareceriam a cada cinco posições no vetor.

Podemos também pensar em algum tipo de tabela para armazenar estas notas.

%3 Aluno 1: Aluno 1: Aluno 2: Aluno 2: Aluno 1:->Aluno 2: Aluno 3: Aluno 3: Aluno 2:->Aluno 3: ret1 ... Aluno 3:->ret1 Aluno 30: Aluno 30: ret1->Aluno 30: ret2 ... values1 35% 58% 92% 27% 84% values2 22% 28% 91% 76% 86% values3 5% 4% 19% 24% 13% values30 68% 85% 83% 37% 40%

Distribuindo alunos como linhas e notas como colunas.

  P1 P2 P3 P4 P5
A1 35 58 92 27 84
A2 22 28 91 76 86
A3 5 4 19 24 13
A30 68 85 83 37 40

Podemos representar apenas a parte relevante desta tabela, matematicamente.

\begin{equation*} A = \begin{bmatrix} 35 & 58 & 92 & 27 & 84\\ 22 & 28 & 91 & 76 & 86\\ 5 & 4 & 19 & 24 & 13\\ \vdots & \vdots & \vdots & \vdots & \vdots \\ 68 & 85 & 83 & 37 & 40 \end{bmatrix} \end{equation*}

Esta construção é chamada de matriz bidimensional, e também é um outro meio de combinação da linguagem C++.

Usando matrizes

Abstração

Podemos entender matrizes como:

  • Uma estrutura com \(m \times n\) elementos do mesmo tipo;
  • Um vetor com \(m\) sub-vetores, cada qual com \(n\) elementos do mesmo tipo.

Declaração

Uma matriz de trinta linhas e cinco colunas:

int A[30][5];

Acesso e atribuição

Acessando a quarta nota do décimo-sexto aluno:

std::cout << A[15][3] << std::endl;

Atribuindo um valor:

A[15][3] = 50;

Utilizando vetores individuais

Lembrando que uma matriz pode ser entendida como um vetor de sub-vetores, podemos usar os sub-vetores como vetores individuais.

A seguir, leremos dois nomes digitados pelo usuário, com um máximo de oitenta caracteres.

char infos[2][80];

std::cin >> std::ws;
std::cin.getline(infos[0], 80);

std::cin >> std::ws;
std::cin.getline(infos[1], 80);

std::cout << "Nome:      " << infos[0] << std::endl
          << "Sobrenome: " << infos[1] << std::endl;

Inicialização na declaração

Inicializando uma matriz \(2 \times 2\):

int A[2][2] = { {1, 2}, {3, 4} };

Podemos omitir apenas a quantidade de linhas:

int A[][2] = { {1, 2}, {3, 4} };

Também é possível inicializar a matriz com zeros:

int A[][2] = { {}, {} };

Matrizes de mais dimensões

Podemos ter matrizes de mais dimensões.

Podemos, por exemplo, falar em matrizes tridimensionais.

#define TURMAS  6
#define ALUNOS 30
#define NOTAS   5

int boletim[TURMAS][ALUNOS][NOTAS];

/* inicialização viria aqui */

std::cout << boletim[3][1][2] << std::endl;

Iterando sobre elementos

Extremamente similar a percorrer vetores. Pode ser enxergado desta forma:

Percorremos o vetor de vetores, onde cada elemento é um sub-vetor;

Para cada sub-vetor, percorremos seus elementos.

Exemplo

int A[4][5] = {
    {91, 67, 49, 74, 14},
    {63, 37, 13, 41, 16},
    {45,  3, 71, 42, 30},
    {85, 95, 64, 80, 10},
};

for(int i = 0; i < 4; i++) {
    for(int j = 0; j < 5; j++) {
        std::cout << std::setw(2) << A[i][j] << ' ';
    }
    std::cout << std::endl;
}

Exercícios

Determinante \(2 \times 2\)

Suponha uma matriz \(2 \times 2\), como a matriz abaixo:

\begin{equation*} A = \begin{bmatrix} 5 & 9\\ 7 & 3 \end{bmatrix} \end{equation*}

O cálculo da determinante de uma matriz \(A\) é dado por:

\[ det(A) = (a_{11} \times a_{22}) - (a_{21} \times a_{12}) \]

\begin{equation*} det(A) = \begin{vmatrix} 5 & 9\\ 7 & 3 \end{vmatrix} = (5 \times 3) - (7 \times 9) = -48 \end{equation*}

Crie um programa que lê uma matriz \(2 \times 2\) digitada pelo usuário, e então calcula sua determinante.

Boletim Virtual III

Construa um programa que recebe as porcentagens de notas de 5 provas dos alunos de uma turma de 30 pessoas. Calcule a média final para cada aluno e exiba a média final da sala.