MAC2166 Introdução à Computaçãomcesar/Aulas_13e14.pdf · Dizemos que uma matriz quadrada...
Transcript of MAC2166 Introdução à Computaçãomcesar/Aulas_13e14.pdf · Dizemos que uma matriz quadrada...
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 Anxn , verificar se A é um quadrado
mágico.
8
0
0
1
7
2
0
1
2
A 4 5 6
3 10 2
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 1
2 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 Anxm
, 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 Anxm
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.