Aula 20: Matrizes (Parte 2) - Introdução a Programação · Aula de hoje 1 Exercícios da aula...

21
Aula 20: Matrizes (Parte 2) Introduªo a Programaªo Toelio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computaªo UFOP

Transcript of Aula 20: Matrizes (Parte 2) - Introdução a Programação · Aula de hoje 1 Exercícios da aula...

Aula 20: Matrizes (Parte 2)Introdução a Programação

Túlio Toffolo & Puca Huachihttp://www.toffolo.com.br

BCC201 – 2018/2Departamento de Computação – UFOP

Aulas anteriores

Vetores

Matrizes

2 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Aula de hoje

1 Exercícios da aula prática

2 Mais sobre matrizes

3 Erros comuns

4 Exercícios

2 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Aula de hoje

1 Exercícios da aula prática

2 Mais sobre matrizes

3 Erros comuns

4 Exercícios

2 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Exercícios da aula prática

Exercício 1

Faça um programa que leia 2 vetores, A e B, de no máximo 15 posiçõesde caracteres. Em seguida, calcule um terceiro vetor C que seja adiferença entre eles.

Exemplo:

A = {a, f, b, h, y}B = {e, t, y, q, f}

O resultado será:

C = A\B ∴ C = {a, b, h}

3 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Exercícios da aula prática

Exercício 2Escreva um programa que leia os elementos de um vetor (vet1) deinteiros, dado seu tamanho n (n ≤ 100) e um segundo vetor (vet2) detamanho m (m ≤ 100), também de inteiros. Em seguida, gere um terceirovetor (vet3) que receba os dois primeiros intercalados. O programa deveimprimir o vetor intercalado.

Exemplo:

n = 5, vet1 = {1, 3, 5, 7, 9}m = 7, vet2 = {2, 4, 6, 8, 19, 11, 12, 13}

O resultado será:

vet3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}

4 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Exercícios da aula prática

Exercício 3

Seja uma matriz dados de alunos, onde na 1a coluna é armazenado amatrícula do aluno no curso; na 2a o sexo (0 para feminino e 1 paramasculino); na 3a o código do curso, e na 4a, o CR (Coeficiente deRendimento). Suponha 10 alunos e todos os dados do tipo inteiro.

Faça um programa que armazene esses dados sabendo-se que:

Os dados lidos são: a matrícula, o sexo, o CR e o código do curso;

Um grupo empresarial resolveu premiar a aluna com o maior CR deum curso. O programa deve portanto imprimir a matrícula e o CRdessa aluna.

5 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Aula de hoje

1 Exercícios da aula prática

2 Mais sobre matrizes

3 Erros comuns

4 Exercícios

5 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Inicialização de matrizes

Uma matriz pode ser inicializada assim como um vetor...

Mas na prática existem duas de fazê-lo:

Separando as linhas em grupos, usando chaves;

1 // separando as linhas (notação mais clara)...2 int matriz[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

Ou sequencialmente, sem nenhuma separação.

1 // sem nenhuma separação2 int matriz[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

6 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Inicialização de matrizes

Note que o mesmo vale para matrizes com mais de duas dimensões:

1 // separando as linhas (notação mais clara)...2 int matriz[2][2][2] = { { {1, 2}, {3, 4} }, { {5, 6}, {7, 8} } };34 // exemplo de uso (o que será impresso?)5 cout << matriz[1][0][1] << endl;6 cout << matriz[1][1][1] << endl;

Podemos, portanto, re-escrever o código acima como:

1 // sem separação...2 int matriz[2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8 };34 // exemplo de uso (o que será impresso?)5 cout << matriz[0][1][1] << endl;6 cout << matriz[0][0][0] << endl;

7 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Passando matrizes por parâmetro

Em C/C++ você precisa indicar o tamanho de todas as dimensões de umamatriz passada por parâmetro, exceto a dimensão mais à esquerda.

Exemplo com todas as dimensões da matriz:

1 void imprimirMatriz(int matriz[3][3], int n, int m)2 {3 for (int i = 0; i < n; ++i) {4 for (int j = 0; j < m; ++j)5 cout << matriz[i][j] << " ";6 cout << endl;7 }8 }

8 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Passando matrizes por parâmetro

Em C/C++ você precisa indicar o tamanho de todas as dimensões de umamatriz passada por parâmetro, exceto a dimensão mais à esquerda.

Exemplo sem a dimensão mais a esquerda:

1 void imprimirMatriz2(int matriz[][3], int n, int m)2 {3 for (int i = 0; i < n; ++i) {4 for (int j = 0; j < m; ++j)5 cout << matriz[i][j] << " ";6 cout << endl;7 }8 }

9 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Passando matrizes por parâmetro

Mas... porquê todas as dimensões menos a mais à esquerda??

Por conta da forma como matrizes são representadas na memória!

As linhas são colocadas sequencialmente em um vetorzão.

Exemplo: seja a matriz 3×3 a seguir

1 matriz[3][3] = { { 10, 20, 30 },2 { 40, 50, 60 },3 { 70, 80, 90 }, };

Ela será representada na memória como um vetor de tamanho 9:

1 i ---> 0 0 0 1 1 1 2 2 22 j ---> 0 1 2 0 1 2 0 1 23 M[i][j] ---> { 10, 20, 30, 40, 50, 60, 70, 80, 90 }

10 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Passando matrizes por parâmetro

Logo, quando acessamos o campo [i][j] da matriz 3×3:

C/C++ acessa o campo 3× i+ j do “vetorzão”.

Para tal, o compilador deve saber quantas colunas há em cada linha

Ou seria impossível multiplicar por “3” neste exemplo.

Se você não quiser definir as dimensões da sua matriz em tempo decompilação, há algumas alternativas...

que aprenderemos em breve...

(quando falarmos sobre alocação dinâmica)

11 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Passando matrizes por parâmetro

Agora faz mais sentido inicializar uma matriz sem separação?

1 // inicializando uma matriz sem separação entre linhas/colunas2 int matriz[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

12 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Aula de hoje

1 Exercícios da aula prática

2 Mais sobre matrizes

3 Erros comuns

4 Exercícios

12 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Passando matrizes por parâmetro

O que está errado no código acima???

Erro comum

1 void imprimirMatriz2(int matriz[][], int n, int m)2 {3 for (int i = 0; i < n; ++i) {4 for (int j = 0; j < m; ++j)5 cout << matriz[i][j] << " ";6 cout << endl;7 }8 }

13 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Aula de hoje

1 Exercícios da aula prática

2 Mais sobre matrizes

3 Erros comuns

4 Exercícios

13 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Exercícios

Exercício 1Crie uma função que recebe duas matrizes de caracteres comoparâmetro, A e B, e suas dimensões (note que A e B devem terdimensões idênticas m ≤ 100 e n ≤ 100):

A função atribui a B o valor de A invertendo as linhas, por exemplo:

A = {{a, f}, {b, h}}B = {{b, h}, {a, f}}

Escreva também o método main que cria duas pequenas matrizes efaz uma chamada a esta função.

14 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

Exercícios

Exercício 2Crie uma função que recebe uma matriz m× n (m,n ≤ 100) de inteirospor parâmetro e retorna o número de ocorrências do valor zero nestamatriz.

Escreva também o método main que cria uma pequena matriz e fazuma chamada a esta função.

15 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 20: Matrizes (Parte 2)

/ 12

Perguntas?