MAC2166 Introdução à Computação - aulas 13 e 14- Mauro Cesar Bernardes 29/Abril/2014
Agenda Strings Manipulação de Arquivos Matrizes...
Strings
Strings Uma string é uma sequencia de caracteres Utiliza aspas ' ' ou " " o sinal + concatena strings Uma string pode ser composta apenas de números (e ainda será uma string) Para converter números em string utilize str() Para converter uma string em números utilize int() ou float()
e000.py
Strings É possível o acesso a qualquer caractere de um string utilizando índices b a n a n a 0 1 2 3 4 5
Strings Cuidado com os índices!! b a n a n a 0 1 2 3 4 5 Índice Inválido
Comando for O comando for, utilizado para repetições (loop) em Python, também é útil para percorrer strings. Ex.: texto="testando um string" for caracter in texto: print (caracter) A cada iteração (loop), a variável caractere receberá um caractere do string armazenado em texto, sequencialmente. e0.py
Comando for O comando for, utilizado para repetições (loop) em Python, também é útil para percorrer strings. Ex.: texto="testando um string" for i in range(len(texto)): print (texto[i]) A cada iteração (loop), a variável caractere receberá um caractere do string armazenado em texto, sequencialmente. e00.py
Strings são imutáveis Analise o trecho a seguir: texto="testando um string." texto[0]="t" for i in range(len(texto)): print (texto[i]) ERRO!! Strings são imutáveis! e00.py
Utilizando in como um operador Pode-se utilizar in para verificar se um string está contido em outro string O in é utilizado em uma expressão lógica e retorna True ou False (pode ser utilizado em uma estrutura com if)
Biblioteca string https://docs.python.org/3.3/library/string.html
Alguns métodos para manipular Strings >>> test = 'This is just a simple string.' >>> len(test) 29 >>> test = test.replace('simple', 'short') >>> test 'This is just a short string.' >>> test.count('r') 2 >>> test.find('r') 18 >>> test[18] 'r' >>> test.upper() 'THIS IS JUST A SHORT STRING.' >>> test.lower() 'this is just a short string.'
Removendo whitespace Dependendo da aplicação, precisaremos remover whitespace no início ou no fim de um string lstrip() e rstrip()removem whitespace à direita ou à esquerda strip() Remove whitespace do início e do final
Arquivos
Manipulação de arquivos: a função open() A função open() serve para obter uma referência a um objeto do tipo arquivo. Assumindo que temos um arquivo chamado arquivo.txt, contendo um trecho de um livro famoso, podemos codificar o seguinte exemplo: >>> a = open("arquivo.txt") >>> print a <open file 'arquivo.txt', mode 'r' at 0x820b8c8> Uma vez obtida a referência ao objeto arquivo, podemos usar métodos específicos como o read(), que retorna o conteúdo do arquivo: >>> texto = a.read() >>> print texto `...Would you tell me, please, which way I ought to go from here?' `That depends a good deal on where you want to get to,' said the Cat. `I don't much care where--' said Alice. `Then it doesn't matter which way you go,' said the Cat.
Manipulação de arquivos: sintaxe da função open() O formato geral da função open é: open(nome_do_arquivo, modo) Ambos os parâmetros são strings. O modo determina a forma como o arquivo será aberto e é composto de uma ou mais letras: 'r' (ou nada) abre para leitura, 'w' abre para escrita, apagando o conteúdo já existente 'a' abre para escrita, com dados escritos acrescentados ao final do arquivo. Se um símbolo '+' for agregado ao modo, o arquivo pode ser lido e escrito simultaneamente.
Arquivo: alunos.txt
Manipulação de arquivos: métodos do objeto arquivo O objeto arquivo possui um conjunto de métodos úteis; os mais importantes são descritos abaixo. Note que o arquivo possui um conceito de posição atual: em um dado momento, operações serão realizadas com base em uma certa posição. Alguns métodos utilizam ou alteram esta posição; outros são operações globais, independentes da posição dela. read(): retorna uma string única com todo o conteúdo do arquivo. readline(): retorna a próxima linha do arquivo e incrementa a posição atual. readlines(): retorna todo o conteúdo do arquivo em uma lista, uma linha do arquivo por elemento da lista. writelines(data): escreve cada elemento string da lista data na posição atual ou ao final do arquivo, dependendo do modo de abertura. seek(n): muda a posição atual do arquivo para o valor indicado em n. close(): fecha o arquivo. Qualquer arquivo pode ser aberto e lido desta forma; experimente com esta função, abrindo alguns arquivos locais, lendo e modificando-os
Arquivo: alunos.txt Exemplos de whitespaces que podem ser removidos com o uso de rstrip ou strip ou end=""
end="" para remover o whitespace \n do final de cada linha do arquivo.
arquivo = input("nome do arquivo: ") arq = open(arquivo, 'r', encoding="utf8") nlin = 1 for linha in arq: print(nlin, ':', linha) nlin += 1 e1.py
arquivo = input("nome do arquivo: ") arq = open(arquivo, 'r', encoding="utf8") nlin = 1 for linha in arq: print(nlin, ':', linha, end="") nlin += 1
arquivo = input("nome do arquivo: ") arq = open(arquivo, 'r', encoding="utf8") nlin = 1 for linha in arq: print("%6d : %s" %(nlin, linha), end="") nlin += 1
abriu = False while not abriu: arquivo = input("nome do arquivo: ") try: arq = open(arquivo, 'r') except FileNotFoundError: print(arquivo, 'não encontrado.') else: abriu = True nlin = 1 for linha in arq: print('%6d:'%(nlin), end="") nlin += 1 e1.py
Analise o programa a seguir: def imprime(p): for caracter in p: print(caracter) palavra=input("digite uma palavra:") imprime(palavra)
Problema 5.2 a) Escreva uma função separa(texto, sep), que recebe uma frase texto e um caractere separador sep. A função "corta" o texto nos separadores, retornando uma lista com as palavras do texto. Exemplo: para o texto= ",1,,2,3," e sep =, a saída deve ser a lista: ['', '1', '', '2', '3', ''] onde '' indica uma palavra vazia (entre 2 separadores consecutivos). def separa(texto, sep): lista = [] palavra = '' for l in texto: if l == sep: lista.append(palavra) palavra = '' else: palavra += l lista.append(palavra) return lista
Problema 5.2 b) Escreva um programa que leia uma linha com palavras separadas por vírgula, e determina o comprimento da maior palavra. A linha pode conter palavras vazias. frase = input("digite palavras separadas por vírgula: ") palavras = separa(frase, ',') #função apresentada anteriormente print (palavras) if len(palavras) > 0: maxp = palavras[0] for p in palavras: print ("A palavra '%s' tem %d caracteres."%(p, len(p))) if len(p) > len(maxp): maxp = p print("> palavra é:'%s' com %d caracteres." %(maxp, len(maxp))) else: print("não achei nenhuma palavra em sua frase!")
Método split() O método split() separa a string pelos espaços. Exemplo: teste = 'oi tudo bem?' print(teste.split()) Saída: >>['oi', 'tudo', 'bem?']
Arquivo Excell salvo no formato CSV (Comma Separated Value)
Arquivo: planilha.csv
Exercício 2: Um arquivo Excell contendo uma planilha de números foi salva no formato CSV (Separado por vírgula) com o nome arqexcell.csv. Desenvolva um programa que abra o arquivo arqexcell.csv imprima a soma dos números de cada linha e a soma de todos os números do arquivo. Ao final, o programa deve imprimir também a soma total. Exemplo: para o arquivo arqexcell com: A saída deverá ser: Arqexcell.csv
import sys nome=input("forneça nome do arquivo:") try: arquivo=open(nome,'r') except IOError: print("problema na abertura do arquivo!!") sys.exit() linha=[] somatotal=0 for linhaarquivo in arquivo: linha=linhaarquivo.split(";") somalinha=0 for numero in linha: somalinha=somalinha+float(numero) somatotal=somatotal+somalinha print("soma linha=", somalinha) print("soma Total=", somatotal) arquivo.close()
PROBLEMA 5.2. Dada uma sequência de caracteres representando um texto, determinar a frequência relativa de vogais no texto. Por exemplo, no texto: "Em terra de cego quem tem um olho e caolho" essa frequência é 16/42. texto = input("digite um texto: ") nv = 0 vogais = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'] for letra in texto: if letra in vogais: nv += 1 print ("Frequencia relativa = %d / %d"%(nv, len(texto)))
Dúvida na aula anterior...
Dúvida na aula anterior Apresentando o conteúdo de uma matriz: matriz=[[6,5,4],[8,7,6],[4,9,2]] for linha in matriz: for coluna in linha: print(coluna, end=" ") print() Somando um a cada elemento da matriz: matriz=[[6,5,4],[8,7,6],[4,9,2]] for linha in range(len(matriz)): for coluna in range(len(matriz[linha])): matriz[linha][coluna]+=1 print(matriz)
Matrizes
Problema 1: 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. Exemplo: A matriz é um quadrado mágico. 0 1 2 0 8 0 7 A 1 4 5 6 2 3 10 2 Dada uma matriz quadrada A nxn, verificar se A é um quadrado mágico.
def verifica (A): aux=[] #verificando linhas for i in range(len(a)): soma=0 for j in range (len(a[i])): soma=soma+a[i][j] aux.append(soma) #verificando colunas for i in range(len(a)): soma=0 for j in range (len(a[i])): soma=soma+a[j][i] aux.append(soma) #verificando diagonal principal soma=0 for i in range(len(a)): soma=soma+a[i][i] aux.append(soma) #verificando diagonal secundária soma=0 c=1 for i in range(len(a)): soma=soma+a[i][len(a)-c] c=c+1 aux.append(soma) #verificando se elementos de aux são iguais for i in range(len(aux)): if aux[i]!= aux[1]: return False return True #programa principal a=[[8,0,7],[4,5,6],[3,10,2]] if verifica(a): print("é quadrado mágico") else: print("não e quadrado mágico") Primeira solução!! Pode ser melhorada...
def verifica (A): aux=[] #verificando linhas e colunas for i in range(len(a)): soma=0 soma2=0 for j in range (len(a[i])): soma=soma+a[i][j] soma2=soma2+a[j][i] aux.append(soma) aux.append(soma2) #verificando diagonal principal e secundária soma=0 soma2=0 c=1 for i in range(len(a)): soma=soma+a[i][i] soma2=soma2+a[i][len(a)-c] c=c+1 aux.append(soma) aux.append(soma2) #programa principal a=[[8,0,7],[4,5,6],[3,10,2]] if verifica(a): print("é quadrado mágico") else: print("não e quadrado mágico") Segunda solução!! Pode ser melhorada... #verificando se elementos de aux são iguais for i in range(len(aux)): if aux[i]!= aux[1]: return False return True
def verifica (A): aux=[] #verificando linhas e colunas soma3=soma4=0 c=1 for i in range(len(a)): soma=0 soma2=0 soma3=soma3+a[i][i] soma4=soma4+a[i][len(a)-c] c=c+1 for j in range (len(a[i])): soma=soma+a[i][j] soma2=soma2+a[j][i] aux.append(soma) aux.append(soma2) #programa principal a=[[8,0,7],[4,5,6],[3,10,2]] if verifica(a): print("é quadrado mágico") else: print("não e quadrado mágico") #verificando se elementos de aux são iguais for i in range(len(aux)): if aux[i]!= aux[1]: return False return True Terceira solução!! Pode ser melhorada...
Exercícios com Matrizes: Entrega na próxima aula
Exercício 1: Os elementos a ij de uma matriz inteira A nxn representam os custos de transporte da cidade i para a cidade j. Dados n itinerários, cada um com k cidades, calcular o custo total para cada itinerário. 0 1 2 3 Exemplo: 0 4 1 2 3 a 1 5 2 1 400 2 2 1 1 8 3 7 1 3 5 O custo do itinerário 0 3 1 3 3 2 1 0 é a 03 + a 31 + a 13 + a 33 + a 32 + a 21 + a 10 = 3 + 1 + 400 + 5 + 2 + 1 + 5 = 417
matriz.txt
Funções com Matrizes Exercício 2: (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.
Exercício 2: 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 retorna quantas posições ao redor da posição (i,j) contém o valor -1. def campominado(a, i, j): 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 0 2 2 2 2 2 2 2 2 2 2 2 0 0-1 0 0 0 0 0 0 0 1 2 0-1 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 2 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 3 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-1 0 0 0-1 -1-1 0 0 0 0 0 0 0 0-1 -1 0 0-1 0 0-1 -1 0 0 0 0 0 0 4 5 6 7 8 9 2 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0-1 0 0 2 2 0-1 -1-1 0 0 0 0 0 2 2 0 0 0-1 -1 0 0-1 0 2 2 0-1 -1 0 0 0 0 0 0 2 campominado(a,2,2) 1 campominado(a,7,5) 3 campominado(a,8,3) 6 campominado(a,7,7) 2 Sem moldura 10 2 2 2 2 2 2 2 2 2 2 2 Com moldura
Exercício 2: Compute a matriz de campo minado (minesweeper). b) Escreva um programa que lê uma matriz A nxm de 0's (posições livres) e -1's (minas) de um arquivo texto. Utilizando a função do item anterior, o programa deve computar e imprimir a quantidade minas ao redor de cada posição livre da matriz. 1 2 3 4 5 6 7 8 9 (Obs: Resolver sem moldura e com moldura.) 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-1 0 0 0-1 -1-1 0 0 0 0 0 0 0 0-1 -1 0 0-1 0 0-1 -1 0 0 0 0 0 0 Sem moldura 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 2 2 2 2 2 2 2 2 2 2 2 2 0-1 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0-1 0 0 2 2 0-1 -1-1 0 0 0 0 0 2 2 0 0 0-1 -1 0 0-1 0 2 2 0-1 -1 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 Com moldura
Funções com Matrizes Exercício 3: (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 Exercício 4: 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.