Buscar

ECT1203 - Aula10 - Matrizes

Prévia do material em texto

ECT1203 Linguagem de Programação 
2012.1 
 
 
Prof. Luiz Eduardo Cunha Leite 
 
Aula 10 – Matrizes 
Universidade Federal do Rio Grande do Norte 
Escola de Ciências e Tecnologia 
Hora de silenciar o celular 
• Manter o celular sempre desligado/silencioso quando 
estiver em sala de aula 
• Nunca atender o celular em sala de aula 
Objetivo da aula 
Apresentar matrizes em C++: 
 Motivação para utilização de matrizes 
 Declaração de matrizes 
 Exemplos de utilização de matrizes 
Matrizes 
• Em C++, as matrizes podem ser: 
• Unidimensionais (vetores) 
• Multidimensionais (duas ou mais dimensões) 
int m[4][3]; 
Declaração de uma matriz 
de duas dimensões 
com 4 linhas e 3 colunas 
Matrizes bidimensionais 
m[0][0] 
 
m[1][2] 
Acessa o elemento da primeira 
linha e primeira coluna 
Acessa o elemento da segunda 
linha e terceira coluna 
• Matrizes de duas dimensões podem ser vistas como vetores 
em que os elementos são outros vetores. 
• Os elementos de uma matriz bidimensional são acessados 
com indexação dupla: o primeiro índice acessa a linha e o 
segundo acessa a coluna. 
Memória 
Modelo abstrato 
int dados[3][3]; 
Organização da Memória do Computador 
01 
02 
03 
04 
05 
06 
07 
08 
09 
•As matrizes são armazenadas de 
forma linear na memória do 
computador 
Armazenamento de uma matriz 
int m[4][3] = {{ 5,10,15}, 
 {20,25,30}, 
 {35,40,45}, 
 {50,55,60}}; 
5 10 15 
20 25 30 
35 40 45 
50 55 60 
lin
h
a
s 
colunas 
Endereço Valor 
100 ... 
104 5 
108 10 
112 15 
116 20 
120 25 
124 30 
128 35 
132 40 
136 45 
140 50 
144 55 
148 60 
152 ... 
m[0][0] 
m[0][1] 
m[0][2] 
m[1][0] 
m[1][1] 
m[1][2] 
m[2][0] 
m[2][1] 
m[2][2] 
m[3][0] 
m[3][1] 
m[3][2] 
Matrizes e estruturas de repetição 
• Matrizes 
 
▫ int i,j,dados[3][5]; 
 for(i=0; i<3 ;i++){ 
 for(j=0; j<5 ; j++){ 
 cin>>[i][j]; 
 } 
} 
• O for mais externo 
(que utiliza a variável 
i) indexa as linhas da 
matriz. 
• O for mais interno 
(que utiliza a variável 
j) indexa colunas da 
matriz. 
 
Para acessar todos os elementos de uma matriz 
frequentemente são utilizados dois laços de repetição 
aninhados. 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 0 
j = 0 
dados[0][0] 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 0 
j = 0 
dados[0][0] 
5 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 0 
j = 1 
dados[0][1] 
5 8 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 0 
j = 2 
dados[0][2] 
5 8 11 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 1 
j = 0 
dados[1][0] 
5 8 11 
34 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 1 
j = 1 
dados[1][1] 
5 8 11 
34 12 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 1 
j = 2 
dados[1][2] 
5 8 11 
34 12 2 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 2 
j = 0 
dados[2][0] 
5 8 11 
34 12 2 
26 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 2 
j = 1 
dados[2][1] 
5 8 11 
34 12 2 
26 77 
int i,j,dados[3][3]; 
for(i=0; i<3; i++){ 
 for(j=0; j<3 ; j++){ 
 cin>>dados[i][j]; 
 } 
} 
 
i = 2 
j = 2 
dados[2][2] 
5 8 11 
34 12 2 
26 77 54 
int main(){ 
 int m[3][4], i, j; 
 for(i=0; i<3; i++) 
 for(j=0; j<4; j++) 
 m[i][j] = (i*4)+j+1; 
 for(i=0; i<3; i++) { 
 for(j=0; j<4; j++) 
 cout << m[i][j] << “ ”; 
 cout << endl; 
 } 
 return 0; 
} 
O que imprime 
o programa ao 
lado? 
int main(){ 
 int m[3][4], i, j; 
 for(i=0; i<3; i++) 
 for(j=0; j<4; j++) 
 m[i][j] = (i*4)+j+1; 
 for(i=0; i<3; i++) { 
 for(j=0; j<4; j++) 
 cout << m[i][j] << “ ”; 
 cout << endl; 
 } 
 return 0; 
} 
O que imprime 
o programa ao 
lado? 
Inicialização de matrizes 
int m[4][3] = {{1,2,3}, 
 {4,5,6}, 
 {7,8,9}, 
 {10,11,12}}; 
