aula 19: matrizes - introdução a programação · 2018-10-16 · dada uma coleção de n números...

46
Aula 19: Matrizes Introduªo a Programaªo Toelio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computaªo UFOP

Upload: ngokhue

Post on 11-Feb-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

Aula 19: MatrizesIntrodução a Programação

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

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

Aula anterior

Vetores

2 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Aula de hoje

1 Exercício da última aula

2 Introdução

3 Definição

4 Exemplos e exercícios

5 Próxima aula

2 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Aula de hoje

1 Exercício da última aula

2 Introdução

3 Definição

4 Exemplos e exercícios

5 Próxima aula

2 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício da última aula

Ordenação

Dada uma coleção de N números inteiros, implemente uma função paracolocá-los em ordem crescente.

Uma possível solução é trocar valores adjacentes até que nenhuma trocaseja necessária.

Para cada posição 0 ≤ i < N - 1, verificamos se vetor[i] é maiorque vetor[i+1].

Se for, trocamos!

Repetimos para todas as posições 0 ≤ i < N - 1 até nenhuma trocaser necessária.

Como implementar esta função?

3 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício da última aula

Passo 1:

Determinar o algoritmo para resolver o problema!

Em outras palavras: como ordenar um array?

Imagine um array com 4 elementos...

Agora aplique seu algoritmo sobre este “mini-array”.

4 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício da última aula

Passo 2:

Agora sim, vamos implementar o código.

Criaremos uma função para trocar elementos.

E outra para fazer todas as trocas necessárias para colocar o array emordem crescente.

5 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício da última aula

Função que troca dois números inteiros:

1 void troca(int &a, int &b)2 {3 int aux = a;4 a = b;5 b = aux;6 }

6 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício da última aula

Função que troca elementos até o array ficar ordenado:

1 void ordena(int array[], int tamanho)2 {3 bool trocou;4 do {5 trocou = false;6 for (int i = 0; i < tamanho - 1; i++) {7 if (array[i] > array[i+1]) {8 troca(array[i], array[i+1]);9 trocou = true;

10 }11 }12 } while (trocou);13 }

Esta função é “quase” um bubblesort(é um “bubblesort piorado”, pois poderia ser menos ineficiente)

7 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

1 #include <iostrea>2 using namespace std;34 #define N 1556 void troca(int&, int&);7 void ordena(int[], int);89 int main()

10 {11 int data[N] = { 0, 9, 8, 21, 33, 1, -1, 10, 7, 11, 6, 2, 5, 4, 3 };12 ordena(data, N);1314 for (int i = 0; i < N; i++)15 cout << data[i] << " ";16 cout << endl;1718 return 0;19 }

Resultado/saída:

1 -1 0 1 2 3 4 5 6 7 8 9 10 11 21 33

8 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Aula de hoje

1 Exercício da última aula

2 Introdução

3 Definição

4 Exemplos e exercícios

5 Próxima aula

8 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exemplo

Fazer um programa para ler as notas de 4 provas para 50 alunos de umaturma e calcular a média do aluno e média da turma.

Solução: criar 4 vetores de 50 posições, sendo um para cada nota:

1 double nota1[50], nota2[50], nota3[50], nota4[50];

9 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Introdução

10 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Introdução

E se tivermos que armazenar 100 notas?

Criaremos 100 vetores com 100 nomes diferentes?

11 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Introdução

Uma solução mais eficaz para resolver o problema é o uso de matrizes:

12 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Aula de hoje

1 Exercício da última aula

2 Introdução

3 Definição

4 Exemplos e exercícios

5 Próxima aula

12 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Variáveis Compostas Homogêneas – Matrizes

As variáveis compostas homogêneas correspondem a um conjunto deelementos de mesmo tipo e que compartilham um mesmo nome;

Cada um dos elementos é unicamente identificado por um númerointeiro (índice) que especifica a sua localização dentro da estrutura;

Estas variáveis podem ser unidimensionais (vetores) oumultidimensionais (matrizes);

A definição da variável composta homogênea pode ser feita da mesmaforma que definição de variáveis simples.

13 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Variáveis Compostas Homogêneas – Matrizes

Matriz é uma variável composta homogênea com duas ou maisdimensões;

A definição da variável pode ser feita da mesma forma que a definiçãodo vetor, porém deve ser especificado o número de elementos paracada dimensão da matriz;

A referência a cada elemento deve ser feita com a utilização de umíndice para cada dimensão;

Matrizes podem ser consideradas “vetores de vetores”.

14 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Introdução

