Operações sobre Coleções de Objetos
A classe Estudante a seguir será usada nesta aula...
from datetime import date
class Estudante:
def __init__(self,nome,matricula,anoNascimento):
self.nome = nome
# a matrícula será a chave
self.matricula = matricula
self.anoNascimento = anoNascimento
def idade(self):
anoAtual = date.today().year
idade = anoAtual - self.anoNascimento
return idade
CRUD
CRUD
São as operações típicas de manipulação de dados
Busca
Em muitas situações, é normal ter de realizar uma busca antes de realizar a operação de CRUD
Operando sobre coleções de objetos
Para cada uma das operações do CRUD e, adicionalmemente, para a busca, vamos projetar algoritmos e programas para realizá-las
Coleções Típicas de Objetos
É normal encontrarmos em sistemas de informação três coleções típicas de objetos:
BUSCA (SEARCH)
Busca: Algoritmo Ingênuo
Busca: Algoritmo Melhorado
Busca: Programa em Python com uma lista não ordenada
# retorne o índice do objeto na lista
# ou -1 se não encontrar
def buscar(lista, chave):
# lista não ordenada pede uma busca linear
for i in range(len(lista)):
if (lista[i].matricula == chave):
return i
return -1
# Programa principal
estudantes = []
# Suponha que a lista estudantes já foi preenchida
chave = int(input("Entre com a matrícula do estudante: "))
indice = buscar(estudantes, chave)
if (indice > -1):
print("Achei o estudante na posição %d." % indice)
else:
print("Não há estudante com esta matrícula!")
Busca: Programa em Python com uma lista ordenada
def buscaBinaria(lista, chave, inicio, final):
while inicio <= final:
meio = (inicio + final)//2
if lista[meio].matricula == chave:
return meio
elif lista[meio].matricula < chave:
inicio = meio + 1
else:
final = meio - 1
return -1
def buscar(lista, chave):
# lista ordenada pede uma busca binária
return buscaBinaria(lista, chave, 0, len(lista)-1)
estudantes = []
# Suponha que a lista estudantes já foi preenchida
chave = int(input("Entre com a matrícula do estudante: "))
indice = buscar(estudantes, chave)
if (indice > -1):
print("Achei o estudante na posição %d." % indice)
else:
print("Não há estudante com esta matrícula!")
Busca: Programa em Python com um dicionário
# retorne o objeto no dicionário
# ou None se não encontrar
def buscar(dicionario, chave):
return dicionario.get(chave)
# Programa principal
estudantes = {}
# Suponha que o dicionário estudantes já foi preenchido
chave = int(input("Entre com a matrícula do estudante: "))
elemento = buscar(estudantes, chave)
if (elemento):
print("Achei o estudante pela matrícula.")
else:
print("Não há estudante com esta matrícula!")
CADASTRO (CREATE)
Cadastro: Algoritmo Ingênuo
Cadastro: Algoritmo Melhorado
Cadastro: Programa em Python com uma lista não ordenada
def cadastrar(lista, nome, matricula, anoNascimento):
if buscar(lista, matricula) == -1:
estudante = Estudante(nome,matricula,anoNascimento)
lista.append(estudante)
return True
else:
return False
# Programa principal
estudantes = []
if cadastrar(estudantes, 'Pedro', 123, 1995):
print('Pedro cadastrado.')
if cadastrar(estudantes, 'Paulo', 234, 1998):
print('Paulo cadastrado.')
if cadastrar(estudantes, 'Lucas', 123, 1999):
print('Lucas cadastrado.')
else:
print('Erro no cadastro de Lucas. Matrícula existente.')
Cadastro: Programa em Python com uma lista ordenada
def cadastrar(lista, nome, matricula, anoNascimento):
if buscar(lista, matricula) == -1:
estudante = Estudante(nome, matricula, anoNascimento)
i = 0
while (i < len(lista)):
if matricula < lista[i].matricula:
break
i += 1
lista.insert(i, estudante)
return True
else:
return False
# Programa principal
estudantes = []
if cadastrar(estudantes, 'Pedro', 123, 1995):
print('Pedro cadastrado.')
if cadastrar(estudantes, 'Paulo', 234, 1998):
print('Paulo cadastrado.')
if cadastrar(estudantes, 'Madalena', 197, 1998):
print('Madalena cadastrada.')
if cadastrar(estudantes, 'Lucas', 123, 1999):
print('Lucas cadastrado.')
else:
print('Erro no cadastro de Lucas. Matrícula existente.')
Cadastro: Programa em Python com um dicionário
def cadastrar(dicionario, nome, matricula, anoNascimento):
if dicionario.get(matricula):
return False
estudante = Estudante(nome, matricula, anoNascimento)
dicionario[matricula] = estudante
return True
# Programa principal
estudantes = {}
if cadastrar(estudantes, 'Pedro', 123, 1995):
print('Pedro cadastrado.')
if cadastrar(estudantes, 'Paulo', 234, 1998):
print('Paulo cadastrado.')
if cadastrar(estudantes, 'Lucas', 123, 1999):
print('Lucas cadastrado.')
else:
print('Erro no cadastro de Lucas. Matrícula existente.')
CONSULTA (RETRIEVE)
Consulta: Algoritmo Ingênuo
Consulta: Algoritmo Melhorado
Consulta: Programa em Python com uma lista não ordenada ou com uma lista ordenada
def mostrarEstudante(estudante):
print("Dados do estudante: ")
print("Matrícula: %d" % estudante.matricula)
print("Nome: %s" % estudante.nome)
print("Nascimento: %d" % estudante.anoNascimento)
print("Idade: %d\n\n" % estudante.idade())
def consultar(lista, chave):
indice = buscar(lista, chave)
if indice != -1:
mostrarEstudante(lista[indice])
else:
print("Matrícula %d não encontrada.\n\n" % chave)
# Programa principal
estudantes = []
cadastrar(estudantes, 'Pedro', 123, 1995)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
consultar(estudantes, 345)
consultar(estudantes, 111)
Consulta: Programa em Python com um dicionário
def mostrarEstudante(estudante):
print("Dados do estudante: ")
print("Matrícula: %d" % estudante.matricula)
print("Nome: %s" % estudante.nome)
print("Nascimento: %d" % estudante.anoNascimento)
print("Idade: %d\n\n" % estudante.idade())
def consultar(dicionario, chave):
estudante = buscar(dicionario, chave)
if estudante:
mostrarEstudante(estudante)
else:
print("Matrícula %d não encontrada.\n\n" % chave)
# Programa principal
estudantes = {}
cadastrar(estudantes, 'Pedro', 123, 1995)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
consultar(estudantes, 345)
consultar(estudantes, 111)
ALTERAÇÃO (UPDATE)
Alteração: Algoritmo Ingênuo
Alteração: Algoritmo Melhorado
Alteração: Programa em Python com uma lista não ordenada ou com uma lista ordenada
def alterar(lista, chave, nome, matricula, anoNascimento):
indice = buscar(lista, chave)
if indice != -1:
estudante = lista[indice]
estudante.nome = nome
estudante.matricula = matricula
estudante.anoNascimento = anoNascimento
print("Alteração realizada.")
mostrarEstudante(lista[indice]) // opcional
else:
print("Matrícula %d não encontrada.\n\n" % chave)
# Programa principal
estudantes = []
cadastrar(estudantes, 'Pedro', 123, 1992)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
consultar(estudantes, 123)
alterar(estudantes, 123, 'Pedro Santos', 101, 1995)
alterar(estudantes, 200, 'Paulo Silva', 102, 1998)
Alteração: Programa em Python com um dicionário
def alterar(dicionario,chave,nome,matricula,anoNascimento):
estudante = buscar(dicionario, chave)
if estudante:
if chave != matricula:
estudante = dicionario.pop(chave)
dicionario[matricula] = estudante
estudante.nome = nome
estudante.matricula = matricula
estudante.anoNascimento = anoNascimento
print("Alteração realizada.")
mostrarEstudante(dicionario[matricula])
else:
print("Matrícula %d não encontrada.\n\n" % chave)
# Programa principal
estudantes = {}
cadastrar(estudantes, 'Pedro', 123, 1992)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
consultar(estudantes, 123)
alterar(estudantes, 123, 'Pedro Santos', 101, 1995)
alterar(estudantes, 200, 'Paulo Silva', 102, 1998)
REMOÇÃO (DELETE)
Remoção: Algoritmo Ingênuo
Remoção: Algoritmo Melhorado
Remoção: Programa em Python com uma lista não ordenada ou com uma lista ordenada
def remover(lista, chave):
indice = buscar(lista, chave)
if indice != -1:
lista.pop(indice)
print("Remoção realizada.\n\n")
else:
print("Erro na remoção: Matrícula %d não encontrada.\n\n" % chave)
# Programa principal
estudantes = []
cadastrar(estudantes, 'Pedro', 123, 1992)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
consultar(estudantes, 123)
remover(estudantes, 123)
consultar(estudantes, 123)
remover(estudantes, 200)
Remoção: Programa em Python com um dicionário
def remover(dicionario, chave):
estudante = buscar(dicionario, chave)
if estudante:
dicionario.pop(chave)
print("Remoção realizada.\n\n")
else:
print("Erro na remoção: Matrícula %d não encontrada.\n\n" % chave)
# Programa principal
estudantes = {}
cadastrar(estudantes, 'Pedro', 123, 1992)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
consultar(estudantes, 123)
remover(estudantes, 123)
consultar(estudantes, 123)
remover(estudantes, 200)
ORDENAÇÃO DE COLEÇÕES DE OBJETOS
Ordenação de uma Lista de Objetos
tamanho = len(lista)
for i in range(0, tamanho-1):
min = i
for j in range(i+1, tamanho):
//Encontra o menor
if (lista[j] < lista [min]):
min = j
lista[i], lista[min] = lista[min], lista[i]
Relembrando o Selection Sort ou Ordenação por Seleção
Dada uma lista chamada lista e seja tamanho o tamanho da lista...
Ordenação por Seleção: Programa em Python que ordena por matrícula uma lista não ordenada
def selectionSortPorMatricula(lista):
tamanho = len(lista)
for i in range(0, tamanho-1):
min = i
for j in range(i+1, tamanho):
# Encontra o menor
if (lista[j].matricula < lista[min].matricula):
min = j
lista[i], lista[min] = lista[min], lista[i]
# Programa principal
estudantes = []
cadastrar(estudantes, 'Marcos', 789, 1997)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
cadastrar(estudantes, 'Lucas', 456, 1999)
cadastrar(estudantes, 'Pedro', 123, 1995)
cadastrar(estudantes, 'João', 567, 2001)
for estudante in estudantes:
mostrarEstudante(estudante)
print("\n\nORDENANDO POR MATRÍCULA: \n")
selectionSortPorMatricula(estudantes)
for estudante in estudantes:
mostrarEstudante(estudante)
Ordenação por Seleção: Programa em Python que ordena por nome uma lista não ordenada
def selectionSortPorNome(lista):
tamanho = len(lista)
for i in range(0, tamanho-1):
min = i
for j in range(i+1, tamanho):
# Encontra o menor
if (lista[j].nome < lista[min].nome):
min = j
lista[i], lista[min] = lista[min], lista[i]
# Programa principal
estudantes = []
cadastrar(estudantes, 'Marcos', 789, 1997)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
cadastrar(estudantes, 'Lucas', 456, 1999)
cadastrar(estudantes, 'Pedro', 123, 1995)
cadastrar(estudantes, 'João', 567, 2001)
for estudante in estudantes:
mostrarEstudante(estudante)
print("\n\nORDENANDO POR MATRÍCULA: \n")
selectionSortPorNome(estudantes)
for estudante in estudantes:
mostrarEstudante(estudante)
Ordenação por Seleção: Programa em Python que apresenta um dicionário ordenado por matrícula
def selectionSortPorMatricula(lista):
tamanho = len(lista)
for i in range(0, tamanho-1):
min = i
for j in range(i+1, tamanho):
# Encontra o menor
if (lista[j] < lista[min]):
min = j
lista[i], lista[min] = lista[min], lista[i]
def retornarChavesOrdenadasPorMatricula(dicionario):
chaves = list(dicionario.keys())
selectionSortPorMatricula(chaves)
return chaves
# Programa principal
estudantes = {}
cadastrar(estudantes, 'Marcos', 789, 1997)
cadastrar(estudantes, 'Madalena', 345, 1987)
cadastrar(estudantes, 'Paulo', 234, 1998)
cadastrar(estudantes, 'Lucas', 456, 1999)
cadastrar(estudantes, 'Pedro', 123, 1995)
cadastrar(estudantes, 'João', 567, 2001)
for chave in estudantes:
mostrarEstudante(estudantes[chave])
print("\n\nAPRESENTANDO OS ESTUDANTES ORDENADOS POR MATRÍCULA:\n")
chaves = retornarChavesOrdenadasPorMatricula(estudantes)
for chave in chaves:
mostrarEstudante(estudantes[chave])