MAC2166 Introdução à Computação - aulas 11 e 12 - Mauro Cesar Bernardes 22/Abril/2014
Agenda Revisão da aula anterior Listas Comando For Matrizes Estruturando um programa com uma função main()
#----------------------------------------------- # programa principal def main(): ''' Função principal do programa ''' bloco de comandos da função main() #------------------------------------------------ # montes de funções def f(x,lista,nome): ''' (float, list, str) -> int,list A Função f faz... ''' Bloco de comandos da função f def g(n,verbose,nome): ''' (int, bool, str) -> None A Função g faz... ''' Bloco de comandos da função g #------------------------------------------------ # início do programa, chamada da main() main()
Listas
Listas Uma lista é escrita entre colchetes com os elementos separados por vírgula: l1=[] #l1 contém lista vazia l2=[1,2] #l2 contém lista com 2 elementos Os elementos de uma lista podem ser de qualquer tipo, inclusive listas. Ex.: lista= [1,'a',2+3j, ['ab', 'CD']] Os elementos de uma lista podem ser acessados por índices como strings O primeiro elemento tem índice 0 O último elemento tem índice de sua posição -1
Listas L=[18,27,36,65,34,13] Cria uma lista L com 6 elementos (6 números inteiros) L[0] L[1] L[2] L[3] L[4] L[5] L[-6] L[-5] L[-4] L[-3] L[-2] L[-1] Indices para acesso aos elementos da lista L print(l) [18,27,36,65,34,13] print(l[1]) 27 L[1]=33 print(l) [18,33,36,65,34,13] print(l[1]) 33 print(l[-1]) 13 print(l[-2]) print(l[6]) 34 Outra forma para acesso aos elementos da lista L Traceback (most recent call last): File "C:/Python33/lista1.py", line 9, in <module> print(l[6]) IndexError: list index out of range
append(elemento) Listas: append() Acrescenta o elemento no fim da lista Observe que a operação altera a lista, e não simplesmente retorna uma lista modificada Exemplo: lista=[1,2,3] print(lista) lista.append(4) print(lista) lista.append(5) print(lista) [1,2,3] Resultado: [1,2,3,4] [1,2,3,4,5]
Listas: len(), min(), max() len(lista) retorna o número de elementos de lista min(lista) retorna o menor elemento de lista max(lista) retorna o maior elemento de lista Exemplo: lista=[1,2,9,3,4] print(min(lista)) #imprime o menor elemento = 1 print(len(lista)) #imprime o tamanho da lista= 5 print(max(lista)) #imprime o maior elemento = 9
Listas: exercício Escreva um programa que leia um número inteiro n e, em seguida, leia n números inteiros acrescentando-os em uma lista L. n=int(input("entre com o valor de n:")) L=[] while n>0: numero=int(input("entre com o número:")) L.append(numero) n=n-1 print(l)
Comando For
Comando for O comando for é utilizado para repetições (loop) em Python, muito útil para percorrer listas. Ex.: lista=[8,4,5,3,6,7] for elemento in lista: print (elemento) A cada iteração (loop), a variável elemento receberá o valor de um elemento da lista, sequencialmente.
Função range() Podemos utilizar a função range() como um gerador de números. Ex.: range(10)irá gerar 10 números, de 0 a 9 for item in range(10): print (item) A cada iteração (loop), a variável item receberá um valor de uma lista de 10 elementos, partindo de 0 até 9.
Função range()com dois intervalos Podemos indicar qual o primeiro número a ser gerado. Para isso, utilizamos dois parâmetros: início e fim. Ex.: range(6,10)irá gerar 4 números, de 6 a 9 for item in range(6,10): print (item) A cada iteração (loop), a variável item receberá um valor de uma lista partindo de 6 até 9.
Função range() com saltos Se acrescentarmos um terceiro parâmetro à função range, teremos como saltar entre os valores gerados. Ex.: range(4,10,2)irá gerar 3 números for item in range(4,10,2): print (item) A cada iteração (loop), a variável item receberá um valor de uma lista partindo de 4 até 9, com salto de 2.
Cuidado com atribuição de listas...
Problema: Qual o resultado do seguinte trecho de programa? a = [0, 1, 2, 3, 4] b = a b [1] = 7 print ("a = ", a) print ("b = ", b) Por que o conteúdo de a é igual ao conteúdo de b? a [0, 1, 2, 3, 4] b [1] = 7 b
Problema: O problema no programa anterior é que b recebe uma "referência" para a. O seguinte código corrige o problema, atribuindo uma cópia de a em b: a = [0, 1, 2, 3, 4] b = a[:] b [1] = 7 print ("a = ", a) print ("b = ", b) a b [0, 1, 2, 3, 4] [0, 7, 2, 3, 4] a[:] retorna uma cópia de a (uma "fatia" com todos os elementos de a). Podemos usar o ':' para definir qualquer "fatia" da lista. Exemplo: a[1:3] retorna uma lista com [1,2]
Matrizes
Matrizes: Matrizes são estruturas indexadas em forma matricial (como ilustrado na figura abaixo). Em Python, uma matriz é frequentemente representada como uma lista de listas.
Matrizes: Índices São usados índices para acessar uma linha e uma coluna de uma matriz. Os índices são números naturais. O índice da primeira linha é sempre zero. O índice da primeira coluna é sempre zero. Número de linhas: 4 n 4x8 0 1 2 3 4 5 6 7 n[0][0]=5 n[1][2]=3 n[3][5]=7 Número de colunas: 8 n 0 1 2 3 5 3 7
Acesso a uma posição da matriz print(m[3][5]) Posição na linha: 3 m Posição na coluna: 5 0 1 2 3 4 0 1 2 3 4 5 6 7 8 9
Criação de matrizes. Listas aninhadas são frequentemente utilizadas para representar matrizes. Por exemplo, a matriz: poderia ser representada como: >>> matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Neste exemplo, matriz é uma lista com três elementos, onde cada elemento é uma linha da matriz. Podemos selecionar uma linha inteira da matriz da maneira habitual: >>> matriz[1] [4, 5, 6] Ou podemos extrair um único elemento da matriz utilizando a forma de duplo índice: >>> matriz[1][1] 5 O primeiro índice seleciona a linha, e o segundo índice seleciona a coluna. Embora esta maneira de representar matrizes seja comum, ela não é a única possibilidade. Uma pequena variação é utilizar uma lista de colunas ao invés de uma lista de linhas.
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 elemento da lista contém uma linha da matriz, que por sua vez corresponde a uma lista com os elementos da coluna da matriz. Qual o problema do seguinte pedaço de código para criação de uma matriz A 5x5 com o valor 2 na posição [1][1] e zero nas demais posições? # A = [ [0]*5 ] *5 linha_com_zeros = [0]*5 A = [ linha_com_zeros ] * 5 A[1][1] = 2 print (A) A variável linha_com_zeros contém uma referência à lista [0, 0, 0, 0, 0]. Ao criar a matriz A, essa mesma referência é copiada 5 vezes.
Criação de matrizes. É necessário criar 5 linhas diferentes como por exemplo: A variável i assumirá valores de 0 a 4 A = [] for i in range(5): A.append( [0] * 5 ) A[1][1] = 2 print(a)
Percorrendo Matrizes: Um padrão para percorrer completamente a matriz A (isto é, as nl linhas e as nc colunas) por linhas é usar dois comandos de repetição (no caso, vamos usar o comando for) com duas variáveis inteiras, e.g. lin e col, uma para percorrer as linhas e a outra para percorrer as colunas da matriz A: Exemplo: for lin in range(nl): for col in range(nc): A[lin][col] matriz=[[11, 12, 13], [21, 22, 23], [31, 32, 33]] n=3 for lin in range(n): for col in range(n): print(matriz[lin][col]) ou: matriz=[[11, 12, 13], [21, 22, 23], [31, 32, 33]] for lin in range(len(matriz)): for col in range(len(matriz[lin])): print(matriz[lin][col])
1.py Exemplo para Leitura de uma Matriz 3 x 3: #criando uma matriz 3 x 3 matriz = [] n = 3 for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("matriz[%d,%d]:" %(linha,coluna))) tmp.append(elemento) matriz.append(tmp[:]) print(matriz) matriz 0 1 2 0 1 2 11 12 13 21 22 23 31 32 33 tmp= 31 21 11 32 22 12 33 13 23
Percorrendo matriz 3x3 e somando 1: matriz = [[11, 12, 13], [21, 22, 23], [31, 32, 33]] Exemplo: #percorrendo matriz 3x3 e somando 1 matriz = [[11, 12, 13], [21, 22, 23], [31, 32, 33]] for linha in range(len(matriz)): for coluna in range(len(matriz[linha])): matriz[linha][coluna] += 1 print (matriz)
Impressão de uma Matriz: Exemplo 1 matriz=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]] for linha in range(len(matriz)): for coluna in range(len(matriz[linha])): print("%3d" %(matriz[linha][coluna]), end="") print("")
Impressão de uma Matriz: Exemplo 2 matriz=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]] for linha in range(len(matriz)): s= "" for coluna in range(len(matriz[linha])): s+= "%3d" %(matriz[linha][coluna]) print(s)
Exercício Desenvolva um programa para ler todos os elementos de uma matriz 5x5 e imprimir os valores da diagonal principal. (A diagonal principal é determinada por linha=coluna). Representação da matriz Matriz 5x5 0 1 2 3 4 0 Matriz 1 2 3 4
Uma solução matriz = [] n = 5 for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("matriz [%d,%d]:" %(linha,coluna))) tmp.append(elemento) matriz.append(tmp[:]) for linha in range(5): for coluna in range(5): if linha==coluna: print (matriz[linha][coluna]) matriz 0 1 2 3 4 0 1 2 3 4
Solução Michelle matriz = [] n = 5 for linha in range(n): matriz.append([0]*5) for linha in range(n): for coluna in range(n): matriz[linha][coluna]= int(input("matriz [%d,%d]:" %(linha,coluna))) for i in range(5): print (matriz[i][i]) matriz 0 1 2 3 4 0 1 2 3 4
Solução Lucas matriz = [] n = int(input("entre com o valor de n:")) for linha in range(n): matriz.append([0]*n) for linha in range(n): for coluna in range(n): matriz[linha][coluna]= int(input("matriz [%d,%d]:" %(linha,coluna))) for i in range(n): print (matriz[i][i]) matriz 0 1 2 3 4 0 1 2 3 4
for linha in range(5): print (matriz[linha][linha]) Outra solução matriz = [] n = 3 for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("matriz [%d,%d]:" %(linha,coluna))) tmp.append(elemento) matriz.append(tmp[:])
#programa principal dimensao=int(input("entre com o valor de n:")) mat=leiamatriz(dimensao) imprimamatrix(mat) matriz 0 1 2 0 1 2 Utilizando funções... def leiamatriz(n): """que lê uma matriz quadrada nxn """ matriz=[] for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("matriz[%d,%d]:" %(linha,coluna))) tmp.append(elemento) matriz.append(tmp[:]) return matriz def imprimamatrix(matriz): """que lê uma matriz quadrada nxn """ for cont in range(len(matriz)): print("diagonal[%d,%d]= %d" %(cont,cont,matriz[cont][cont])) 2.py
Passando a matriz como parâmetro def leiamatriz(matriz,n): for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("matriz[%d,%d]:" %(linha,coluna))) tmp.append(elemento) matriz.append(tmp[:]) def imprimamatrix(matriz): for cont in range(len(matriz)): print("diagonal[%d,%d]= %d" %(cont,cont,matriz[cont][cont])) #----programa principal mat = [] dimensao=int(input("entre com o valor de n:")) leiamatriz(mat, dimensao) imprimamatrix(mat) matriz 3.py 0 1 2 0 1 2
Passando a matriz como parâmetro def leiamatriz(matriz,n): for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("matriz[%d,%d]:" %(linha,coluna))) tmp.append(elemento) matriz.append(tmp[:]) def imprimamatrix(matriz): for cont in range(len(matriz)): print("diagonal[%d,%d]= %d" %(cont,cont,matriz[cont][cont])) #----programa principal mat = [] dimensao=int(input("entre com o valor de n:")) leiamatriz(mat, dimensao) imprimamatrix(mat) matriz 3.py 0 1 2 0 1 2
def main(): mat = [] dimensao=int(input("entre com o valor de n:")) mat=leiamatriz(dimensao) imprimamatrix(mat) matriz 0 1 2 0 1 2 Utilizando uma função main()... def leiamatriz(n): matriz=[] for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("elemento da posicao [%d,%d]:" %(linha,coluna))) tmp.append(elemento) matriz.append(tmp[:]) return matriz def imprimamatrix(matriz): for cont in range(len(matriz)): print ("Diagonal [%d,%d]= %d" %(cont,cont,matriz[cont][cont])) #programa principal main() 4.py
#----------------------------------------------- # programa principal def main(): ''' Função principal do programa ''' bloco de comandos da função main() #------------------------------------------------ # montes de funções def f(x,lista,nome): ''' (float, list, str) -> int,list A Função f faz... ''' Bloco de comandos da função f def g(n,verbose,nome): ''' (int, bool, str) -> None A Função g faz... ''' Bloco de comandos da função g #------------------------------------------------ # início do programa, chamada da main() main()
Qual o resultado da execução do programa abaixo? def multiplicapordois(x): for linha in range (len(x)): for coluna in range (len(x[linha])): x[linha][coluna] *= 2 print("--- Matriz dentro da função, após multiplicação ---") print(x) print("\n") def escrevematriz(x): for linha in range (len(x)): print (x[linha]) matriz=[[11,12,13,14,15],[21,22,23,24,25],[31,32,33,34,35]] print("--- Matriz original ---") print(matriz) print("\n") multiplicapordois(matriz) print("--- Matriz após chamada da função ---") print(matriz) print("\n") escrevematriz(matriz)
Resultado da execução do programa anterior
Problema 1: Exercícios: Escreva um programa que lê n e uma matriz A nxn, e verifica se a matriz A é simétrica. Obs.: Matriz Simétrica Se uma matriz quadrada A(n)=(aij) tem aij = aji; par (i;j), então A é uma matriz simétrica. Note que: caso A=A, então, A é simétrica. Exemplo: matriz 5 3 2 0 1 2 0 1 1 5 2 4 4 2 0
A=[] n=int(input("digite o valor de n:")) #leitura dos valores da matriz Anxn for linha in range(n): tmp = [] for coluna in range(n): elemento = int(input("a[%d,%d]:" %(linha,coluna))) tmp.append(elemento) A.append(tmp[:]) #testando se a matriz A é simétrica simetrica=true for linha in range(len(a)): for coluna in range(len(a[linha])): if A[linha][coluna]!= A[coluna][linha]: simetrica=false #impressão do resultado if simetrica: print("a matriz é simétrica!") else: print("a matriz não é simétrica!") Uma solução...
def leiamatriz(matriz,n): for linha in range(n): tmp = [] for coluna in range(n): ele = int(input("matriz [%d,%d]:" %(linha,coluna))) tmp.append(ele) matriz.append(tmp[:]) #programa principal n=int(input("digite o valor de n:")) A=[] leiamatriz(a,n) #testando se a matriz A é simétrica simetrica=true for linha in range(len(a)): for coluna in range(len(a[linha])): if A[linha][coluna]!= A[coluna][linha]: simetrica=false #impressão do resultado if simetrica: print("a matriz é simétrica!") else: print("a matriz não é simétrica!") Outra solução (com uma função)...
Exercícios: Problema 2: Escreva um programa que leia os valores para duas matrizes A mxp e B pxn e imprime a matriz C mxn, que é o produto de A por B. Sugestão: escreva uma função para fazer a leitura de uma matriz do teclado. Produto de Matrizes Dadas duas matrizes A=(a ij ) mxn e B=(b ij ) mxn, o produto da matriz A pela matriz B, nesta ordem, somente será possível quando o número de colunas da matriz A for igual ao número de linhas da matriz B. A matriz produto (A x B) mxn terá número de linhas de A e número de colunas de B. Os elementos da matriz produto são obtidos multiplicando-se cada elemento das linhas da matriz A pelo correspondente elemento das colunas da matriz B e adicionando os produtos obtidos.
#programa principal print(" Amp X Bpn") m=int(input("m:")) p=int(input("p:")) n=int(input("n:")) A=[] B=[] C=[] Uma solução... leiamatriz(a,m,p) print("a=",a) leiamatriz(b,p,n) print("b=",b) C=prodMatriz(A,B) print(c) Continua...
def leiamatriz(matriz,linha,coluna): """leitura de matrizes""" for l in range(linha): tmp = [] for c in range(coluna): elemento = int(input("matriz[%d,%d]:" %(l,c))) tmp.append(elemento) matriz.append(tmp[:]) def prodmatriz(a,b): """Multiplica duas matrizes.""" #cria matriz C C=[] for i in range(m): temp=[] for j in range(n): temp.append(0) C.append(temp[:]) for i in range(len(a)): for j in range(len(b[i])): val=0 for k in range(len(b)): val = val + A[i][k]*B[k][j] C[i][j]=val return C Continuação.
Exercícios: Problema 3: Faça um programa que leia n e os elementos de uma matriz real A nxn e verifica se a matriz A tem uma linha, coluna ou diagonal composta apenas por zeros.
Exercício: Dado um inteiro num > 0, imprimir a representação de num na base 2 Exs: 1 = 1, 2 = 10, 3 = 11, 4 = 100,... def main(): ''' Recebe um inteiro num e imprime a representação de num na base 2''' num = int(input("digite o valor de num: ")) lista = int_para_lista(num) i = len(lista) - 1 while i >= 0: print(lista[i], end = "") i -= 1 def int_para_lista(num): '''(int) -> lista -recebe um inteiro num > 0 e devolve uma lista com uma representação de num na base 2''' lista = [] while num > 0: lista.append(num%2) num //= 2 return lista main()
Exercício Dado um inteiro n > 0, imprimir todas as matrizes de 0s e 1s de dimensão n X n def main(): ''' Recebe um inteiro n e imprime a todas as matrizes de 0s e 1s de dimensão n X n ''' n = int(input("digite a dimensão da matriz: ")) for num in range(2**(n*n)): imprime_matriz(int_para_matriz(num, n)) def int_para_matriz(num, n): '''(int, int) -> matriz recebe um inteiro num > 0 e devolve uma matriz de 0s e 1s de dimensão n X n que representa num''' matriz = [] for i in range(n): linha = [] for j in range(n): linha.append(num%2) num //= 2 matriz.append(linha) return matriz def imprime_matriz(a): for i in range(len(a)): for j in range(len(a[i])): print("%3d" %(A[i][j]), end="") print() print() main()
Exercícios: PROBLEMA EXTRA. Um jogo de palavras cruzadas pode ser representado por uma matriz A mxn onde cada posição da matriz corresponde a um quadrado do jogo, sendo que 0 indica um quadrado branco e -1 indica um quadrado preto. Indicar na matriz as posições que são início de palavras horizontais e/ou verticais nos quadrados correspondentes (substituindo os zeros), considerando que uma palavra deve ter pelo menos duas letras. Para isso, numere consecutivamente tais posições. Exemplo: Dada a matriz: 0-1 0-1 -1 0-1 0 0 0 0 0-1 0 0 0 0 0-1 -1 0 0-1 0-1 0 0 0 0-1 0 0 0 0-1 0 0 0-1 -1 A saída deverá ser: 1-1 2-1 -1 3-1 4 5 6 0 0-1 7 0 0 8 0-1 -1 9 0-1 0-1 10 0 11 0-1 12 0 13 0-1 14 0 0-1 -1
Funções com Matrizes PROBLEMA 4 (Compute a matriz de campo minado (minesweeper).) (a) Escreva uma função que recebe como parâmetros uma matriz inteira A nxm, e uma posição (i,j) da matriz, e conta quantas posições ao redor da posição (i,j) contém o valor -1. (b) Escreva um programa que lê uma matriz A nxm de 0's (posições livres) e -1's (minas). Utilizando a função do item anterior, o programa deve computar e imprimir a quantidade de minas ao redor de cada posição livre da matriz. PROBLEMA 5 a) Escreva uma função que recebe como parâmetros uma matriz real A nxm, e uma posição (i,j) da matriz, e calcula a média aritmética dos vizinhos de (i,j), ou seja, a média entre A[i-1][j], A[i+1][j], A[i][j+1] e A[i][j+1]. Desconsidere os vizinhos que não pertencem a matriz (por exemplo, os vizinhos de (0, 0) são somente (0,1) e (1,0)). b) Escreva uma função que recebe como parâmetro uma matriz real A nxm e devolve uma matriz A média, onde A média [i][j] é a média aritmética dos vizinhos de (i,j). Para isto, utilize a função do item anterior. c) Escreva um programa que lê uma matriz real A nxm, e um número inteiro k; utilizando a função do item anterior, o programa deve transformar a matriz k vezes, imprimindo a matriz inicial e depois de cada transformação.
Funções com Matrizes PROBLEMA 6 Dizemos que uma matriz A nxn é um quadrado latino de ordem n se em cada linha e em cada coluna aparecem todos os inteiros 1,2,3,...,n (ou seja, cada linha e coluna é permutação dos inteiros 1,2,...,n). (a) Escreva uma função que recebe como parâmetros um inteiro n, um vetor V com n inteiros e verifica se em V ocorrem todos os inteiros de 1 a n. (b) Usando a função acima, verifique se uma dada matriz inteira A nxn é um quadrado latino de ordem n.
Funções com Matrizes PROBLEMA EXTRA. (a) Faça uma função que recebe como entrada um inteiro n, uma matriz inteira A nxn e devolve três inteiros: k, Lin e Col. O inteiro k é um maior elemento de A e é igual a A[Lin,Col]. Obs.: Se o elemento máximo ocorrer mais de uma vez, indique em Lin e Col qualquer uma das possíveis posições. Exemplo: (b) Faça um programa que, dado um inteiro n e uma matriz quadrada de ordem n, cujos elementos são todos inteiros positivos, 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. Exemplo: No caso da matriz acima, a saída poderia ser o conteúdo da tabela ao lado: 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