int m[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
int m[ ][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
• As três formas a seguir podem ser usadas: 
O número de colunas deve ser 
sempre fornecido. 
Espaço ocupado por uma matriz 
bidimensional 
int m[4][3]; 
número de bytes = 
tamanho da 1ª dimensão * tamanho da 2ª dimensão * sizeof(tipo) 
A matriz m ocupa 48 bytes 
na memória. 
Matrizes multidimensionais 
int m[4][3][6][5]; 
A matriz m ocupa 1440 
bytes. 
• O número máximo de dimensões depende do compilador. 
• A forma geral da declaração é: 
tipo nome[tamanho1][tamanho2]...[tamanhoN]; 
Usando matrizes de 3 dimensões 
int tres[3][2][4] = 
{ 
 { {1,2,3,4}, {5,6,7,8} }, 
 { {7,9,3,2}, {4,6,8,3} }, 
 { {7,2,6,3}, {0,1,9,4} } 
}; 
Como acessar o único valor zero 
armazenado na matriz acima? 
Usando matrizes de 3 dimensões 
int tres[3][2][4] = 
{ 
 { {1,2,3,4}, {5,6,7,8} }, 
 { {7,9,3,2}, {4,6,8,3} }, 
 { {7,2,6,3}, {0,1,9,4} } 
}; 
 terceiro grupo (elemento) 
tres[2][1][0] primeiro dos 4 números 
 segundo elemento do terceiro grupo
 
 
Exercício 1 
Escreva um programa que receba do usuário uma 
matriz bidimensional de dimensão MxN, calcular e 
imprimir a matriz transposta. O usuário deve 
fornecer os tamanhos da matriz e, em seguida, os 
elementos da matriz. 
Observação: 
• M, N <= 30 
• M e N devem ser lidos. 
 
Exercício 2 
Determinar se uma matriz NxN é uma matriz de 
permutação. Uma matriz quadrada é chamada de 
matriz de permutação se seus elementos são apenas 
0’s e 1’s e se em cada linha e coluna da matriz existe 
apenas um único valor 1. 
Exemplo: A matriz ao lado é uma matriz de 
permutação. 
Observação: 
• N <= 30 
• N deve ser lido. 
 
 
1 0 0 0 
0 0 0 1 
0 0 1 0 
0 1 0 0 
Exercício 3 
Dadas duas matrizes A (M x N) e B (N x O) reais, 
encontrar e escrever uma matriz C (M x O) onde C é 
obtida pelo produto de A por B (C = A x B). 
 
Ex.: 𝑎00 𝑎01 𝑎02
𝑎10 𝑎11 𝑎12
×
𝑏00 𝑏01
𝑏10 𝑏11
𝑏20 𝑏21
= 
𝑎00 ∗ 𝑏00 + 𝑎01 ∗ 𝑏10 + 𝑎02 ∗ 𝑏20 𝑎00 ∗ 𝑏01 + 𝑎01 ∗ 𝑏11 + 𝑎02 ∗ 𝑏21
𝑎10 ∗ 𝑏00 + 𝑎11 ∗ 𝑏10 + 𝑎12 ∗ 𝑏20 𝑎10 ∗ 𝑏01 + 𝑎11 ∗ 𝑏11 + 𝑎12 ∗ 𝑏21
 
𝑎𝑖,𝑗 = 𝑎𝑖,𝑘 ∗ 𝑏𝑘,𝑗
𝑛−1
𝑘=0
 
Exercício 4 
Dizemos que uma matriz quadrada inteira é um 
quadrado mágico se a soma dos elementos de cada 
linha, a soma dos elementos de cada coluna e a 
soma dos elementos das diagonais principal e 
secundária são todas iguais. Dada uma matriz 
quadrada Anxn , verificar se A é um quadrado mágico 
é um quadrado mágico 
Exercício 5 
(POLI 94) Os elementos aij de uma matriz inteira Anxn 
representamos custos de transporte da cidade i para 
a cidade j. Dados uma matriz de custos Anxn e n (n <= 
100) itinerários, cada um com k (k <= 30) cidades, 
calcular o custo total para cada itinerário. 
• Exemplo: 
O custo do itinerário 
 0 3 1 3 3 2 1 0 é 
a03+a31+a13+a33+a32+a21+a10= 
3 + 1 + 400 + 5 + 2 + 1 + 5 = 417

Continue navegando