Por exemplo, uma matriz bi-dimensional pode ser vista como uma tabelade m linhas e n colunas.

15 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Declaração de Matrizes

<tipo> <identificador> [<linhas>] [<colunas>];

<tipo>: tipo dos dados que serão armazenados no vetor (int, char,float, etc);

<identificador>: nome dado à variável vetor;

<linhas>: número de elementos da primeira dimensão;

<colunas>: número de elementos da segunda dimensão;

As linhas e colunas são numeradas de 0 até tamanho− 1.

16 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Declaração de Matrizes

Exemplo:

1 //matriz com 100 linhas e 50 colunas2 double notas[100][50];

17 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Acessando os elementos

Forma de ter acesso ao elemento de uma matriz:<variável>[<indice_linha>][<indice_coluna>]

Exemplos:

1 //imprimir o elemento da linha 3 e coluna 10 da matriz notas2 cout << notas[3][10];34 //multiplica a posição (i, j) da matriz mat por 5;5 mat[i][j] = mat[i][j] * 5;

18 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Observação

C/C++ não verifica o limite das dimensões das variáveis compostas;

Se uma instrução for feita com índices além do limite, não haverá errode execução do programa e outros valores serão sobrepostos namemória;

Assim, dados e/ou programas serão sobrepostos;

É responsabilidade do programador providenciar a verificação doslimites das dimensões das variáveis compostas;

19 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exemplo

Faça um programa que leia e imprima uma matriz 4×3 (4 linhas e 3colunas).

20 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Declaração da matriz

Matriz (M x N)

1 #define M 42 #define N 334 int matriz[M][N]; // note que M e N são constantes

21 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Leitura dos dados da matriz

Matriz (M x N)

1 // capturando dados2 for (int i = 0; i < M; i++) { //para as linhas3 for (int j = 0; j < N; j++) { //para as colunas4 cin >> matriz[i][j];5 }6 }

22 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Impressão da matriz

Matriz (M x N)

1 // imprimindo o conteúdo da matriz2 for (int i = 0; i < M; i++) { //para as linhas3 for (int j = 0; j < N; j++) { //para as colunas4 cout << matriz[i][j] << " ";5 }6 cout << endl; //salta uma linha7 }

23 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

1 int main()2 {3 int matriz[4][3];45 // capturando dados6 for (int i = 0; i < 4; i++) { // para as linhas7 for (int j = 0; j < 3; j++) { // para as colunas8 cout << "matriz[" << i << "][" << j << "] = ";9 cin >> matriz[i][j];

10 }11 }1213 // imprimindo o conteudo da matriz14 for (int i = 0; i < 4; i++) { // para as linhas15 for (int j = 0; j < 3; j++) { // para as colunas16 cout << setw(4) << matriz[i][j] << " ";17 }18 cout << endl;19 }20 return 0;21 }

24 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Inicialização de Matrizes I

Inicializando cada elemento da matriz (m x n) com o valor 0.

1 for (int i = 0; i < M; i++) //para as linhas2 for (int j = 0; j < N; j++) //para as colunas3 matriz[i][j] = 0;

25 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Inicialização de Matrizes II

Inicializando na declaração. Processo semelhante à inicialização devetores.

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

26 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exemplo

Dada uma matriz (4×5), calcular a soma de todos os elementos damatriz. Calcular também o somatório dos elementos de cada linha damatriz, armazenando o somatório em um vetor.

27 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exemplo

