Matrizes

Tópicos

Revisão de listas

O que é impresso pelo seguinte trecho de código:

Vejamos o código acima pela ótica do codelens:

CodeLens: (aluna11_apelido_1)

No código acima b é uma referência ou apelido (= alias) para a mesma lista a que a está se referenciando.

O trecho de código a seguir cria um cópia (= clone) de a e b será uma referência a essa cópia.

Vejamos o que o codelens tem a dizer sobre o trecho de código acima.

CodeLens: (aula11_clone_1)

A fatia a[:] é uma cópia de a, uma fatia com todos os elementos de a. Lembre-se que o : é utilizado para definir uma fatia da lista. Por exemplo, a[1:3] produz a lista [1,2].

Criação de matrizes

Matrizes são estruturas bidimensionais (tabelas) com m linhas por n colunas muito importantes na matemática, utilizadas por exemplo para a resolução de sistemas de equações e transformações lineares.

Em Python, uma matriz pode ser representada como uma lista de listas, onde um elemento da lista contém uma linha da matriz, que por sua vez corresponde a uma lista com os elementos da coluna da matriz.

NumPy - Numerical Python

Dizem que, quando você usa Python, as baterias vem incluídas, pois há vários módulos a sua disposição. Um deles é o [NumPy](http://www.numpy.org/), que facilita operações com matrizes e torna o seu processamento mais eficaz. Mas usar matrizes como listas de listas é um recurso muito útil, inclusive para aprender mais sobre listas.

Qual o problema do seguinte pedaço de código para criação de uma matriz A com 5 linhas e 5 colunas com o valor 2 na posição [1][1] e zero nas demais posições?

CodeLens: (crie_matriz_0)

A variável linha_com_zeros contém uma referência à lista [0, 0, 0, 0, 0]. No trecho de código acima, na tentativa de cria uma matriz A, essa mesma referência é copiada 5 vezes. Assim, todas as linhas apontam para a mesma lista!

Para criarmos uma matriz é necessário criarmos 5 listas diferentes (uma para cada linha) como por exemplo:

CodeLens: (crie_matriz_1)

Podemos ainda criar uma matriz de zeros utilizando uma função como

CodeLens: (crie_matriz_2)

Veja a seguir uma versão errada da função crie_matriz(). Nessa versão cada linha da matriz é um apelido de uma mesma lista.

CodeLens: (crie_matriz_errada)

Exercícios

Exercício 1

Escreva a função a leia_matriz() a seguir. Abaixo esta um exemplo com um passo a passo da execução da função.

>>> a = leia_matriz()
Digite o número de linhas: 3
Digite o número de colunas: 4
matriz = []
linha 0 = []
Digite o elemento (0,0): 1
linha 0 = [1]
Digite o elemento (0,1): 2
linha 0 = [1, 2]
Digite o elemento (0,2): 3
linha 0 = [1, 2, 3]
Digite o elemento (0,3): 4
linha 0 = [1, 2, 3, 4]
matriz = [[1, 2, 3, 4]]
linha 1 = []
Digite o elemento (1,0): 5
linha 1 = [5]
Digite o elemento (1,1): 6
linha 1 = [5, 6]
Digite o elemento (1,2): 7
linha 1 = [5, 6, 7]
Digite o elemento (1,3): 8
linha 1 = [5, 6, 7, 8]
matriz = [[1, 2, 3, 4], [5, 6, 7, 8]]
linha 2 = []
Digite o elemento (2,0): 9
linha 2 = [9]
Digite o elemento (2,1): 10
linha 2 = [9, 10]
Digite o elemento (2,2): 11
linha 2 = [9, 10, 11]
Digite o elemento (2,3): 12
linha 2 = [9, 10, 11, 12]
matriz = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> a

Exercício 2

Escreva a função a abaixo:

Exercício 3

Escreva a função a abaixo:

Exercício 4

Escreva um programa que lê n e uma matriz A de inteiros de dimensão n x n, e verifica se A é simétrica.

      0     1     2     3
   +-----+-----+-----+-----+
0  | 11  | -3  |  4  |  8  |
   +-----+-----+-----+-----+
1  | -3  | 12  |  6  | 11  |
   +-----+-----+-----+-----+
2  |  4  |  6  |  5  | 13  |
   +-----+-----+-----+-----+
3  |  8  | 11  | 13  |  5  |
   +-----+-----+-----+-----+

Sugestões: utilize as funções leia_matriz(), imprima_matriz() e simetrica() dos exercícios anteriores.

Exercício 5

Escreva um programa que leia inteiros positivos m e n e os elementos de uma matriz A de números inteiros de dimensão m x n e conta o número de linhas e colunas que tem apenas zeros.

Matriz: 4 x 5
     0     0     0     0     1
     0     0     0     0     0
     0     1     0     0     0
     0     0     0     0     0
Linhas  nulas = 2
Colunas nulas = 3

Exercício 6

Escreva a função a abaixo:

Exercício 7

Escreva um programa que leia duas matrizes, a matriz A de dimensão m x n e B de dimensão n x p e imprime a matriz C de dimensão m x p que é o produto de A por B.

Sugestões: utilize as funções leia_matriz(), imprima_matriz() e multiplica_matriz() dos exercícios anteriores.

Exercício 8

Nesse exercício, vamos continuar a explorar a multiplicação de matrizes, mas dessa vez explorando o coneito de produto escalar de duas listas, que correspondem a uma linha e uma coluna das matrizes multiplicadas.

Parte A

Escreva uma função que recebe um inteiro lin e uma matriz real A e outro inteiro col e uma matriz real B, e calcula a soma do produto entre os elementos da linha lin de A e com os respectivos elementos da coluna col de B. Você deve considerar que o número de colunas de A é o mesmo número de linhas de B.

Parte B

Utilizando a função do item anterior, escreva um programa que leia duas matrizes, a matriz A de dimensão m x n e B de dimensão n x p e imprime a matriz C de dimensão m x p que é o produto de A por B.

Exercício 9

Parte A

Escreva uma função MAX que recebe como entrada uma matriz inteira A e devolve três inteiros: k, lin e col. O inteiro k é um maior elemento de A e é igual a A[lin,col].

Exemplo:

A = [ [3, 7, 1], [1, 2, 8], [5, 3, 4]]

a função deve devolver

8, 1, 2

Obs.: Se o elemento máximo ocorrer mais de uma vez, indique em lin e col qualquer uma das possíveis posições.

Parte B

Escreva um programa que, dado dois inteiros nl e nc e uma matriz quadrada de dimensão nl x nc, cujos elementos são todos inteiros, imprime uma tabela onde os elementos são listados em ordem decrescente, acompanhados da indicação de linha e coluna a que pertencem. Havendo repetições de elementos na matriz, a ordem é irrelevante. Utilize obrigatoriamente o procedimento da parte A, mesmo que você não o tenha feito.

Ex.: No caso da matriz acima, a saída poderia ser:

Elem   Linha  Coluna
  8      1      2
  7      0      1
  5      2      0
  4      2      2
  3      0      0
  3      2      1
  2      1      1
  1      0      2
  1      1      0

Exercício 10

Campo Minado é um jogo que se tornou muito popular por acompanhar o sistema operacional Microsoft Windows.

Nesse jogo, o campo minado pode ser representado por uma matriz retangular. O jogador deve revelar todas as posições livres (sem bomba) da matriz, clicando em uma posição com conteúdo desconhecido. O jogo acaba quando o jogador clicar em uma posição com bomba, ou quando todas as posições livres forem abertas.

Nesse exercício, você deve implementar algumas funções que podem ser utilizadas na implementação desse jogo.

Parte A

Escreva uma função que recebe como parâmetros uma matriz inteira A e uma posição (lin, col) da matriz, e conta quantas posições ao redor da posição (lin, col) contém o valor -1 (valor adotado para representar uma bomba)

Uso de constantes

O uso de constantes é uma boa prática de programação. No caso do campo minado, ao invés de utilizar o valor -1, podemos criar uma constante (variável que nunca muda de valor após criada) chamada BOMBA com o valor -1.

Parte B

Escreva um programa que lê uma matriz A de 0’s (posições livres) e -1’s (bomba). Utilizando a função do item anterior, o programa deve computar e imprimir a quantidade de bombas ao redor de cada posição livre da matriz.

Next Section - Algoritmos de Busca