Logica Programacao Python Slides
Logica Programacao Python Slides
de
Programao
com
Python
[Fonte:
Wikipedia]
1.b
Caracters>cas
do
Algoritmo
Finito
No
ambguo
Capaz
de
receber,
gerar
e
fornecer
informaes
Executvel
1.b
Exemplos
de
algoritmos
Exemplo
1:
Receita
de
Bolo
1.
Providencie
manteiga,
ovos,
massa,
etc.
2.
Misture
os
ingredientes
3.
Despeje
a
mistura
na
frma
de
bolo
4.
Leve
a
frma
ao
forno
5.
Espere
at
car
no
ponto
6.
Re>re
a
frma
do
forno
1.b
Observaes
Que
tempo
Ficar
no
Ponto?
Qual
a
quan>dade
dos
ingredientes?
Muito,
pouco?
O
que
signica
muito
ou
pouco?
Quando
acender
ou
apagar
o
forno?
Misturar
os
ingredientes
de
que
forma?Qualquer
pessoa
executaria
a
receita
da
mesma
forma
e
obteria
os
mesmos
resultados?
Concluso:
Y
1.c
Smbolos
Grcos
Entradas
de
dados
Clculos
Deciso
Sadas de dados
Unidade
de
Lgica
e
Aritm>ca
Unidade
Unidade
De
Controle
Unidade
de
de
Sada
Entrada
Programa Dados
Memria
Principal
1.e
Estruturas
Bsicas
Estrutura
Seqencial:
Incio
Incio
Receba
Leia
(Receba)
Calcule
Escreva
Fim
Calcule
Escreva
Fim
1.e
Estruturas
Bsicas
Estrutura
de
Deciso:
Incio
Incio
Receba
Leia
(Receba)
Se
<condicao>
for
verdade
faa
isto
Verdade
Seno
Condio
faa
aquilo
Escreva
Fim
Falso
Escreva
Fim
1.e
Estruturas
Bsicas
Estrutura
de
Repe>o:
Incio
Incio
Repita
10
vezes
Leia
(Receba)
Repita
10
vezes
faa
isso
Escreva
Faa
isto
Fim
Fim
do
Repita
Fim
1.f
Linguagem
Algortmica
Portugol
(Portugus
Estruturado):
Comandos
e
Instrues
re>rados
do
Portugus.
Exemplos
de
Instrues:
Leia
:
Pra
a
execuo
do
algoritmo
at
que
sejam
fornecidos
os
dados
especicados
na
instruo.
Os
dados
so
guardados
na
lista
de
variveis.
Ex:
Leia
A
Escreva
A
Voc
no
precisa
aprender
esperanto
para
depois
aprender
ingls
ou
francs.
Voc
nem
mesmo
precisa
falar
bem
portugus
para
aprender
outra
lngua
...
Exemplos
invlidos:
-1,
1nome,
234,
*8,
\9,
/3,
!3,
?2,
2.a
Variveis
-
Atribuio
Uma
operao
de
atribuio
a
associao
de
um
valor
(dado)
a
uma
varivel.
Usa-se
normalmente,
no
texto,
o
smbolo
de
igualdade
para
indicar
a
operao.
Onde,
OBS:
1. Em
caracteres
ou
cadeias
(Strings)
usar
sempre
apstrofos
ou
aspas
duplas
2.a
Variveis
Expresses
aritm>cas
Uma
expresso
aritm>ca
representa
um
clculo
a
ser
realizado
(frmula).
Pode
ser
composta
de
literais,
variveis
e
operadores.
Ex.
Literais
2
+
3
+
x
*
3
4
/
2
+
y
Operadores
Variveis
2.a
Variveis
Operadores
Aritm>cos
Os
principais
operadores
aritm>cos
so:
+
Soma
-
Subtrao
/
Diviso
*
Mul>plicao
Exerccio:
Qual
o
valor
das
expresses
abaixo?
1
+
2
*
3
(1
+
2)
*
3
6
/
3
-
1
6
/
(3
1
)
2.a
Variveis
em
Expresses
Qual
o
valor
nal
das
variveis
no
algoritmo
abaixo?
1. X
=
2
+
3
*
4
/
(2
+
2)
4
2. Y
=
X
*
X
+
2
3. X
=
Y
4. Y
=
Y
+
1
OBS:
Literais Varivel
True
=
Verdadeiro
False
=
Falso
2.a
Operadores
Relacionais
Os
principais
operadores
relacionais
so:
X
=
2
==
3
Y
=
2
<
3
Z
=
2
>
3
W
=
2
<=
3
K
=
2
!=
3
Q
=
K
==
W
2.a
Hora
de
Pra>car
Ligar
o
Python,
criar
as
variveis
dos
exemplos
fornecidos.
Mostrar
seus
valores.
Usar
o
Python
como
uma
calculadora.
Aula
2
Seqncias
e
Desvios
2.b
Entradas
e
Sadas
Normalmente
em
uma
operao
de
entrada
de
dados,
a
execuo
do
algoritmo
(programa)
interrompida
at
que
determinadas
informaes
sejam
fornecidas
a
par>r
de
uma
das
unidades
de
entrada.
Em
Python
usa-se
o
comando
input.
Input
uma
funo
que
recupera
dados
e
as
disponibiliza
para
uma
varivel
especicada.
Sintaxe:
<var>
=
input(Texto
a
ser
apresentado)
2.b
Entradas
e
Sadas
Ex:
Experimente...
2.b
Entradas
e
Saidas
Saidas
de
dados
implica
na
impresso
em
vdeo,
no
envio
de
dados
por
portas
de
comunicao,
gravao
em
disco,
etc.
Resultado deste comando poderia ser : Maria recebeu R$ 500,00 este mes.
Em
portugol:
Incio
Leia
A,B
C
(A+B)/2
Escreva
C
A,B
Em
Python:
C=(A+B)/2
A
=
input(Digite
um
valor
para
A
)
B
=
input(Digite
um
valor
para
B
)
C
=
(A+B)/2
print
C
C
FIM
2.c
Gravando
os
Fontes
Use
o
IDLE
ou
outro
editor
qualquer
para
gravar
os
fontes.
(Nano
por
exemplo)
2.c
Exerccios
Faa
programas
em
Python
para:
Python
possui
uma
biblioteca
de
funes
em
um
pacote
chamado
math.
Para
u>liz-lo
devemos
usar
a
instruo
import
math
e
as
seguintes
funes
estaro
disponveis
(entre
outras):
Sintaxe
do
se
Em
portugol:
Se
<
condio>
ento
<instrues
para
o
caso
verdade>
seno
<instrues
para
o
caso
falso>
Fim-se
Em
Python:
If
<condio>:
<bloco
de
instrues
para
o
caso
verdade>
else:
<bloco
de
instrucoes
para
o
caso
falso>
2.d
Desvios
Aninhados
Faa
algoritmos
para:
A,B,C
Sim
No
A>C
A>B
B>C
Sim No Sim No
A C B C
FIM
2.d
Ml>plas
Opes
Podemos
u>lizar
uma
estrutura
com
ml>plos
testes
usando
a
estrutura
se
...
seno
se.
Em
Portugol
seria:
se
<condio1>
ento
faa
isto
senao
se
<condicao2>
faa
isso
seno
se
<condio3>
faa
aquilo
outro
seno
se
<condicao4>
faa
outra
coisa
m-se
2.d
Ml>plas
Opes
Podemos
u>lizar
uma
estrutura
com
ml>plos
testes
usando
a
estrutura
se
...
seno
se.
Em
Python:
If
<condio1>:
faa
isto
elif
<condicao2>:
faa
isso
elif
<condio3>:
faa
aquilo
outro
else:
faa
quando
todas
as
anteriores
falharem
Aula
3
-
Laos
Aula
3
-
Laos
Em portugol:
Em Python:
While<condio>:
bloco
de
comandos
2.e
Laos
Enquanto
(While)
Seja
o
programa
abaixo
para
imprimir
os
nmeros
de
0
a
1000:
X=0
While
x<=1000:
print
x
x
=
x
+1
Ex. Seja o algoritmo para calcular a mdia de n nmeros fornecidos via teclado:
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
nmeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
nmeros
fornecidos
,Acumulador
2.e
Laos
Enquanto
(While)
Vamos
Execut-lo
passo
a
passo:
Sada
no
Vdeo
Contador
:
0
2.e
Laos
Enquanto
(While)
Vamos
Execut-lo
passo
a
passo:
Contador
=
0
Acumulador
=
0
Passo
2
:
Declara
Acumulador
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Passo
3:
Acumulador
=
0
Solicita
Valor
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Passo
3:
Acumulador
=
0
Usurio
digita
valor
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
Passo
4:
Incio
do
lao
numero
=
input(Digite
um
valor
numerico
)
Condio
verdadeira
contador
=
contador
+
1
Contador
(0)
<
quan>dade
(3)
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
nmeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
Passo
5:
Solicita
valor
contador
=
contador
+
1
para
numero
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
Passo
5:
Usurio
contador
=
contador
+
1
Fornece
Valor
Numrico
acumulador
=
acumulador
+
numero
(2)
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
Passo
6:
contador
incrementado
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
Passo
7:
Acumulador
acumulador
=
acumulador
+
numero
acrescido
do
valor
de
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
Passo
8:
Prxima
Iterao
do
lao.
numero
=
input(Digite
um
valor
numerico
)
Condico
ainda
verdadeira
contador
=
contador
+
1
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
Passo
9:
Solicita
valor
para
numero
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
Passo
9:
Usurio
digita
valor
(4)
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
nmeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
Passo
10:
Contador
incrementado
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
Passo
11:
Acumulador
acrescido
de
contador
=
contador
+
1
numero
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
Passo
12:
Proxima
Iterao
contador
=
contador
+
1
Condio
verdadeira
acumulador
=
acumulador
+
numero
Contador
(2)
<
quan>dade
(3)
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
Passo
13:
Solicita
dado
contador
=
contador
+
1
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
Passo
13:
Usurio
contador
=
contador
+
1
fornece
dado
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
Passo
14:
contador
incrementado
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
contador
=
contador
+
1
Passo
15:
Acumulador
acrescido
acumulador
=
acumulador
+
numero
de
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
Passo
16:
Prxima
Iterao
numero
=
input(Digite
um
valor
numerico
)
Condico
falsa
contador
=
contador
+
1
Contador
(3)
<
quan>dade
(3)
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Contador
=
0
Acumulador
=
0
Quan>dade
=
input(Digite
a
quan>dade
de
numeros
a
ser
u>lizada)
while
contador
<
quan>dade:
numero
=
input(Digite
um
valor
numerico
)
Passo
17:
Saida
de
resultado
no
contador
=
contador
+
1
video
acumulador
=
acumulador
+
numero
print
A
soma
total
dos
numeros
fornecidos
eh
,Acumulador
Entradas: 3,2,4,6
Sada:
12
2.e
Laos
Enquanto
(While)
Alguns
exerccios:
OBS:
o
item
d
a
srie
conhecida
como
srie
de
Fibonacci.
Consulte
a
Wikipedia
para
ver
o
histrico
desta
srie.
A
seguir
veremos
como
implement-las.
2.e
Nmeros
primos
Lgica:
Dividir
o
nmero
sucessivamente
por
2,3,4
....
at
sua
metade
(numero/2)
e
contar
quantas
divises
foram
exatas.
Caso
nenhuma
deu
exata
o
nmero
primo.
Soluo:
Programa11.py
2.e
Gerando
sries
simples
(1)
Lgica:
Soluo:
Programa12.py
2.e
Gerando
sries
simples
(2)
Lgica:
Soluo:
Programa13.py
2.e
Gerando
sries
simples
(3)
Lgica:
Detalhe: Uma srie com valores crescentes intercalados com valores decrescentes
Soluo:
Programa14.py
2.e
Gerando
a
srie
de
Fibonacci
Lgica:
Detalhe: Uma srie onde o prximo valor a soma dos dois anteriores
Soluo:
a) Programa15.py
b) Programa16.py
2.e
Uma
pequena
pausa
Python
possui
um
pacote
chamado
random
que
permite
a
gerao
de
nmeros
aleatrios.
Uma
forma
de
u>lizao
bsica
seria:
Import
random
random.seed()
#
inicializa
o
gerador
random.randint(1,99)
#
gera
um
nmero
aleatrio
de
1
a
99
-----------------------------------------------------------------------------------------------------------------
Soluo:
Programa17.py
Exs.
A
varivel
que
representa
a
lista
pode
ser
indexada
para
recuperar
um
elemento
da
lista.
O
primeiro
elemento
possui
ndice
0
e
os
seguintes
variam
com
incremento
de
1
Ex.
A[0]
10,
A[1]
12,
A[2]
34,
A[3]
45
B[0]
Maria,
etc.
A
diferena
entre
uma
lista
e
um
vetor
em
python
tem
a
ver
apenas
com
a
forma
como
voc
olha
para
os
dados.
Ex.
3 2
3
4 5
6
Maria
Pedro
Joana
Paulo
A=[[3,2,3],[4,5,6]]
Ou
B=[[Maria,Pedro],[Joana,Paulo]]
2.e
Matrizes
de
Matrizes?
Sem
problemas:
Veja
X[0]
=
1
2
3
4
X=[[[1,2],[3,4]],[[Pedro,Paulo],[Maria,Joana]]]
Quem
X[0][1][0]
?
2.e
Exerccios
com
listas
Receba
um
vetor
elemento
por
elemento
do
teclado
e
coloque
em
uma
lista.
Selecione
o
maior
e
o
menor
elemento
de
um
vetor
Calcule
a
mdia
aritm>ca
dos
elementos
de
um
vetor
Receba
um
vetor
e
inverta
a
ordem
dos
elementos
(Sem
usar
a
funo
reverse)
Encontre
a
posio
de
um
elemento
em
uma
lista
(Pesquisa
Linear)
Selecione
os
elementos
pares
de
um
vetor
Selecione
os
elementos
pares
de
um
vetor
e
copie
para
o
segundo
vetor.
Crie
um
vetor
com
valores
intercalados
de
dois
outros
vetores
2.e
Exerccios
com
listas
Receba
um
vetor
elemento
por
elemento
do
teclado
e
coloque
em
uma
lista.
Soluo:
programa18.py
2.e
Exerccios
com
listas
Selecione
o
maior
e
o
menor
elemento
de
um
vetor
Dica:
Usar
duas
variveis.
Uma
para
guardar
o
maior
valor
e
outra
pra
guardar
o
menor.
Inicialmente
o
primeiro
elemento
do
vetor
atribudo
s
mesmas.
Em
seguida
compara-se
todos
os
elementos
do
vetor
com
estas
variveis.
Se
o
elemento
do
vetor
for
menor
que
a
varivel
menor
trocamos
o
valor
de
menor.
A
mesma
coisa
para
a
varivel
maior.
Soluo:
programa19.py
2.e
Exerccios
com
listas
Calcule
a
mdia
aritm>ca
dos
elementos
de
um
vetor
Soluo:
programa20.py
2.e
Exerccios
com
listas
Receba
um
vetor
e
inverta
a
ordem
dos
elementos
(Sem
usar
a
funo
reverse)
Soluo:
programa21.py
2.e
Exerccios
com
listas
Encontre
a
posio
de
um
elemento
em
uma
lista
(Pesquisa
Linear)
Soluo:
programa22.py
2.e
Exerccios
com
listas
Selecione
os
elementos
pares
de
um
vetor
Use
um
lao
para
acessar
todos
os
elementos
do
vetor.
Imprimir
todos
os
que
forem
pares
Soluo:
programa23.py
2.e
Exerccios
com
listas
Selecione
os
elementos
pares
de
um
vetor
e
copie
para
o
segundo
vetor.
Soluo:
programa24.py
2.e
Exerccios
com
listas
Crie
um
vetor
com
valores
intercalados
de
dois
outros
vetores
Usar
varveis
ndices.
Uma
para
cada
vetor.
Crie
um
lao
para
criar
o
terceiro
vetor
e
use
os
ndices
de
cada
vetor
para
pegar
os
elementos
deles
e
adicionar
ao
terceiro
Soluo:
programa25.py
2.e
Composio
de
Laos
que
acontece
quando
colocamos
uma
lao
dentro
de
outro
(Aninhados)?
Experimente:
#
programa26
x
=
0
while
x
<
10:
y=0
while
y
<
10
:
print
x
=
,x
,
y
=
,y
y
=
y
+
1
x
=
x
+
1
#
m
do
programa
Qual
a
sada?
Quantas
vezes
ele
executou
o
comando
print?
2.e
Composio
de
Laos
Exerccios:
Soluo: Programa27.py
Simule um odmetro digital no vdeo com (por exemplo) segundos, minutos e horas
Soluo:
programa28.py
2.e
Gerando
Sries
com
range()
Sintaxe:
range(inicio,m,passo)
Experimente.
2.e
Lao
for
Sintaxe:
Inicio
Em
portugol:
para
i
=
1,n
<comandos>
Enquanto/
m-para
Para
Em Python:
Experimente.
for
i
in
[0,1]:
Fim
print
i
2.e
break,
con>nue,
else
O
break,
como
no
C,
quebra
o
lao
mais
interno
de
um
for
ou
while.
O
con>nue,
tambm
emprestado
do
C,
con>nua
o
prximo
passo
do
lao
mais
interno.
Laos
podem
ter
uma
clusula
else,
que
executada
sempre
que
o
lao
se
encerra
por
exausto
da
lista
(no
caso
do
for)
ou
quando
a
condio
se
torna
falsa
(no
caso
do
while),
mas
nunca
quando
o
lao
encerrado
por
um
break.
Isto
exemplicado
no
prximo
exemplo
que
procura
nmeros
primos:
Ver
programa29.py
2.e
Pausa
Concatenao
possvel
somar
valores
alfanumricos:
a + b
nome
=
Paulo
sobrenome
=
Pedreira
Espaco
=
str
=
?
2.f
Funes
denidas
pelo
usurio
Em
portugol:
Denio:
Funo
nome(lista
de
argumentos)
<comandos>
retorne
<valor>
Fim-funcao
Chamada:
x
=
nome(valores)
Em Python
def
nome(args):
<comandos>
[return
<valor>]
#
opcional
2.f
Funes
denidas
pelo
usurio
Exemplo
1.
Funo
fatorial
fat(n)
=
1
se
n
=
0
fat(n)
=
n*
fat(n-1)
para
n
>
0
Soluo
Programa30.py
Obs:
Leia
o
tutorial
ocial
do
python
para
ver
as
possveis
formas
de
criao
de
funes
2.f
Funes
denidas
pelo
usurio
Faa
alguns
exerccios:
def
funcao_recursiva(arg):
#
#
faz
qualquer
coisa
funcao_recursiva(arg2)
#
chama
a
si
prpria
fat(o)
1
fat(n)
n
*
fat
(n-1)
Desta
forma
ela
se
torna
mais
fcil
de
implementar
que
a
verso
itera>va
que
zemos.
Programa31.py
1.
O
programa
chama
fat
passando
3
como
argumento
fat(3)
1.1
Criada
a
instncia
1
da
funo
fat
1.2
A
fat1
testa
o
valor
de
n
<
0
(falso)
1.3
A
fat1
testa
se
o
valor
de
n
==
0
(falso)
1.4
A
fat1
mul>plica
n
pelo
resultado
de
chamar
fat(2)
1.4.1
Criada
a
instncia
2
da
funo
fat
com
n
=
2
1.4.2
a
fat2
testa
se
n
<
0
(falso)
1.4.3
a
fat2
testa
se
n
==
0
(falso)
1.4.4
a
fat2
pega
seu
n
(2)
e
mul>plica
por
fat(1)
1.4.4.1
Criada
a
instncia
3
de
fat
1.4.4.2
a
fat3
testa
se
n(1)
<
0
(falso)
1.4.4.3
a
fat3
testa
se
n
==
0
(falso)
1.4.4.4
a
fat3
pega
seu
n
(1)
e
mul>plica
por
fat(
0)
1.4.4.4.1
criada
a
instncia
4
de
fat
com
n
=0
1.4.4.4.2
a
fat4
testa
se
n
(0)
menor
que
0
(falso)
1.4.4.4.3
a
fat4
testa
se
n
==
0
(verdade)
e
retorna
1
(FIM)
1.4.4.5
a
fat3
recebe
o
retorno
da
fat4
(1)
e
mul>plica
por
n
(1)
1.4.4.6
a
fat3
retorna
1
(FIM)
1.4.5
a
fat2
recebe
o
retorno
de
fat3
(1)
e
mul>plica
por
n
(2)
1.4.6
a
fat2
retorna
2
(FIM)
1.5
A
fat1
recebe
o
retorno
de
fat2
(2)
e
mul>plica
por
n
(3)
e
retorna
6
(FIM)
2.
O
programa
principal
recebe
o
retorno
de
fat1
(6)
e
imprime
3.
Fim
Funo
Recursiva
Cuidado
:
preciso
que
a
chamada
recursiva
evite
de
se
tornar
um
lao
innito.
Para isso a funo tem que conter casos base ou casos de parada.
Ver
programa32.py
1. OBS:
O
programa16.py
traz
a
verso
itera>va.
Quem
roda
mais
rpido
para
30
elementos
por
exemplo?
Pesquisa
Binria
Exemplo
3
Pesquisa
Binria
um
algoritmo
conhecido
usado
para
pesquisar
um
valor
em
uma
lista
ordenada.
Funciona
da
seguinte
forma:
Seja
uma
lista
ordenada
lista.
Chamemos
de
min
e
max
os
ndices
mnimo
e
mximo
da
lista
onde
a
busca
ser
feita.
Inicialmente,
min
=
0
e
max
=
len(lista)-1
Ver
programa33.py
Pesquisa
Binria
Passo
a
Passo
Seja
a
Lista:
[1,2,3,4,5,79,99,101]
Se
o
jogador
sempre
acerta
o
mesmo
nmero
de
vezes
que
o
computador,
ele
est
cando
esperto
;-)
Mais
sobre
listas
....
Seja
uma
lista
A
=
[2,1,3,4,10,6,7,8,9]
B=[1,2]
C = [3,4]
D= B+C ([1,2,3,4])
isso
a
...
Anlise
combinatria(1)
Dadas
duas
variveis:
A
e
B
Soluo
C
=
A
A
=
B
B
=
C
Como
fao
pra
vericar
se
A
pode
ser
ob>da
por
uma
permutao
dos
elementos
de
B?
Soluo:
programa34.py
Anlise
combinatria(2)
Dadas
uma
lista
A
=
[a1,a2,a3,...,an]
PAUSA
.....................
Aula
6
Recurso
2
(
A
Misso)
Anlise
combinatria(4)
Refazendo
o
programa
36:
Anlise
combinatria(4)
Instncia
1
de
permutacoes
Passo3:
recebe
uma
lista
=
x
=
[1,2,3]
Passo4:
if:
testa
se
o
comprimento
da
lista
um
(falso)
Passo5:
primeiro
=
lista[0]
=
1;
resto
=
lista[1:]
=
[2,3];
resultado
=
[]
Passo6:
for
perm
in
permutacoes([2,3])
Chamada
a
permutacoes
(instancia
2)
Passo
19:
recebe
a
lista
de
permutacoes([2,3])
e
subs>tui
cando
o
lao:
for
perm
in
([[2,3],[3,2]]):
Passo20
para
perm
=
[2,3]
cria
o
lao
i
in
range(len(perm)
2
+
1
=
3)
Passo21
para
i
=
0:
calcula
o
resultado
+
=
[perm[:0]
+
[primeiro]
+
[0:]]
=
[[]+[1]+[2,3]]
=[[1,2,3]]
Passo22
para
i
=
1
:
calcula
o
resultado
+=
[perm[:1]
+
[primeiro]
+
[1:]]
=
[[1,2,3]]
+
[[2]+[1]+[3]]
=
[[1,2,3],[2,1,3]]
Passo23
para
i
=
2
calcula
o
resultado
+=
[perm[:2]
+
[primeiro]
+
[2:]]
=
[[1,2,3],[2,1,3]]
+
[[2,3]+[1]+[]]
=
[[1,2,3],[2,1,3],[2,3,1]]
Passo24:
repete
os
passos
20
a
23
para
perm
=
[3,2]
gerando
[1,3,2],[3,1,2],[3,2,1]
O
Resultado
ser
portanto
[[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
Fechada
a
instncia
1
Anlise
combinatria(4)
Instncia
2
de
permutacoes
Passo7:
recebe
uma
lista
=
x
=
[2,3]
Passo8:
if:
testa
se
o
comprimento
da
lista
um
(falso)
Passo9:
primeiro
=
lista[0]
=
2;
resto
=
lista[1:]
=
[3];
resultado
=
[]
Passo10:
for
perm
in
permutacoes([3])
Chamada
a
permutacoes
(instancia
3)
Passo14:
recebe
valor
[[3]]
e
subs>tui
na
lista
perm
in
[[3]]
Passo15:
faz
perm=[3]
e
cria
lao
i
in
range(len(perm)
1
+
1
=
2)
Passo16
:
para
i
=
0
calcula
o
resultado
+=
[perm[:0]
+[primeiro]+perm[0:]]
resultado
=
[[]+[2]+[3]]
=
[[2,3]]
Passo17:
para
i
=
1
calcula
o
resultado
+=[perm[:1]+[primeiro]+perm[1:]]
resultado
=
[[2,3]]
+
[[3]+[2]+[]]
=
[[2,3],[3,2]]
Passo18:
return:
retorna
o
resultado
[[2,3],[3,2]]
para
o
principal
Fechou
instncia
2
Anlise
combinatria(4)
Instncia
3
de
permutacoes
Passo11:
recebe
uma
lista
=
x
=
[3]
Passo12:
if:
testa
se
o
comprimento
da
lista
um
(verdade)
Passo13:
return:
retorna
o
valor
[[3]]
para
a
instncia
2
Fechada.
Anlise
combinatria(4)
-
Moral
Dada
a
lista
1,2,3
Re>ra
o
primeiro
elemento
(1)
Gera
as
possveis
permutaes
dos
restantes
Ex
2,3
e
3,2
Insere
o
primeiro
em
cada
uma
das
posies
do
vetor
em
construo
para
cada
permutao:
Permutao
A:
2,3
Pos.
0
:
1
2
3
Pos.
1
:
2
1
3
Pos.
2
:
2
3
1
Permutao
B:
3,2
Pos.
0
:
1
3
2
Pos.
1
:
3
1
2
Pos.
2
:
3
1
1
Pergunta
:
como
ele
achou
as
permutaes
do
resto???
(2,3)
e
(3,2).
Ora
simplesmente
chamando
a
funo
recursivamente
passando
o
resto
(2,3)
que
faz
a
mesma
coisa
e
retorna
a
lista
e
assim
por
diante
....
Anlise
combinatria(5)
E
itera>vamente?
possvel???
Seja
a
lista:
A
=
[1,2,3]
o
nmero
de
permutaes
n!
No
caso
3!
=
6
Observe
a
matriz
de
permutaes:
L0:
123
ou
A[0]
A[1]
A[2]
L1:
132
A[0]
A[2]
A[1]
L2:
213
A[1]
A[0]
A[2]
L3:
232
A[1]
A[2]
A[0]
L4:
312
A[2]
A[0]
A[1]
L5:
321
A[2]
A[1]
A[0]
Programa37.py
Anlise
combinatria(5)
At
agora
s
zemos
permutaes.
E
as
combinaes,
arranjos,
etc
???
Por exemplo:
Exerccio
:
Uma
boa
parte
das
linguagens
no
possui
comandos
para
manipulao
de
listas.
Crie
sua
prpria
implementao
das
funes
append
e
pop.
Pilhas
Os
mtodos
de
lista
tornam
muito
fcil
u>lizar
listas
como
pilhas,
onde
o
item
adicionado
por
l>mo
o
primeiro
a
ser
recuperado
(pol>ca
l>mo
a
entrar,
primeiro
a
sair
(LIFO)
)
.
Para
adicionar
um
item
ao
topo
da
pilha,
use
append()
[push].
Para
recuperar
um
item
do
topo
da
pilha
use
pop()
sem
nenhum
ndice.
Algoritmo:
1. Criar
funo
torre
de
Hani
recebendo
como
argumentos
numero
de
anis
(n),
uma
pilha
preenchida
representando
a
haste
1
origem
e
duas
pilhas
vazias
(temp
e
des@no
)
representando
as
hastes
2
e
3
1.1
Dentro
da
funo
vericar
se
o
num
de
anis
=
1
.
Se
for
re>rar
o
anel
(pop)
da
pilha
origem
e
colocar
na
des>no
(push/append)
e
retorna.
1.2
Seno
chamar
a
funo
Hani
(chamada
recursiva)
para
colocar
todos
os
elementos
at
o
n-1
na
pilha
temp
na
ordem
correta
e
seguindo
as
regras.
1.3
colocar
o
n-esimo
elemento
na
posio
certa
em
des@no.
1.4
chamar
a
funo
Hani
(recursiva)
para
transferir
os
n-1
elementos
que
esto
na
temp
para
a
posio
correta
no
des@no
Fim
da
Aula
6
Aula
7
-
Ordenamento
Ordenamento
Seja
uma
lista
A
=
[a1,a2,...,an]
no
ordenada.
1. Seleo,
2. Insero,
3. Borbulhamento
4. Classicao
Rpida
(Quicksort)
5. Mergesort
6. Shellsort
A = [ 7 , 3 , 1, 4, 5]
A = [ 1 , 3 , 7, 4, 5]
A = [ 1 , 3 , 7, 4, 5]
A = [ 1 , 3 , 7, 4, 5]
A = [ 1 , 3 , 7, 4, 5]
A = [ 1 , 3 , 4, 7, 5]
A = [ 1 , 3 , 4, 7, 5]
A = [ 1 , 3 , 4, 5, 7]
A = [ 1 , 3 , 4, 5, 7]
Ver:
Programa39.py
Posio
a
ser
calculada
Ordenamento(2)
-
Insero
Idia:
Atravessar
a
lista
da
esquerda
para
a
direita
mantendo
o
lado
esquerdo
ordenado.
A = [ 7, 3 , 1, 4, 5]
Posio
a
ser
calculada
(chave)
Ordenamento(2)
-
Insero
Idia:
Atravessar
a
lista
da
esquerda
para
a
direita
mantendo
o
lado
esquerdo
ordenado.
A = [ 7, 7 , 1, 4, 5]
A = [ 3, 7 , 1, 4, 5]
A = [ 3, 7 , 1, 4, 5]
A = [ 3, 7, 7, 4, 5]
Passo 6 : Verica se o elemento mais a esquerda menor que chave (1) (falso)
A = [ 3, 7, 7, 4, 5]
A = [ 3, 3, 7, 4, 5]
A = [ 1, 3, 7, 4, 5]
A = [ 1, 3, 7, 4, 5]
A = [ 1, 3, 7, 4, 5]
A = [ 1, 3, 7, 7, 5]
A = [ 1, 3, 7, 7, 5]
A = [ 1, 3, 4, 7, 5]
A = [ 1, 3, 4, 7, 5]
A = [ 1, 3, 4, 7, 5]
A = [ 1, 3, 4, 7, 7]
A = [ 1, 3, 4, 7, 7]
Passo 18: Verica se o elemento mais a esquerda maior que chave (falso)
A = [ 1, 3, 4, 7, 7]
A = [ 1, 3, 4, 5, 7]
Programa40.py
Posio
a
ser
calculada
Ordenamento(3)
-
Borbulhamento
Idia:
Comparar
os
elementos
dois
a
dois.
Se
es>verem
fora
de
ordem,
orden-los.
Repe>r
at
que
no
haja
mais
elementos
a
permutar.
A = [ 7, 3, 1, 4, 5]
A = [ 3, 7, 1, 4, 5]
A = [ 3, 7, 1, 4, 5]
A = [ 3, 1, 7, 4, 5]
A = [ 3, 1, 7, 4, 5]
Passo 6: Permut-los
A = [ 3, 1, 4, 7, 5]
A = [ 3, 1, 4, 7, 5]
Passo 8 : Permut-los
A = [ 3, 1, 4, 5, 7]
Passo
9
:
Como
foram
feitas
vrias
permutaes
nessa
passagem,
reiniciar
comparando
os
dois
primeiros
elementos.
A = [ 3, 1, 4, 5, 7]
Passo 10 : Permutar
A = [ 1, 3, 4, 5, 7]
A = [ 1, 3, 4, 5, 7]
A = [ 1, 3, 4, 5, 7]
A = [ 1, 3, 4, 5, 7]
Passo
14
:
Como
foi
feita
uma
permutao,
reiniciar
comparando
os
dois
primeiros
(Nova
passada)
A = [ 1, 3, 4, 5, 7]
A = [ 1, 3, 4, 5, 7]
A = [ 1, 3, 4, 5, 7]
A = [ 1, 3, 4, 5, 7]
A = [ 1, 3, 4, 5, 7]
A
=
[
7,
4,
3,
1,
5]
Ordenamento(4)
-
Quicksort
Idia:Dividir
a
lista
ao
meio
passar
todos
os
elementos
menores
que
o
meio
para
a
esquerda
e
todos
os
maiores
para
a
direita.
Chamar
a
funo
recursivamente
para
a
lista
direita,
depois
para
a
esquerda
e
em
seguida
concatenar
as
duas.
O
caso
bsico=
lista
vazia.
A = [ 7, 4, 3, 1, 5]
L
=
[]
R
=
[
]
Ordenamento(4)
-
Quicksort
Idia:Dividir
a
lista
ao
meio
passar
todos
os
elementos
menores
que
o
meio
para
a
esquerda
e
todos
os
maiores
para
a
direita.
Chamar
a
funo
recursivamente
para
a
lista
direita,
depois
para
a
esquerda
e
em
seguida
concatenar
as
duas.
O
caso
bsico=
lista
vazia.
A = [ 7, 4, 3, 1, 5]
L
=
[3,1]
R
=
[
]
Ordenamento(4)
-
Quicksort
Idia:Dividir
a
lista
ao
meio
passar
todos
os
elementos
menores
que
o
meio
para
a
esquerda
e
todos
os
maiores
para
a
direita.
Chamar
a
funo
recursivamente
para
a
lista
direita,
depois
para
a
esquerda
e
em
seguida
concatenar
as
duas.
O
caso
bsico=
lista
vazia.
A = [ 7, 4, 3, 1, 5]
L
=
[3,1]
R
=
[7,5]
Ordenamento(4)
-
Quicksort
Idia:Dividir
a
lista
ao
meio
passar
todos
os
elementos
menores
que
o
meio
para
a
esquerda
e
todos
os
maiores
para
a
direita.
Chamar
a
funo
recursivamente
para
a
lista
direita,
depois
para
a
esquerda
e
em
seguida
concatenar
as
duas.
O
caso
bsico=
lista
vazia.
A = L + [4] + R = [ 1, 3, 4, 5, 7]
L
=
[7,
4]
R
=
[3,1,5]
L
=
[4,
7]
R
=
[1,3,5]
10
2
3
4
5
6
7
0
-1
-2
8
9
11
15
65
43
32
11
2
0
50
0
-1
-2
4
2
0
7
10
2
3
8
5
6
15
74 43
32
11
9
11
50
Outros:
Odd-Even
Sort,
Flashsort,
Introsort,
Library
sort,
Pa>ence
sor>ng
,Tree
sort
(binary
tree
sort),
Strand
sort,
Bead
sort,
Bucket
sort,
Burstsort,
Coun>ng
sort,
Pigeonhole
sort,
Postman
sort,
Radix
sort,
Smoothsort,
Bitonic
sorter,
Pancake
sor>ng,
Topological
sort,
Samplesort
.....
Exerccio
Um
exerccio
simples
para
desopilar:
Dadas
duas
listas
no
ordenadas
A
e
B,
faa
um
programa
para
criar
uma
lista
C
ordenando
e
intercalando
as
duas
listas
(A
e
B)
na
forma
itera>va.
Anlise
de
Algoritmos
Obje>vo:
Determinar
quanto
de
espao
(memria)
ser
necessria
para
execuo
de
um
algoritmo
e
quanto
tempo
o
mesmo
levar
para
ser
executado.
Es>ma>vas:
Notaes
Big
O,
Omega,
Big
Omega,
Theta,etc
1. Crie
trs
ou
mais
funes
uma
para
cada
>po
de
mtodo
de
ordenamento
que
vc
deseja
testar.
(Ex.
Bolha,
quick,
shell)
2. Repita
para
i
=
100,
500,
1000,1500,2000,3000,4000,5000,10000,20000,50000,100000
2.1
Gere
uma
srie
de
lista
de
nmeros
aleatrios
de
tamanho
i
2.2
Ordene
a
srie
chamando
as
funes
denidas
no
passo
1
2.3
Guarde
os
tempos
usados
para
cada
operao
de
ordenamento
5. Crie
uma
tabela
conforme
modelo
abaixo:
N
Metodo
A
Metodo
B
Metodo
C
Metodo
D
101
t11
t12
t13
t14
500
t21
t22
t23
t24
......
class
NomeDaClasse:
<declarao-1>
.
.
.
<declarao-N>
Aula
8
POO
-
Objetos
Criando
(instanciando)
objetos:
<objeto> = nome_da_classe()
Ex.
import
math
import
os
os.system("clear")
class
Triangulo:
c1=0
c2=0
Construtor
da
classe
def
__init__(self):
self.c1
=
input("Digite
o
tamanho
do
cateto
1
")
self.c2
=
input("Digite
o
tamanho
do
cateto
2
")
def
h(self):
#
a
funcao
deve
ter
pelo
menos
um
argumento
return
math.sqrt(t.c1**2
+t.c2**2)
#
m
da
classe
Chama
o
construtor
e
cria
instncia
t
=
Triangulo()
print
"hipotenusa
",t.h()
Aula
8
POO
-
Herana
Uma
classe
pode
herdar
atributos
e
mtodos
de
uma
(herana
simples)
ou
mais
classes
(herana
ml>pla).
A
sintaxe
:
import
math
import
os
os.system("clear")
class
Triangulo:
area
=
0
>po="
"
def
__init__(self):
print
"Criada
a
classe
Base
Aula
8
POO
Herana-
Exemplo
class
TrianguloRetangulo(Triangulo):
l1
=
0
l2
=
0
def
__init__(self):
Triangulo.__init__(self)
print
"Criando
a
classe
derivada"
self.l1
=
input("Qual
o
valor
do
lado
1
")
self.l2
=
input("Qual
o
valor
do
lado
2
")
self.area
=
self.l1
*
self.l2
/
2.0
print
"Area
=
",self.area
#
m
da
classe
#
inicio
do
programa
principal
t
=
Triangulo()
tr
=
TrianguloRetangulo()
Aula
8
POO
Polimorsmo
Deciso
em
tempo
de
execuo
de
qual
mtodo
a
chamar
em
uma
hierrquica.
Na
pr>ca
semelhante
a
>pagem
dinmica.
(O
python
concebido
assim)
#
chamada
polimorca
t
=
tr
print
"Hipotenusa
(Usando
t)
",t.h()
print
"Hipotenusa
(Usando
tr)
",tr.h()
t.l1
=
1000
print
"l1
em
t
",
t.l1
print
"l1
em
tr
",
tr.l1
Aula
8
POO
Sobrecarga
de
Mtodos
Consiste
na
existncia
de
mtodos
diferentes
com
o
mesmo
nome.
A
chamada
denida
pela
assinatura
do
mtodo.
(Tipos
e
quan>dades
dos
argumentos).
def
__str__(self):
return
str(self.divisor)
+
'/'
+
str(self.dividendo)
a
=
Racional(1,2)
b
=
Racional(3,4)
c
=
a*b
print
c
Programa46.py
Aula
8
POO
Sobrecarga
de
Operadores
Operadores a sobrecarregar:
__add__:
Adio.
__sub__:
Sutrao.
__mul__:
Mul>plicao.
__div__:
Diviso.
__mod__:
Resto
da
diviso.
__pos__:
Iden>dade.
__neg__:
Nega>vo.
__abs__:
Absoluto.
Ex.
class
universidade:
x,y
,z
,
etc
class
depto:
jhsdkhd
# m da classe
Crie
uma
classe
chamada
de
Ordenadora
com
os
atributos
bsicos
para
uma
tarefa
de
ordenamento.
A
seguir
crie
classes
lhas
que
implementem
os
diversos
mtodos
de
ordenamento
que
estudamos
na
aula
passada.
Registros
Registros
so
conjuntos
de
dados
>picamente
usados
para
guardar
dados
em
bancos
de
dados
onde
cada
linha
da
tabela
um
registro.
Algumas
linguagens
como
o
pascal
(record)
ou
C
(struct)
possuem
este
>po
denido.
Em
Python
podemos
usar
classes
sem
mtodos
ou
mesmo
listas
ou
tuplas
de
acordo
com
o
uso
que
faremos
deles.
Lembrando
:
lista
=
[1,2,3,4]
tupla
=
1,2,3,4
Ambas
so
acessadas
com
ndices,
mas
com
u>lizaes
e
possibilidades
diferentes.
Class
registro:
nome=
idade
=
0
peso
=
0
Registros
Vamos
ento
criar
um
banco
de
dados
de
alunos
do
IFET-Ce.
Colocando
em
uma
lista
os
nomes,
endereos
e
e-mails.
Idia:
Criar
uma
classe
alunos,
criar
uma
lista
vazia
para
adicionar
os
alunos,
perguntar
a
quan>dade
de
alunos
a
cadastrar
criar
um
programa
para
cadastrar
ou
mostrar
a
lista
de
alunos.
Uma
melhora:
criar
um
menu
de
entrada
para
que
o
usurio
escolha
o
que
deseja
fazer.
Registros
Denindo
a
classe.
class
Aluno:
def
__init__(self,
nome,endereco,email):
self.nome
=
nome
self.endereco
=
endereco
self.email
=
email
def
__str__(self):
return
"\nAluno:
"+self.nome+"\nEnd:
"+self.endereco+"\ne-mail:"+self.e$
#
m
da
classe
Registros
Nosso
menu
do
programa.
#
inicio
do
programa
lista
=
[]
while
True:
os.system("clear")
print
"Escolha
uma
opo
abaixo:"
print
"<1>
Cadastrar
um
Aluno"
print
"<2>
Listar
os
Alunos
"
print
"<3>
Sair
do
Programa"
escolha
=
raw_input("Digite
sua
escolha
e
pressione
<enter>
")
if
escolha
==
"1:
os.system("clear")
nome
=
raw_input("Digite
o
nome
do
aluno
")
end
=
raw_input("Digite
o
endereco
do
aluno
")
mail
=
raw_input("Digite
o
e-mail
do
aluno
")
obj
=
Aluno(nome,end,mail)
lista.append(obj)
Registros
Nosso
menu
do
programa.
-
Con>nuao
Programa47.py
2
Probleminhas
Existem
linguagens
que
no
tem
o
>po
lista
como
o
Python
Uma
soluo
para
a
criao
de
bancos
de
dados
como
estes
que
zemos
seria
u>lizar
listas
encadeadas.
Ex.
class
Aluno:
proximo
=
""
def
__init__(self,
nome="",endereco="",email=""):
self.nome
=
nome
self.endereco
=
endereco
self.email
=
email
def
__str__(self):
return
"\nAluno:
"+self.nome+"\nEnd:
"+self.endereco+"\ne-mail:"+self.e$
#
m
da
classe
Listas
Encadeadas
Criando
algumas
variveis
de
trabalho:
obj1 Primeiro
obj2
Nome,
End,
Tel
Atual
Proximo
=
<obj3>
obj3
Nome,
End,
Tel
Proximo
=
l>mo
Listas
Encadeadas
(Simples)
Inserindo
elementos
na
lista:
if
escolha
==
"1":
os.system("clear")
nome
=
raw_input("Digite
o
nome
do
aluno
")
end
=
raw_input("Digite
o
endereco
do
aluno
")
mail
=
raw_input("Digite
o
e-mail
do
aluno
")
obj
=
Aluno(nome,end,mail)
if
primeiro.nome
==
"":
primeiro
=
obj
ul>mo
=
primeiro
else:
ul>mo.proximo
=
obj
ul>mo
=
ul>mo.proximo
Listas
Encadeadas
(Simples)
Imprimindo
a
lista
inteira:
Programa48.py
Listas
Encadeadas
Exerccio
Pesquisa
Linear
na
Lista.
Programa49.py
E se ....
obj1
Proximo
=
<obj2>
obj2
Proximo
=
<obj3>
obj3
Proximo
=
<obj2>
A vc de tentar .....
obj1
Anterior
=
obj2
Prximo
=
<obj2>
Anterior=<obj1>
Prximo
=
<obj3>
obj3
Anterior=<obj2>
Prximo
=
<obj2>
A
vc
de
tentar
.....
Fim
da
Aula
8
Aula
9
Estruturas
de
Dados
Avanadas
Aula
9
Estruturas
de
Dados
Avanadas
Probleminhas
com
listas
ligadas:
Detalhe:
uma
lista
encadeada
no
permite
acesso
direto
a
um
elemento
mesmo
que
seja
ordenada.
N
Pai
Nvel
1
Nvel
2
Folhas
N
Filho
30 90
20 40 85 99
Quando
os
ns
tem
no
mximo
dois
lhos
trata-se
de
uma
rvore
binria
ou
rvore
de
pesquisa
binria.
(binary
search
tree).
Os
dados
so
associados
aos
ns
e
os
ns
esquerdos
tem
valores
menores
que
os
pais
e
os
direitos
so
superiores.
Dependendo
da
ordem
como
os
ns
so
visitados
eles
listam
os
dados
naturalmente
ordenados.
rvores
Binrias
#
m
da
classe
Noh
rvores
Binrias
Valor
a
procurar=37
50
37<50
30 90
>30
20
40
85
99
<40
37 44
37==37
rvores
Binrias
30 90
>30
20 40 85 99
30 90
>30
20 40 85 99
37
def
imprimeNohs(self,raiz):
if
raiz
==
None:
return
a
=
raiz.dado
if
raiz.esquerdo
!=
None:
b
=
raiz.esquerdo.dado
else:
b
=
None
if
raiz.direito
!=
None:
c
=
raiz.direito.dado
else:
c
=
None
print
"{",a,"[",b,",",c,"]","}",
self.imprimeNohs(raiz.esquerdo)
Programa50.py
self.imprimeNohs(raiz.direito)
rvores
Binrias
Pr-Ordem:
1.
Visitar
o
n
2.
Visitar
recursivamente
os
ns
do
lado
esquerdo
3.
Visitar
recursivamente
os
ns
do
lado
direito
Ps-Ordem
1. Visitar
recursivamente
os
ns
do
lado
esquerdo
2. Visitar
recursivamente
os
ns
do
lado
direito
3. Visitar
os
ns
rvores
Binrias
Expresso
A
*
(
B+
C)
*
Visitando
a
rvore
podemos
ter:
A +
B
C
Em-ordem:
A
*
(B
+
C)
:
interxada
(parenteses
por
sua
conta)
Pr-ordem
*A+BC
:
pr-xada
(Nunca
precisa
de
parnteses)
Ps-Ordem
ABC+*:
ps-xada
(Facilita
o
uso
de
pilhas
para
armazenar
rvores)
rvores
Binrias
30 90
20 40 85 99
37
44
rvores
Binrias
30 90
20 40 85 99
37
44
rvores
Binrias
Passo
11:
Deletando
ns
esquerdo
=
None
30
90
20 40 85 99
Programa51.py
rvores
Binrias
30 90
20 40 85 99
44
rvores
Binrias
Programa52.py
30
90
20
85
99
44
40
rvores
Binrias
30 90
20 40 85 99
37
44
rvores
Binrias
SOLUO ERRADA 50
30 90
40
20 85 99
37
44
rvores
Binrias
Passo
11:
Deletando
ns
Seguir
pela
direita
e
no
primeiro
n
mudar
Soluo:
Subs>tuir
o
n
por
seu
sucessor
a
esquerda
e
prosseguir
at
o
n
que
no
tenha
lhos
a
esquerda.
ele.
50
30 90
20 40 85 99
37
44
rvores
Binrias
Passo
11:
Deletando
ns
Soluo:
Subs>tuir
o
n
por
seu
sucessor
50
30
37
90
20 40 85 99
44
rvores
Binrias
Passo
11:
Deletando
ns
Caso
par>cular:
O
sucessor
est
direita
(No
possui
lhos
esquerda)
Desloca
a
sub-rvore
50
inteira
30 90
20 40 99
37
44
rvores
Binrias
Passo
11:
Deletando
ns
Funo
Sucessor:
def
sucessor(self,noh):
paiSucessor
=
noh
sucessor
=
noh
atual
=
noh.direito
while
atual
!=
None:
paiSucessor
=
sucessor
sucessor
=
atual
atual
=
atual.esquerdo
if
sucessor
!=
noh.direito:
#
refazendo
as
conexes
paiSucessor.esquerdo
=
sucessor.direito
sucessor.direito
=
noh.direito
return
sucessor
rvores
Binrias
Passo
11:
Deletando
ns
Finalizando
a
funo
apagar
Programa53.py
else:
suc
=
sucessor(atual)
if
atual
==
raiz:
raiz
=
suc
elif
ehFilhoEsquerdo:
nohPai.esquerdo
=
suc
else:
nohPai.direito
=
suc
suc.esquerdo
=
atual.esquerdo
#
sucessor
no
tem
lho
a
esquerda
return
True
rvores
Binrias
Representando
como
um
Vetor.
Esquerdo(i)
=
2*
i
+
1
Direito(i)
=
2
*
1
+
2
Pai(i)
(i-1)/2
30
50
85
90
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Como?:
Usar
um
conjunto
de
regras
que
constroem
o
que
cou
conhecido
como
rvore
vermelho-pretas
ou
rubro-negras
(como
queira).
Regras:
Passo
1
:
criarArvore(50)
Ns
so
inseridos
em
vermelho.
No
muda
comprimento
de
pretos,
diminuindo
a
chance
de
ter
problemas
em
seqncia.
Passo
2
:
inserirNoh(75)
Passo
3
:
inserirNoh(25)
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Passo 3 : inserirNoh(25)
Primeiro Problema:
Passo 4 : inserirNoh(35): 35
Passo 4 : inserirNoh(35):
Soluo(2):
Rotao
Obs:
A
cor
do
25
deve
mudar
para
Preto.
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Passo 4 : inserirNoh(35):
Soluo(2):
Rotao
Obs:
A
cor
do
25
deve
mudar
para
Preto.
Limitando o desbalanceamento:
Concluso:
As
regras
RBT
(Red-Black-Tree)
impedem
rvores
com
dois
ou
mais
nveis
de
desbalanceamento.
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Filhos
nulos
(Null
/
Nil
/
None)
:
Aqueles
lhos
que
o
n
deveria
ter,
mas
no
tem.
Complementar
ao
lho
direito
ou
esquerdo.
Comprimento de pretos 1
Filhos Nulos
Comprimento de pretos 2
Obje>vos:
Observe
o
deslocamento
da
sub-
rvore
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Inserindo ns.
Seja
X
um
n
especco,
Seja
P
o
n
pai
de,
Seja
G
o
n
av
de
X.
Roteiro.
Antes Depois
G G G
G
P P P
P
X X X
X
Neto
de
Fora
Neto
de
Dentro
Neto
de
Dentro
Neto
de
Fora
(Filho
Esquerdo)
(Filho
Direito)
(Filho
Esquerdo)
(Filho
Direito)
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
G
G G
P
P P
X X
X
a)
P
preto
b)
P
vermelho
X
est
fora.
c)
P
vermelho
X
est
dentro.
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Caso 1 : P preto.
a)
P
preto
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
O
que
fazer?
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Vermelhos
em
seqncia
Bem
melhor.
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Vermelhos
em
seqncia
rvore
balanceada.
Aula
10
rvores
Vermelho-Pretas
(Rubro-Negras?)
Consideraes adicionais:
Ver Programa54.py
OBS:
As
rvores
AVL
fazem
balanceamento
a
par>r
da
medida
dos
comprimentos
dos
ramos.
Caso
haja
uma
diferena
superior
a
um
so
feitas
rotaes
para
balancear
novamente
a
rvore.
AVL
=
(Adelson,
Velskii
e
Landis.
Criadores)
Aula
10
PAUSA
Avanando
no
Python
Estruturas
de
Dados
Built-In
(Vem
incorporado
ao
Python)
Existem trs funes internas que so muito teis sobre listas: lter(), map(), e reduce().
Existem trs funes internas que so muito teis sobre listas: lter(), map(), e reduce().
Existem trs funes internas que so muito teis sobre listas: lter(), map(), e reduce().
Uma tupla consiste em uma sequncia imutvel de valores separados por vrgulas
Uma tupla consiste em uma sequncia imutvel de valores separados por vrgulas
Empacotamento:
Desempacotamento:
>>>
x,
y,
z
=
t
Aula
10
PAUSA
Avanando
no
Python
Estruturas
de
Dados
Built-In
(Vem
incorporado
ao
Python):
Conjuntos
>>>
basket
=
[apple,
orange,
apple,
pear,
orange,
banana]
>>>
fruits
=
set(basket)
#
create
a
set
without
duplicates
>>>
fruits
set([orange,
pear,
apple,
banana])
>>>
orange
in
fruits
#
fast
membership
tes>ng
True
>>>
crabgrass
in
fruits
False
>>>
a
=
set(abracadabra)
>>>
b
=
set(alacazam)
>>>
a
#
unique
le|ers
in
a
set([a,
r,
b,
c,
d])
>>>
a
-
b
#
le|ers
in
a
but
not
in
b
set([r,
d,
b])
>>>
a
|
b
#
le|ers
in
either
a
or
b
set([a,
c,
r,
d,
b,
m,
z,
l])
>>>
a
&
b
#
le|ers
in
both
a
and
b
set([a,
c])
>>>
a
^
b
#
le|ers
in
a
or
b
but
not
both
set([r,
d,
b,
m,
z,
l])
Aula
10
PAUSA
Avanando
no
Python
Estruturas
de
Dados
Built-In
(Vem
incorporado
ao
Python):
Dicionrios:
Enumerate
ZIP
Para
percorrer
duas
ou
mais
sequncias
simultaneamente
com
o
lao,
os
items
podem
ser
agrupados
com
a
funo
zip().
reversed
Para
percorrer
uma
sequncia
em
ordem
reversa,
chame
a
funo
reversed()
com
a
sequncia
na
ordem
original.
>>>
for
i
in
reversed(xrange(1,10,2)):
...
print
i
...
9
7
xrange
uma
funo
semelhante
ao
range,
5
mas
que
no
gera
a
lista
e
sim
um
objeto
3
gerador
da
mesma
o
que
a
torna
1
ligeiramente
mais
eciente
que
o
range()
11.
Mdulos
E/S
e
Arquivos
em
Python
sorted
Para
percorrer
uma
sequncia
de
maneira
ordenada,
use
a
funo
sorted(),
que
retorna
uma
lista
ordenada
com
os
items,
mantendo
o
original
inalterado.
Mdulos
Dentro
de
um
mdulo,
seu
nome
(uma
string)
est
disponvel
na
varivel
global
__name__.
Programa55.py
11.
Mdulos
E/S
e
Arquivos
em
Python
Mdulos Compilados
Um
fator
que
agiliza
a
carga
de
programas
curtos
que
u>lizam
muitos
mdulos
padro
a
existncia
de
um
arquivo
com
extenso
.pyc
no
mesmo
diretrio
do
fonte
.py.
dir
A
funo
interna
dir()
u>lizada
para
se
descobrir
que
nomes
so
denidos
por
um
mdulo.
Ela
retorna
uma
lista
ordenada
de
strings:
Ex.
Import
math
dir(math)
Pacotes
O
uso
de
pacotes
permite
aos
autores
de
grupos
de
mdulos
(como
NumPy
ou
PIL)
no
terem
que
se
preocupar
com
coliso
entre
os
nomes
de
seus
mdulos
e
os
nomes
de
mdulos
de
outros
autores.
Pacotes
Pacotes
Existe
ainda
o
mtodo
zll()
que
preenche
uma
string
numrica
com
zeros
esquerda.
Ele
entende
sinais
posi>vos
e
nega>vos.
>>>
12.zll(5)
00012
>>>
-3.14.zll(7)
-003.14
>>>
3.14159265359.zll(5)
3.14159265359
11.
Mdulos
E/S
e
Arquivos
em
Python
Se
h
mais
do
que
um
formato,
ento
o
argumento
direita
deve
ser
uma
tupla
com
os
valores
de
formatao.
Exemplo:
>>>
table
=
{Sjoerd:
4127,
Jack:
4098,
Dcab:
7678}
>>>
for
name,
phone
in
table.items():
...
print
%-10s
==>
%10d
%
(name,
phone)
...
Jack
==>
4098
Dcab
==>
7678
Sjoerd
==>
4127
11.
Mdulos
E/S
e
Arquivos
em
Python
Se
voc
possuir
uma
string
de
formatao
muito
longa,
seria
bom
referenciar
as
variveis
de
formatao
por
nome,
ao
invs
de
por
posio.
Isso
pode
ser
ob<do
passando
um
dicionrio
como
argumento
direita
e
prexando
campos
na
string
de
formatao
com
%(name)format.
Veja
o
exermplo:
>>>
f=open(/tmp/workle,
w)
>>>
print
f
<open
le
/tmp/workle,
mode
w
at
80a0960>
>>>
f=open(/tmp/workle,
w)
>>>
print
f
<open
le
/tmp/workle,
mode
w
at
80a0960>
>>>
f.read()
Esse
todo
o
contedo
do
arquivo.\n
>>>
f.read()
11.
Mdulos
E/S
e
Arquivos
em
Python
Readline
f.readline()
l
uma
nica
linha
do
arquivo.
O
caracter
de
retorno
de
linha
(\n)
deixado
ao
nal
da
string,
s
sendo
omi>do
na
l>ma
linha
do
arquivo
se
ele
j
no
es>ver
presente
l.
Isso
elimina
a
ambiguidade
no
valor
de
retorno.
Se
f.readline()
retornar
uma
string
vazia,
ento
o
arquivo
acabou.
Linhas
em
branco
so
representadas
por
\n:
uma
string
contendo
unicamente
o
terminador
de
linha.
>>>
f.readline()
Essa
a
primeira
linha
do
arquivo.\n
>>>
f.readline()
Segunda
linha
do
arquivo\n
>>>
f.readline()
11.
Mdulos
E/S
e
Arquivos
em
Python
Readlines
f.readlines()
retorna
uma
lista
contendo
todas
as
linhas
do
arquivo.
Se
for
fornecido
o
parmetro
opcional
sizehint,
ser
lida
a
quan<dade
especicada
de
bytes
e
mais
o
suciente
para
completar
uma
linha.
Frequentemente,
esta
operao
u>lizada
para
ler
arquivos
muito
grandes
sem
ter
que
ler
todo
o
arquivo
para
a
memria
de
uma
s
vez.
Apenas
linhas
completas
sero
retornadas.
>>>
f.readlines()
[Essa
a
primeira
linha
do
arquivo.\n,
Segunda
linha
do
arquivo\n]
11.
Mdulos
E/S
e
Arquivos
em
Python
Readlines
fUma
maneira
alterna>va
de
ler
linhas
do
arquivo
usando
um
lao
diretamente
com
o
objeto
arquivo.
mais
eciente,
rpido
e
resulta
em
cdigo
mais
simples:
Quando
acabar
de
u>lizar
o
arquivo,
chame
f.close()
para
fech-lo
e
liberar
recursos.
Qualquer
tenta>va
de
acesso
ao
arquivo
depois
dele
ter
sido
fechado
implicar
em
falha.
>>>
f.close()
>>>
f.read()
Programa56.py
programa57.py
11.
Mdulos
E/S
e
Arquivos
em
Python
Mdulo
pickle
Programa56.py
programa57.py
Exerccios
Propostos
1. Use
uma
lista
ligada
ou
uma
rvore
binria
para
gravar
um
banco
de
dados
qualquer
em
seu
computador.
Os
dados
devem
ser
gravados
e
recuperados
em
arquivos.
2. Leia
sobre
Bancos
de
Dados
relacionais
na
Internet
e
use
dicionrios
para
guardar
tabelas
relacionais.
Aprenda
como
inserir
dados
nesta
tabela
e
como
realizar
pesquisasa.
Lembrando
que
estes
dados
devem
ser
gravados
permanentemente
em
arquivos.
3. Estude
uma
forma
de
esconder
mensagens
em
uma
imagem
( jpeg,
gif,
etc,
ou
outro
>po
de
arquivo
e
implemente
em
Python.
FIM
DA
AULA
11
AULA
12
Excees
AULA
12
Excees
>>>
10
*
(1/0)
Traceback
(most
recent
call
last):
File
"<stdin>",
line
1,
in
?
ZeroDivisionError:
integer
division
or
modulo
by
zero
AULA
12
Excees
Varivel Inexistente
>>>
4
+
spam*3
Traceback
(most
recent
call
last):
File
"<stdin>",
line
1,
in
?
NameError:
name
spam
is
not
dened
AULA
12
Excees
Se
no
ocorrer
exceo
a
clusula
except
ignorada.
AULA
12
Excees
Construo
try
except.
Levantando Excees
>>>
try:
...
raise
KeyboardInterrupt
A
construo
try
possui
outra
...
nally:
clusula
opcional,
cuja
nalidade
...
print
Goodbye
permi>r
a
implementao
de
...
aes
de
limpeza,
Goodbye,
world!
que
sempre
devem
ser
executadas
Traceback
(most
recent
call
last):
independentemente
da
File
"<stdin>",
line
2,
?
ocorrncia
de
excees
KeyboardInterrupt
Programa59.py
AULA
12
Excees
Disparadas
Asser>onError
A|ributeError
EOFError
GeneratorExit
IOError
IndexError
KeyError
MemoryError
NameError
OSError
OverowError
Run>meError
StopItera>on
Disparada
por
um
mtodo
next()
de
um
iterador
para
sinalizar
que
no
h
mais
valores
adicionais.
AULA
12
Excees
Disparadas
SyntaxError
SystemError
SystemExit
UnboundLocalError
UnicodeError
VMSError
WindowsError
Warning
UserWarning
PendingDepreca>onWarning
SyntaxWarning
def
f():
<
Instrues
>
return
<Valor>
#
Valor
retornado
uma
s
vez.
x
=
f()
#
valor
retornado
para
x
e
apagado
AULA
12
Pausa
Geradores:
Funes
com
memria.
Um gerador:
def
f():
<
Instrues
>
yield
<Valor>
#
Valor
retornado
e
dados
so
preservados
x
=
f()
#
a
varivel
x
associada
a
funo
def
f(i=0,limite=0):
while
i
<=
limite:
i
+=
1
yield
i
#
Valor
retornado
no
meio
de
um
lao
#
Isto
signica
que
a
prxima
chamada
a
next()
#
con>nuar
o
lao
x
=
f(0,10)
#
a
varivel
x
associada
a
funo
y
=
x.next()
k
=
f(1,10)
Um
gerador
retorna
um
iterador.
for
z
in
k:
print
z
AULA
12
Curiosidade
Clculo
do
Pi
h|p://pt.wikipedia.org/wiki/Pi#M.C3.A9todos_de_c.C3.A1lculo
Mtodo Clssico
Mtodo Estas>co
(4 * Pontos Incritos)/total
Programa62.py
Programa63.py
AULA
12
Curiosidade
Transformao
de
van
Wijngaarden
Programa64.py
AULA
12
Curiosidade
Valor
de
Pi
3.141592653589793238462643383279502884197169399375105820974944592307816
40628620899862803482534211706798214808651328230664709384460955058223172
53594081284811174502841027019385211055596446229489549303819644288109756
65933446128475648233786783165271201909145648566923460348610454326648213
39360726024914127372458700660631558817488152092096282925409171536436789
2590360011330530548820466521384146951941511609...
Fim
da
Aula
12
Aula
13
rvores
2-3-4
rvore
Binria:
30 35 55 78 100 105
Um
n
com
um
item
de
dado
possui
dois
lhos
50
30 50
30
35
55
78
rvore
2-3-4
(Mul>vias
de
Ordem
4)
No admite ns vazios
No
admite
ns
com
um
s
lho
50
40
13.
rvores
2-3-4
Exemplo
de
rvore
2-3-4.
Fonte:
Lafore,
Robert
Data
Structures
and
Algorithms
in
Java
13.
rvores
2-3-4
Organizao
da
rvore:
13.
rvores
2-3-4
Pesquisando
em
uma
rvore
2-3-4:
Similar
pesquisa
binria.
Inicia
com
a
raiz.
Selecionar
o
link
que
leva
a
soluo
repe>ndo
a
operao
recursivamente
at
encontrar
o
valor.
64
>50
60
<
64
<70
13.
rvores
2-3-4
Inserindo
em
uma
rvore
2-3-4:
.
Caso
haja
um
n
completo
anterior
ao
ponto
de
insero
este
dever
ser
dividido.
exatamente
o
processo
de
diviso
que
mantm
a
rvore
balanceada.
Ns
so
divididos
no
caminho
de
busca
do
ponto
de
insero.
13.
rvores
2-3-4
Diviso
de
um
n
no-raiz
A
B
C
13.
rvores
2-3-4
Diviso de um n no-raiz
A
B
C
13.
rvores
2-3-4
Diviso de um n no-raiz
A
B
C
13.
rvores
2-3-4
Diviso de um n no-raiz
A
C
13.
rvores
2-3-4
Diviso de um n no-raiz
A
C
13.
rvores
2-3-4
Diviso
de
um
n
no-raiz
e)
Os
dois
lhos
direita
so
desconectados
do
n
a
ser
dividido
e
conectados
no
n
novo.
A
C
13.
rvores
2-3-4
Diviso
de
um
n
no-raiz
13.
rvores
2-3-4
Diviso
de
um
n
no-raiz
Esse
processo
deve
ser
repe>do
para
cada
n
totalmente
preenchido
onde
seja
necessrio
inserir
dados
13.
rvores
2-3-4
Diviso
da
raiz
Cria-se
um
novo
n
raiz
que
ser
o
pai
da
an>ga
raiz
que
ser
dividida
Cria-se
outro
n
que
ser
irmo
do
n
a
ser
dividido
O
C
movido
para
o
irmo
recm-criado
O
B
movido
para
a
nova
raiz
O
A
permanece
Os
dois
ns
mais
direita
so
desconectados
do
n
em
processo
de
diviso
e
reconectados
ao
n
direito
recm-criado.
13.
rvores
2-3-4
Diviso
da
raiz
13.
rvores
2-3-4
Diviso
da
raiz
13.
rvores
2-3-4
Quadro
Geral
Programa65.py
13.
rvores
2-3-4
Relao
com
rvores
Vermelho-Pretas
13.
rvores
2-3-4
Ecincia.
Tempo de busca :
Que hashing?!!
Palavra[1] = a
Palavra[n]
=
zyzzvya
14.
Tabelas
Hash
Convertendo
palavras
em
nmeros.
Palavras[43
]
=
CATS
14.
Tabelas
Hash
Ento
calculamos
os
ndices:
a
Palavra[1]
.....
.....
.....
Palavra[50000]
zzzzzzzzzzzzzz
was
=
23
+
1
+
19
=
43
>n
=
20
+
9
+
14
=
43
give
=
7
+
9
+
22
+
5
=
43
tend
=
20
+
5
+
14
+
4
=
43
moan
=
13
+15+1+14
=
43
>ck
=
20+9+3+11
=
43
14.
Tabelas
Hash
Colocando
pesos
nas
posies:
Notao posicional
26*279+ 26*278+ 26*277+ 26*276+ 26*275+ 26*274+ 26*273+ 26*272+ 26*271+ 26*270
A
matriz
para
guardar
esse
dicionrio
deveria
ter
mais
do
que
279
(
>
7000000000000)
posies
(ndices)
Muitas
destas
posies
seriam
reservadas
para
strings
que
no
formam
palavras.
Ex.
aaaa,
bbbbbb,
ccccccc,
abababa,
etc
14.
Tabelas
Hash
Connando
valores
0
1
0
2
1
3
2
4
3
5
4
6
7
Blablabla
desmys>fy
meliora>on
...
Duas
solues
-Endereamento
aberto
(open
addressing)
-Encadeamento
separado
(separate
chaining)
14.
Tabelas
Hash
Endereamento
Aberto
Quando
um
item
no
pode
ser
colocado
na
posio
calculada,
outro
posio
localizada
para
o
mesmo.
Posio
original
Blablabla
desmys>fy
meliora>on
...
Posio
Livre
14.
Tabelas
Hash
Endereamento
Aberto
Blablabla
desmys>fy
Procura
seqencialmente
blablabla
nas
prximas
posies
blublublu
Meliora>on
Blablabla
desmys>fy
Procura
seqencialmente
blablabla
nas
prximas
posies
blublublu
Blablabla
desmys>fy
Procura
seqencialmente
blablabla
nas
prximas
posies
blublublu
(DELETED)
Tritritr
Encontra
e
Marca
como
Deletado
14.
Tabelas
Hash
Recomendaes
-
Algumas
Implementaes
no
aceitam
deleo.
-
A
deleo
deve
ser
usada
eventualmente
pois
reduz
a
ecincia
das
tabelas
hash.
-
Normalmente
no
se
deve
admi>r
valores
duplicados
-
Deve-se
dimensionar
a
tabela
hash
como
do
dobro
da
previso
do
tamanho
e
no
se
usar
mais
que
2/3
de
seu
tamanho.
Programa66.py
14.
Tabelas
Hash
Quadra@c
Probing
(Explorao
Quadr@ca)
desmys>fy
A
insero
por
meio
de
Blasber
explorao
linear
tende
a
Blabluk
criar
clusters
longos.
Tregs
Bristols
14.
Tabelas
Hash
Quadra@c
Probing
(Explorao
Quadr@ca)
desmys>fy
Itens
que
deveriam
estar
Blasber
no
meio
do
cluster
fazem-
no
crescer
mais
e
mais
Blabluk
rpido
Tregs
Bristols
14.
Tabelas
Hash
Quadra@c
Probing
(Explorao
Quadr@ca)
FATOR
DE
CARGA
desmys>fy
Blasber
Nmero
de
itens
Blabluk
Tregs
Bristols
Tamanho
da
Matriz
14.
Tabelas
Hash
Quadra@c
Probing
(Explorao
Quadr@ca)
desmys>fy
Clusters
tendem
a
ser
formar
Blasber
mesmo
quando
o
fator
de
carga
baixo.
Blabluk
Tregs
Bristols
14.
Tabelas
Hash
Quadra@c
Probing
(Explorao
Quadr@ca)
Explorao
Quadr>ca
Posio
de
Insero
(hash)
=
x
Prximas
posies
x+12,
x
+
22,
x
+
32,
....
14.
Tabelas
Hash
Explorao
Procura
meliora>on
na
Quadr@ca
(Busca)
posio
do
hash.
Blablabla
desmys>fy
1
Procura
quadra>camente
blablabla
4
nas
prximas
posies
9 Tritritr
Meliora>on
Busca
Bem
Sucedida
14.
Tabelas
Hash
Explorao
Procura
meliora>on
na
Quadr@ca
(Busca)
posio
do
hash.
Blablabla
desmys>fy
1
Procura
quadra>camente
blablabla
4
nas
prximas
posies
9 Tritritr
Busca
mal
Sucedida
14.
Tabelas
Hash
Quadra@c
Probing
(Explorao
Quadr@ca)
Problema:
Programa67.py
14.
Tabelas
Hash
Encadeamento
Separado
(Separate
Chaining)
Listas
ligadas.
0 440 375
2 98 34
3 VAZIO
4 21 18 13
5
VAZIO
14.
Tabelas
Hash
Encadeamento
Separado
(Separate
Chaining)
Fator
de
carga
pode
ser
maior
que
1.
Duplicados so permi>dos
Completa
Incompleta
15.
Heaps
b)
Normalmente
implementada
como
uma
matriz
0
100
1
100
90
2
80
0
3
30
90
80
4
60
1
2
5
50
6
70
30
60
50
70
7
20
3
4
5
6
8
10
20
10
40
55
9
40
7
8 9
10
10
55
15.
Heaps
51
82
70
37
10
63
43
27
55
34
30
l@mo
N
15.
Heaps
30
51
82
Permuta
70
37
10
63
43
27
55
34
15.
Heaps
82
51
30
Permuta
70
37
10
63
43
27
55
34
15.
Heaps
82
51
70
30
37
10
63
Permuta
43
27
55
34
15.
Heaps
82
51
70
55
37
10
63
43
27
30
34
Fim
do
processo
com
apenas
4
permutaes.
15.
Heaps
82
51
70
55
37
10
63
43
27
30
34
95
A
ser
inserido.
15.
Heaps
82
51
70
55
37
10
63
Permuta
43
27
30
34
95
15.
Heaps
82
51
70
Permuta
55
95
10
63
43
27
30
34
37
15.
Heaps
82
Permuta
95
70
55
51
10
63
43
27
30
34
37
15.
Heaps
95
82
70
55
51
10
63
43 27 30 34 37
Insero
concluda.
15.
Heaps
Permutaes e Permutaes.
A
Permuta
Cpias
A
Cpia
TEMP
Permuta
B
A
Cpia
B
Cpia
Permuta
C
Cpia
C
3
Permutaes
=
9
Cpias
Cpia
A
D
D
Idem
com
5
Cpias
15.
Heaps
Relembrando
Detalhes
0
100
90
100
1
2
80
0
3
30
90
80
4
60
50
1
2
5
6
70
30
60
50
70
7
20
3
4
5
6
8
10
20
10
40
55
9
40
7
8 9
10
10
55
Relembrando
Detalhes
0
100
1
90
Repostas:
2
80
3
30
pai
=
(
x-1
)
/2
4
60
Filho
esquerdo
=
2
*
x
+
1
5
50
Filho
direito
=
2
*
x
+
2
6
70
7
20
8
10
9
40
10
55
15.
Heaps
Abrindo
o
cdigo
Inserindo
dados
def
inserir(self,chave):
if
self.tamanhoAtual
==
self.tamanhoMaximo:
return
False
novoNoh
=
Noh(chave)
self.matrizHeap[self.tamanhoAtual]
=
novoNoh
self.borbulhaAcima(self.tamanhoAtual)
self.tamanhoAtual
+=1
return
True
15.
Heaps
Abrindo
o
cdigo
Borbulhamento
pra
cima
def
borbulhaAcima(self,
indice):
pai
=
(indice-1)/2
base
=
self.matrizHeap[indice]
while
indice
>
0
and
self.matrizHeap[pai].obtemChave()
<
base.obtemChave():
self.matrizHeap[indice]
=
self.matrizHeap[pai]
indice
=
pai
pai
=
(pai
-1
)/2
self.matrizHeap[indice]
=
base
15.
Heaps
Abrindo
o
cdigo
Remover
Raiz
def
removerMaior(self):
raiz
=
self.matrizHeap[0]
self.tamanhoAtual
-=
1
self.matrizHeap[0]=
self.matrizHeap[self.tamanhoAtual]
self.borbulhaAbaixo(0)
return
raiz
15.
Heaps
Borbulhamento
Abaixo
def
borbulhaAbaixo(self,indice):
topo
=
self.matrizHeap[indice]
while
indice
<
self.tamanhoAtual/2:
lhoEsquerdo
=
2
*
indice
+1
lhoDireito
=
lhoEsquerdo
+
1
if
lhoDireito
<
self.tamanhoAtual
and
self.matrizHeap[lhoEsquerdo].obtemChave()
<
self.matrizHeap[lhoDireito].obtemChave():
lhoMaior
=
lhoDireito
else:
lhoMaior
=
lhoEsquerdo
if
topo.obtemChave()
>=
self.matrizHeap[lhoMaior].obtemChave():
break
self.matrizHeap[indice]
=
self.matrizHeap[lhoMaior]
indice
=
lhoMaior
self.matrizHeap[indice]=
topo
15.
Heaps
Abrindo
o
cdigo
Trocando
o
valor
de
um
elemento
def
troca(self,indice,novoValor):
if
indice
<
0
or
indice
>=
self.tamanhoAtual:
return
False
valorAn>go
=
self.matrizHeap[indice].obtemChave()
self.matrizHeap[indice].atribuiChave(novoValor)
if
valorAn>go
<
novoValor:
self.borbulhaAcima(indice)
else:
self.borbulhaAbaixo(indice)
return
True
15.
Heaps
Abrindo o cdigo
Programa69.py
15.
Heaps
Expandindo o Heap
Expandindo o Heap
Expandindo o Heap
HeapSort
HeapSort
Idia Bsica:
HeapSort
for
j
in
range(tamanho):
heap.inserir(
matrizBruta[j]
)
for
j
in
range(tamanho):
matrizOrdenada[j]
=
heap.remover()
15.
Heaps
Ecincia do HeapSort
Idia:
Ao
invs
de
inserir
e
borbulhar
cada
elemento,
inserimos
o
elemento
em
uma
posio
qualquer
e
borbulhamos
tudo
de
uma
vez.
Ganho:
82
70
55
51
10
63
43
27
30
34
15.
Heaps
82
70
55
51
10
63
43
27
30
34
15.
Heaps
82
70
55
51
10
63
INICIAR
em
N/2
-
1
43
27
30
34
11/2
-
1
=
4
15.
Heaps
Nova
funo
A
nova
ro@na
de
borbulhamento
abaixo
seria
algo
do
@po:
I
=
N/2
1
while
(I>=0):
heap.borbulhaAbaixo(I)
I
-=
1
15.
Heaps
Forma
recursiva
A
nova
ro@na
de
borbulhamento
abaixo
seria
algo
do
@po:
def
organizaHeap(indice):
if
indice
>
N/2
-
1:
return
#
nada
a
fazer
organizaHeap(indice*2
+
2)
organizaHeap(indice*2
+
1)
borbulhaAbaixo(indice)
Dado um heap.
50
50
30
30
40
40
10
10
20
20
15.
Heaps
Dado um heap.
40
40
30
30
20
20
10
10
---
15.
Heaps
Dado um heap.
40
Heap
40
30
30
20
20
10
10
50
Matriz
Ordenada
15.
Heaps
Dado um heap.
30
Heap
30
10
10
20
20
--
50
Matriz
Ordenada
15.
Heaps
Dado um heap.
30
Heap
30
10
10
20
20
40
50
Matriz
Ordenada
15.
Heaps
Repe>ndo
Dado um heap.
20
Heap
20
10
10
--
40
50
Matriz
Ordenada
15.
Heaps
Repe>ndo
Dado um heap.
20
Heap
20
10
10
30
40
50
Matriz
Ordenada
15.
Heaps
Finalizando ...
Dado um heap.
10
Heap
10
--
30
40
50
Matriz
Ordenada
15.
Heaps
Finalizando ...
Dado um heap.
10
Heap
10
20
30
40
50
Matriz
Ordenada
15.
Heaps
Finalizando ...
10
20
30
Matriz
Ordenada
40
50
Programa70.py
15.
Heaps
Resumindo...
Um
heap
uma
estrutura
de
dados
abstrata
(EDA)
normalmente
u>lizada
para
representar
las
com
prioridades.
O
heap
no
permite
a
visita
ordenada
aos
dados,
a
localizao
de
uma
chave
especca
ou
deleo.
15.
Heaps
Resumindo...
Um
heap
normalmente
implementado
como
uma
matriz
representando
uma
rvore
binria
completa.
Os
ns
possuem
chaves
menores
que
seus
pais
e
maiores
que
seus
lhos.
Os
itens
so
inseridos
no
nal
da
matriz
e
borbulhados
para
cima.
Quando
um
elemento
re>rado
da
raiz
o
l>mo
elemento
colocado
a
e
deslocado
(borbulhado)
para
baixo
at
sua
posio
correta.
A
prioridade
de
um
elemento
pode
mudar,
mudando
a
sua
chave.
Ao
mudar
para
maior
o
item
borbulhado
para
cima,
do
contrrio
para
baixo.
Heapsort
um
algoritmo
de
ordenamento
eciente.
O(N*logN)
A
idia
bsica
do
heapsort
a
insero
e
re>rada
de
elementos
de
um
heap
O
heapsort
ca
mais
eciente
se
a
formao
do
heap
feita
aps
a
insero
de
todos
os
itens
em
posies
aleatrias.
Uma
mesma
matriz
pode
servir
para
armazenar
o
heap
e
gerar
a
lista
ordenada.
15.
Heaps
Fim
da
aula
15
16.
Grafos
16.
Grafos
Uma
rvore
binria
por
exemplo
cons>tuda
de
forma
a
facilitar
a
procura
e
insero
de
elementos
16.
Grafos
Ns
Segmentos
16.
Grafos
Grafo
representando
regio
metropolitana
de
fortaleza.
Fortaleza
BR020
CE040
Euzbio
BR116
Aquiraz
CE065
Caucaia
CE060
Itai>nga
Maranguape
CE060
Maracana
Pacatuba
16.
Grafos
Adjacncia
A
B
Adjacncia
A
B
Caminho (path)
A
B
ABC
=
Grafo Conectado
Conectado
No
Conectado
A
B
D
C
Grafo Direcionado
A
B
D
C
A
60
B
10
40
30
D
C
A D
B
16.
Grafos
class
Ver>ce:
def
__init__(self,rotulo):
self.rotulo
=
rotulo
#
por
exemplo
A
self.visitado
=
False
def
visitado(self):
self.visitado
=
True
16.
Grafos
Representando os Arcos
Matriz
de
Adjacncias
Lista
de
Adjacncias
16.
Grafos
Matriz
Adjacncias
16.
Grafos
Lista
de
Adjacncias
16.
Grafos
nVer>ces
+=
1
listaVer>ces[nVer>ces]
=
Ver>ce(A);
16.
Grafos
adjMat[1][3]
=
1
adjMat[3][1]
=
1
16.
Grafos
adjlista[1].append(3)
adjlista[3].append(1)
16.
Grafos
Fortaleza
BR020
CE040
CE065
Euzbio
Aquiraz
BR116
Caucaia
CE060
Itai>nga
Maranguape
CE060
Maracana
Pacatuba
16.
Grafos
Busca em Grafos
Estratgias
Busca em Profundidade
B C D E
F G
H
I
16.
Grafos
Busca em Profundidade
Seqncia 1. A
Busca em Profundidade
Seqncia 1. A
Busca em Profundidade
Seqncia 1.
Busca em Profundidade
Seqncia 2 B
P r o c u r a m o s
u m
n
adjacente
no
visitado
Usar
uma
pilha
para
relembrar
os
ns
visitados.
16.
Grafos
Busca em Profundidade
Seqncia 2 B
Busca em Profundidade
Seqncia 2
B A
Busca em Profundidade
F
F
B
A
Busca em Profundidade
H
H
F
B
A
Busca em Profundidade
H F B A
Novamente???
No
mais
possvel.
Usar
uma
pilha
para
relembrar
os
ns
visitados.
16.
Grafos
Busca em Profundidade
Seqncia 3 H
F B A
Re>rar
um
elemento
da
pilha.
Usar
uma
pilha
para
relembrar
os
ns
visitados.
16.
Grafos
Busca em Profundidade
Seqncia 3 H
F B A
Busca em Profundidade
F
Seqncia
3
B A
Busca em Profundidade
Seqncia 3
B A
Busca em Profundidade
B
Seqncia
3
Busca em Profundidade
Seqncia 3
Busca em Profundidade
C
Seqncia
3
C
C
A
Busca em Profundidade
Seqncia
3
C
No
existe
adjacente
a
C.
Re>r-lo
Usar
uma
pilha
para
relembrar
os
ns
visitados.
16.
Grafos
Busca em Profundidade
G
Seqncia
3
G
G
D
A
Busca em Profundidade
I
Seqncia
3
I
G
D
A
Busca em Profundidade
I G D A
I
no
tem
adjacentes
no
visitados
Usar
uma
pilha
para
relembrar
os
ns
visitados.
16.
Grafos
Busca em Profundidade
I G D A
Re>rar
os
elementos
at
q u e
u m
d e l e s
t e n h a
Usar
uma
pilha
para
relembrar
adjacentes
no
visitados
os
ns
visitados.
16.
Grafos
Busca em Profundidade
Se
no
existem
mais,
a
b u s c a
t e r m i n o u
( S e m
Usar
uma
pilha
para
relembrar
Sucesso).
os
ns
visitados.
16.
Grafos
Operao
Pilha
Testa
A
(visita
A)
A
Testa
B
AB
Testa
F
ABF
Testa
H
ABFH
Remove
H
ABF
O
Contedo
da
pilha
indica
Remove
F
AB
o
caminho
do
incio
da
Remove
B
A
busca
at
o
n
sendo
Testa
C
AC
examinado.
Caso
a
busca
Remove
C
A
t e r m i n e
a ,
a
p i l h a
Testa
D
AD
representa
o
caminho!!!
...
ADG,ADGI,ADG,AD,A,AE,A
Remove
A
16.
Grafos
Questo chave
Questo chave
def
obtemAdjacenteNaoVisitado(ver>ce):
for
j
in
range(numVer>ces):
if
matrizAdj[ver>ce][j]
==
1
and
listaVer>ces[j].visitado
==
False:
return
j
return
-1
Fim
da
Aula
16
Busca em Largura
B C D E
F G
H
I
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
Geramos
o
primeiro
n
a d j a c e n t e .
Te s t a m o s
(Visitamos).
Marcamos.
Usar
uma
lista
para
inserir
os
ns
a
serem
visitados
Inserimos
na
Fila.
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
A
C
Seqncia
1.
Entrada
Sada
C
C
B
Geramos
o
prximo
n
a d j a c e n t e .
Te s t a m o s
(Visitamos).
Marcamos.
Usar
uma
lista
para
inserir
os
ns
a
serem
visitados
Inserimos
na
Fila.
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
A
D
Seqncia
1.
Entrada
Sada
D
D
C
B
Geramos
o
prximo
n
a d j a c e n t e .
Te s t a m o s
(Visitamos).
Marcamos.
Usar
uma
lista
para
inserir
os
ns
a
serem
visitados
Inserimos
na
Fila.
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
A
E
Seqncia
1.
Entrada
Sada
E
E
D
C
B
Geramos
o
prximo
n
a d j a c e n t e .
Te s t a m o s
(Visitamos).
Marcamos.
Usar
uma
lista
para
inserir
os
ns
a
serem
visitados
Inserimos
na
Fila.
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
E D C B
Gerar
os
ns
adjacentes
deste
n.
Visitar
(testar)
e
Usar
uma
lista
para
inserir
os
colocar
na
Fila.
ns
a
serem
visitados
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
N o
s e n d o
p o s s v e l
con>nuar.
Remove-se
o
Usar
uma
lista
para
inserir
os
prximo
da
la.
ns
a
serem
visitados
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
L o c a l i z a - s e
o s
n s
adjacentes
ao
re>rado.
Se
Usar
uma
lista
para
inserir
os
possvel
ns
a
serem
visitados
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
No
exis>ndo,
remove-se
o
prximo.
Usar
uma
lista
para
inserir
os
ns
a
serem
visitados
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
Localizam-se
os
vr>ces
adjacentes....
Usar
uma
lista
para
inserir
os
ns
a
serem
visitados
17.
Busca
em
Grafos
Idia
Central:
Usar
uma
Lista
como
estrutura
auxiliar.
G F E
G F
Entrada Sada
B A E
F
C
H
17.
Busca
em
Grafos
rvore
Geradora
Mnima
(AGM)
(Minimum
Spanning
Tree)
B C B C
D
E
D
E
17.
Busca
em
Grafos
rvore
Geradora
Mnima
(AGM)
(Minimum
Spanning
Tree)
A A
B C B C
D
E
D
E
17.
Busca
em
Grafos
rvore
Geradora
Mnima
(AGM)
(Minimum
Spanning
Tree)
A A
B C B C
D
E
D
E
17.
Busca
em
Grafos
rvore
Geradora
Mnima
(AGM)
Caso
1
A
A
B C B C
D E D E
Caso
2
?
A
A
B C B C
D
E
D
E
17.
Busca
em
Grafos
rvore
Geradora
Mnima
(AGM)
Caso
2
A
A
B C B C
D
E
D
E
17.
Busca
em
Grafos
Ordenamento
Topolgico
Lgica
de
Linguagem
de
Linguagem
de
Programao
Programao
I
Programao
II
Matriz de Adjacncias
B C
Listas de Adjacncias
A:
B
B:
C
C:
17.
Busca
em
Grafos
Grafos
Direcionados
A
def
adicionaArco(self,inicio,m):
self.matrizAdjacencias[inicio][m]
=
1
self.matrizAdjacencias[m][inicio]
=
1
B
C
Adicionando
Arcos
ao
Grafo
Direcionado
def
adicionaArco(self,inicio,m):
self.matrizAdjacencias[inicio][m]
=
1
17.
Busca
em
Grafos
Grafos
Direcionados
A
D
Qual
a
ordem
topolgica??
E G H
B
C
F
17.
Busca
em
Grafos
Grafos
Direcionados
A
D
Qual
a
ordem
topolgica??
E G H
BAEDGCFH
B
C
F
Fim
da
Aula
17
A
E
C
18.
Grafos
com
Pesos
Algoritmo
de
Warshall
B
A B C D E
A 0 0 1 0 0
D
B 1 0 0 0 1
A
C 0 0 0 0 0
E
D 0 0 0 0 1
C
E 0 0 1 0 0
18.
Grafos
com
Pesos
Algoritmo
de
Warshall
A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18.
Grafos
com
Pesos
Algoritmo
de
Warshall
Examinando
a
terceira
linha.
C
no
ligado
a
ningum.
A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18.
Grafos
com
Pesos
Algoritmo
de
Warshall
Examinando
a
quarta
linha.
Porm
ningum
ligado
a
D
D
ligado
ao
E.
A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18.
Grafos
com
Pesos
Algoritmo
de
Warshall
B
e
D
so
ligados
ao
E,
Examinando
a
l>ma
linha.
E
p o r t a n t o
t a m b m
s o
ligado
ao
C.
ligados
a
C
A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 1 0 1
E 0 0 1 0 0
18.
Grafos
com
Pesos
Algoritmo
de
Warshall
Fecho Transi>vo.
B
A B C D E
A 0 0 1 0 0
D
B 1 0 1 0 1
A
C 0 0 0 0 0
E
D 0 0 1 0 1
C
E 0 0 1 0 0
18.
Grafos
com
Pesos
Algoritmo
de
Warshall
matrizAdj[inicio][m] == 1 ? Programa76.py
B
A B C D E
A 0 0 1 0 0
D
B 1 0 1 0 1
A
C 0 0 0 0 0
E
D 0 0 1 0 1
C
E 0 0 1 0 0
18.
Grafos
com
Pesos
Distncias
Rodovirias
Fortaleza
Caucaia
16
(BR020)
27
(CE040)
25
(CE065)
Euzbio
Aquiraz
08
(CE040)
21
(ANEL
VIARIO)
30
(ANEL
VIARIO)
17
(CE060)
Itai>nga
Maranguape
Pacatuba
18.
Grafos
com
Pesos
Link
de
Fibra
>ca
Cinturo
Digital
Fortaleza
(B)
Euzbio
(C)
Aquiraz (F)
Caucaia (A)
Aquiraz (F)
Caucaia
(A)
Caminhos
muito
longos
Maracana
(D)
Itai>nga
(E)
18.
Grafos
com
Pesos
Link
de
Fibra
>ca
Cinturo
Digital
Fortaleza
(B)
Euzbio
(C)
Aquiraz (F)
Caucaia (A)
6
6
7
Aquiraz(F)
7
5
8
Caucaia
(A)
4
7
AD
E s t u d a n d o
o
t ra j e t o
C a u c a i a
Maracana,
es>ma-se
o
custo
em
4
Caucaia
(A)
milhes.
4
Maracana (D)
AD
AB
6
E s t u d a n d o
o
t ra j e t o
C a u c a i a
Caucaia
(A)
Fortaleza,
es>ma-se
o
custo
em
6
4
milhes.
Maracana
(D)
Conhecido
Desconhecido
Custos
em
milhes
de
reais.
18.
Grafos
com
Pesos
Iniciando
o
processo.
Comeando
em
Caucaia.
Lista
de
Arcos
Visitados
em
Ordem
de
Custo
Fortaleza
(B)
AB
6
Maracana (D)
AB
DB
DC
DE
6
7
Euzbio
(C)
8
Caucaia
(A)
4
12
Itai>nga
(E)
Maracana
(D)
DB
DC
DE
6
12
Itai>nga
(E)
Maracana
(D)
12
Itai>nga
(E)
Maracana
(D)
6
Euzbio
(C)
7
Prximo
elemento
de
menor
8
custo
Caucaia
(A)
4
12
Itai>nga
(E)
Maracana
(D)
8
Remove
BE
da
lista.
Caucaia
(A)
4
12
Itai>nga
(E)
Maracana
(D)
DE
6
Euzbio
(C)
7
Remove
da
lista
DE
pois
D
8
j
est
ligada
rede
de
Caucaia
(A)
bra.
4
Itai>nga
(E)
Maracana
(D)
6
Euzbio
(C)
7
Aquiraz
(F)
5
8
Caucaia
(A)
4
7
Itai>nga
(E)
Maracana
(D)
Itai>nga
(E)
Maracana
(D)
Itai>nga
(E)
Maracana
(D)
Caucaia
(A)
4
7
Itai>nga
(E)
Maracana
(D)
Caucaia
(A)
4
7
Itai>nga
(E)
Maracana
(D)
Caucaia
(A)
4
7
Itai>nga
(E)
Maracana
(D)
Caucaia
(A)
4
7
Itai>nga
(E)
Maracana
(D)
Caucaia
(A)
4
Itai>nga
(E)
Maracana
(D)
6
6
7
5
Aquiraz
(F)
Caucaia
(A)
4
Itai>nga
(E)
Maracana
(D)
A
remover
da
lista
7
4
18.
Grafos
com
Pesos
Arcos
extras
.....
Programa77.py
18.
Grafos
Direcionados
com
Pesos
O
Problema
do
menor
(melhor)
caminho.
Fortaleza
(B)
Euzbio
(C)
R$
60
R$
50
R$
50
R$
90
R$
40
R$
80
Caucaia
(A)
R$
20
R$
70
Maracana
(D)
Itai>nga
(E)
18.
Algoritmo
de
Dijkstra
Algoritmo
do
menor
caminho
(1959)
11/05/1930
-
Roterdam
Holanda
6
/08/2002
-
Nuenen
Holanda
Ins>tuies
Mathema>sch
Centrum
Eindhoven
University
of
Technology
The
University
of
Texas
at
Aus>n
(A) Caucaia
Na
estao
de
Caucaia
sabemos
que
custa
R$
50,00
para
Fortaleza
e
R$
80,00
para
Maracana
18.
Grafos
Direcionados
com
Pesos
Questo.
Qual
o
menor
custo
para
ir
de
Caucaia
(A)
at
qualquer
outra
cidade?
De\Para
(B)
Fortaleza
(C)
Eusbio
(D)
Maracana
(E)
Itai@nga
Prximo passo:???
R$
50
Regio
Conhecida
(Vr>ces
a
serem
R$
90
analisados
e
colocados
na
arvore)
R$
80
Regio
Desconhecida
Caucaia
(A)
(A) Caucaia (2) R$50,00 (Via A)* R$110,00(ViaB) R$80,00 (Via A) ???
Prximo passo:???
(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A) ???
R$ 50
R$
90
R$
20
R$
100
R$
80
Caucaia
(A)
R$
70
(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????
(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)
R$ 50
R$
90
R$
20
R$
100
R$
80
Caucaia
(A)
R$
70
(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????
(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)
R$ 50
R$
90
R$
20
R$
140
R$
40
R$
80
Caucaia
(A)
R$
70
(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????
(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)
(A) Caucaia (4) R$50,00 (Via A)* RS100,00(Via D)* R$80,00 (Via A)* R$ 140,00 (Via C)
R$ 50
R$
90
R$
20
R$
140
R$
40
R$
80
Caucaia
(A)
R$
70
(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????
(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)
(A) Caucaia (4) R$50,00 (Via A)* RS100,00(Via D)* R$80,00 (Via A)* R$140,00 (Via C)*
Ainda no acabou.....
Ainda no acabou.....
Ainda no acabou.....
(B)
70
10
R$
30
R$
10
(C)
30
(D) 20
R$
20
C
D
18.
Grafos
Direcionados
com
Pesos
(B) 70 10
(C) 30
(D) 50 20
(B) 60 10
(C) 30
(D) 50 20
(B) 60 30 10
(C) 30
(D) 50 20
(B) 60 30 10
(C) 30
(D) 50 20
NO
NO
rvore
de
SIM
Garan>a
de
Matriz
no
pesquisa
aleatoriedade
nas
chaves
Ordenada
binria
NO
rvore
Balanceada
19.2
EDs
de
Propsito
Geral
ED
Busca
Insero
Deleo
Atravessar
SIM
NO
Velocidade
cr>ca
B-Trees
SIM
Dispe-se
de
SIM
Hashing
espao
extra
para
armazenamento?
Externo
NO
Arquivos
Indexados
19.
Problemas
Intratveis
(Insolveis)
O
Caixeiro
Viajante:
Percorrer
todas
as
cidades
e
voltar
ao
ponto
de
origem
minimizando
o
percurso.
Fortaleza
(B)
Euzbio
(C)
Caucaia (A)
N N!
6
720
10
3.628.800
20
2,43
x
1018
30
2,65
x
1032
40
8,15
x
1047
50
3,04
x
1064
19.
Problemas
Intratveis
(Insolveis)
NP - Completo
Desenvolve-se
uma
funo
aproxima>va
(ou
no)
que
nos
d
uma
es>ma>va
da
distncia
do
n
atual
ao
des>no.O
Algoritmo
que
sempre
escolhe
a
melhor
opo
chamado
de
algoritmo
guloso
e
esta
busca
chamada
de
busca
gulosa.
19.
Heurs>cas
(B)
(C)
f(B)
=
10
(D)
(E)
(F)
f(C)=15
g(B)
=
5
g(C)
=
6
h(B)
=
15
h(B)
=
21
Programa
A
Parte
1
<instrues
1>
Parte
2
<instrues
2>
Parte
3
<Instrues
3>
19.
Programao
Concorrente
Threads
Threads em Python
Passo 1
Import
thread
19.
Programao
Concorrente
Passo 2
Passo 3
Programa79.py
19.
Programao
Concorrente
....
....
....
19.
Programao
Concorrente
obj
=
X()
....
....
....
19.
Programao
Concorrente
Programa82.py
19.
Programao
Concorrente
Cliente
A:
Servidor
..........
Thread
A
Cliente
B:
Thread
B
...........
19.
Programao
Concorrente
import
socket
Cliente
A:
#
create
Internet
TCP
socket
16
s
=
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Socket
s.connect((host,
port))
s.send(k)
Resposta
=
s.recv(n)
s.close()
19.
Programao
Concorrente
Import
thread
Servidor
Import
socket
O
desao
seu.
Fim
da
Aula
19
20.
Programao
Grca
em
Python
20.
Programao
Grca
em
Python
Usando o Tkinter
Usando o Tkinter
Import
Tkinter
Tkinter._test()
from
Tkinter
import
*
root
=
Tk()
root.mainloop()
20.
Programao
Grca
em
Python
Programa83.py
20.
Programao
Grca
em
Python
widgets
Containers
Canvas
Frames
20.
Programao
Grca
em
Python
Criando um Frame
minhaCesta
=
Frame(pai)
20.
Programao
Grca
em
Python
Gerenciadores de Geometria
raiz.mainloop()
Loop
principal
20.
Programao
Grca
em
Python
E os widgets?
Dene
propriedades
botao
=
Bu|on(cesta)
do
widget
Criar
widget
botao[text]=
Ola
rapaziada
botao[background]=
blue
Aciona
gerenciador
de
botao.pack()
layout
raiz.mainloop()
Loop
principal
Programa84.py
20.
Programao
Grca
em
Python
Aplicao
Classe
ou
Classe
aplicao?
Programa85.py
20.
Programao
Grca
em
Python
Ml>plos
botes
e
formas
de
manipul-los.
class
Aplicacao:
def
__init__(self,
pai):
self.cesta
=
Frame(pai)
self.cesta.pack()
self.botao1
=
Buaon(self.cesta)
self.botao1["text"]
=
"Alo
rapaziada!"
self.botao1.pack()
self.botao1.pack(side=LEFT)
self.botao2
=
Buaon(self.cesta)
self.botao2.congure(text="texto
bobo
qualquer")
self.botao2.pack()
self.botao2.pack(side=LEFT)
Programa86.py
20.
Programao
Grca
em
Python
Ml>plos
botes
e
formas
de
manipul-los.
self.botao3
=
Buaon(self.cesta)
self.botao3.congure(text="Vai
entrar
nessa?")
self.botao3.pack()
self.botao3.pack(side=LEFT)
self.botao4
=
Buaon(self.cesta,text="Adeus!")
self.botao4.pack()
self.botao4.pack(side=LEFT)
raiz
=
Tk()
ap
=
Aplicacao(raiz)
raiz.mainloop()
Programa86.py
20.
Programao
Grca
em
Python
Bindings:
Conectando
eventos
a
funes.
Event Listener
widget.bind(<nome_do_<po_de_evento>, <funo_que_encaminha_eventos>)
Programa87.py
20.
Programao
Grca
em
Python
Eventos
do
Teclado
Etapas:
1. Obter
o
foco
para
o
widget
que
vai
tratar
o
evento
2. Criar
um
event
biding
entre
o
evento
sobre
aquele
widget
e
uma
funo
especca
Programa89.py
20.
Programao
Grca
em
Python
Lista
de
Eventos
20.
Programao
Grca
em
Python
Command
Binding
self.bu|on1 = Bu|on(self.myContainer1,command=self.bu|on1Click)
Vantagem:
Trata
eventos
como
o
Bu|onPress
e
Bu|on
Release
e
permite
o
uso
da
barra
De
espao
da
mesma
forma
que
o
enter
no
programa
anterior.
Programa90.py
20.
Programao
Grca
em
Python
Que
widgets?