1 int main()2 {3 // declaração das variáveis4 float mat[4][5], somaLinha[4], total;56 // total se inicia com zero7 total = 0;89 for (int i = 0; i < 4; i++) {

10 // a soma da cada linha é inicializada com zero11 somaLinha[i] = 0;1213 // somando os valores da linha em somaLinha[i]14 for (j = 0; j < 5; j++)15 somaLinha[i] += mat[i][j];1617 // somando o total de cada linha18 total += somaLinha[i];19 }20 }

28 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Matriz vs array

Matrizes bidimensionais se comportam como arrays de array...

1 int matriz[4][5] = { {11, 12, 13, 14, 15},2 {21, 22, 23, 24, 25},3 {31, 32, 33, 34, 35},4 {41, 42, 43, 44, 45} };

Logo, uma matriz bidimensional pode ser imaginada como um arrayunidimensional de 4 elementos do tipo int[] onde cada um dos 4elementos é um array de 5 elementos do tipo int:

1 matriz[0] ---> {11, 12, 13, 14, 15}2 matriz[1] ---> {21, 22, 23, 24, 25}3 matriz[2] ---> {31, 32, 33, 34, 35}4 matriz[3] ---> {41, 42, 43, 44, 45}

29 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Aula de hoje

1 Exercício da última aula

2 Introdução

3 Definição

4 Exemplos e exercícios

5 Próxima aula

29 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício 1

Faça um programa em C++ que calcule a soma de duas matrizes:

Cm×n = Am×n +Bm×n

onde

ci,j = ai,j + bi,j ∀i ∈ {1 . . .m} e j ∈ {1 . . . n}

30 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

1 #define M 42 #define N 334 int main()5 {6 int a[M][N] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} };7 int b[M][N] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} };89 int c[M][N]; // c não precisa ser inicializada neste momento...

1011 // calculando o valor de cada célula da matriz c12 for (int i = 0; i < M; i++)13 for (int j = 0; j < N; j++)14 c[i][j] = a[i][j] + b[i][j];1516 // imprimindo matriz c17 for (int i = 0; i < M; i++) {18 for (int j = 0; j < N; j++)19 cout << c[i][j] << " ";20 cout << endl;21 }2223 return 0;24 }

31 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício 2

Escrever um programa que leia uma matriz, seus elementos e suadimensão (m,n ≤ 100). Em seguida, o programa deve:

1 solicitar ao usuário o índice de uma linha (`) e um valor constante (c);2 multiplicar todos elementos da linha ` por c;3 imprimir a matriz resultante;

32 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício 2

Lendo a matriz:

1 int matriz[100][100];23 // lendo as dimensões da matriz4 cout << "Digite as dimensões m e n da matriz: ";5 cin >> m >> n;67 // lendo os elementos da matriz8 for (int i = 0; i < m; i++) {9 for (int j = 0; j < n; j++) {

10 cout << "Digite o valor de matriz[" << i << "][" << j << "] ";11 cin >> matriz[i][j];12 }13 }

33 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Solicitando o índice da linha ` e o valor de c para, em seguida, multiplicaros elementos da linha ` por c e imprimir a matriz resultante:

1 int linha, constante;2 cout << "Digite o índice da linha a alterar: ";3 cin >> linha;4 cout << "Digite o valor da constante: ";5 cin >> constante;67 // multiplicando valores da linha *linha* por *constante*8 for (int j = 0; j < n; j++)9 matriz[linha][j] = matriz[linha][j] * constante;

1011 // imprimindo a matriz resultante12 for (int i = 0; i < m; i++) {13 for (int j = 0; j < n; j++)14 cout << matriz[i][j] << " ";15 cout << endl;16 }

34 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício 3

Escreva um programa que declare uma matriz (5×5) e inicialize cadaposição com o valor 0. Em seguida, o usuário deve digitar o índice dalinha e da coluna e o valor da posição.

A leitura será feita enquanto os índices forem não negativos.

Após a leitura o programa deve imprimir a matriz na tela.

35 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

1 int matriz[5][5];2 int linha, coluna, valor;34 for (int i = 0; i < 5; i++)5 for (int j = 0; j < 5; j++)6 matriz[i][j] = 0;78 do {9 cout << "Usuário, digite linha, coluna e valor: ";

10 cin >> linha >> coluna >> valor;1112 if (linha >= 0 && coluna >= 0)13 matriz[linha][coluna] = valor;1415 } while (linha >= 0 && coluna >= 0);1617 for (int i = 0; i < 5; i++) {18 for (int j = 0; j < 5; j++)19 cout << matriz[i][j] << " ";20 cout << endl;21 }

36 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício 4

Escreva um programa que declare e preencha uma matriz (10× 10) comvalores fornecidos pelo usuário.

O programa deve imprimir o maior valor da matriz e em qual posição(linha e coluna) este valor está.

37 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Exercício 5

Escreva um programa que crie uma matriz quadrada e mostre oselementos da diagonal principal e da diagonal secundária.

38 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Aula de hoje

1 Exercício da última aula

2 Introdução

3 Definição

4 Exemplos e exercícios

5 Próxima aula

38 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

Próxima Aula

Aula prática: vetores e matrizes

Mais sobre matrizes...

Spoiler: podemos ter uma matriz com mais de duas dimensões?

1 // que tal a matriz abaixo?2 int matriz_3_dimensoes[10][10][10];34 // utilizaríamos assim?5 matriz_3_dimensoes[0][0][0] = 10;6 cout << matriz_3_dimensoes[0][0][0] << endl;

39 / 39 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 19: Matrizes

/ 12

Perguntas?