• Nenhum resultado encontrado

Introdução à Computação

N/A
N/A
Protected

Academic year: 2022

Share "Introdução à Computação"

Copied!
52
0
0

Texto

(1)

MAC2166

Introdução à Computação

- aulas 13 e 14-

Mauro Cesar Bernardes

29/Abril/2014

(2)

Agenda

Strings

Manipulação de Arquivos

Matrizes...

(3)

Strings

(4)

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()

(5)

e000.py

(6)

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

(7)

Strings

Cuidado com os índices!!

0 b

1 a

2 n

3 a

4 n

5 a

Índice Inválido

(8)

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

(9)
(10)

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

(11)
(12)

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!

(13)

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)

(14)

Biblioteca string

https://docs.python.org/3.3/library/string.html

(15)

>>> 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

(16)

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

(17)

Arquivos

(18)

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.

(19)

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.

(20)

Arquivo: alunos.txt

(21)

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

(22)

Arquivo: alunos.txt

Exemplos de whitespaces que podem ser removidos com o uso de rstrip ou strip ou end=""

(23)

end="" para remover o whitespace \n do final de cada linha do arquivo.

(24)

arquivo = input("Nome do arquivo: ")

arq = open(arquivo, 'r', encoding="utf8") nlin = 1

for linha in arq:

print(nlin, ':', linha) nlin += 1

e1.py

(25)

arquivo = input("Nome do arquivo: ")

arq = open(arquivo, 'r', encoding="utf8") nlin = 1

for linha in arq:

print(nlin, ':', linha, end="")

nlin += 1

(26)

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

(27)

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

(28)

Analise o programa a seguir:

def imprime(p):

for caracter in p:

print(caracter)

palavra=input("digite uma palavra:")

imprime(palavra)

(29)

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

(30)

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!")

(31)

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?']

(32)

Arquivo Excell salvo no formato CSV (Comma Separated Value)

(33)
(34)

Arquivo: planilha.csv

(35)

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

(36)

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()

(37)

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)))

(38)

Dúvida na aula

anterior...

(39)

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)

(40)

Matrizes

(41)

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

10

2

(42)

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....

(43)

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....

(44)

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....

(45)

Exercícios com Matrizes:

Entrega na próxima aula

(46)

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

(47)

matriz.txt

(48)

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.

(49)

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

(50)

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

(51)

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.

(52)

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.

Referências

Documentos relacionados