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
0 b
1 a
2 n
3 a
4 n
5
a
Strings
Cuidado com os índices!!
0 b
1 a
2 n
3 a
4 n
5 a
Í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])
e00.py
ERRO!! Strings são imutáveis!
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
>>> 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.'
Alguns métodos para manipular Strings
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
matriz=[[6,5,4],[8,7,6],[4,9,2]]
for linha in matriz:
for coluna in linha:
print(coluna, end=" ") print()
• Apresentando o conteúdo de uma matriz:
• 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.
Dada uma matriz quadrada A nxn , verificar se A é um quadrado mágico.
8 0
0 1
7 2 0
1 2
A 4 5 6
3
102
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)
#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")
Segunda solução!!
Pode ser melhorada....
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)
#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")
Terceira solução!!
Pode ser melhorada....
Exercícios com Matrizes:
Entrega na próxima aula
Exercício 1:
Os elementos aij de uma matriz inteira Anxn 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.
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 4
0 1 1
2 2 0
1 2
a
5 2 12 1 1 3
3
400
8 3 7 1 3 5
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 umaposiçã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 Anxm 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):
campominado(A,2,2) 1 campominado(A,7,5) 3 campominado(A,8,3) 6 campominado(A,7,7) 2
2 1 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
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
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
Sem moldura
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
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
Com moldura
Exercício 2:
Compute a matriz de campo minado (minesweeper).
b) Escreva um programa que lê uma matriz Anxm 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.
(Obs: Resolver sem moldura e com moldura.)
2 1 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
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
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 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
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
Sem moldura
Com moldura
Funções com Matrizes
Exercício 3:
(a) Escreva uma função que recebe como parâmetros uma matriz real Anxm, 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 Anxm e devolve uma matriz Amédia, onde Amé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 Anxm , 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 Anxn é 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 Anxn é um quadrado latino de ordem n.