Академический Документы
Профессиональный Документы
Культура Документы
Camilo Bernal
19 de febrero de 2016
ndice
1.
Introduccin
2.
Anlisis preliminar
Se requiere realizar un programa que permite realizar las tareas ms comunes en una
biblioteca. Las tareas esenciales son: Ingresar nuevos libros, Borrar libros, Ingresar nuevos
socios, Borrar socios, Prestar y recibir libros. Inicialmente se representarn los algoritmos
correspondientes a estas tareas como diagramas de flujo.
Se recomienda hacer un trabajo de programacin incremental, esto es ir realizando pequeos cambios al programa y volver a llamar al intrprete para tareas de depuracin, a
fin de que cuando se concluya la tarea no se tenga una cantidad desconocida de errores.
Una de las mayores frustraciones que en lo personal he tenido realizando programas, se
relaciona con el bloqueo mental ante una cantidad excesiva de cdigo y excepciones. Lo
que recomiendo es realizar un diseo previo y ayudarse con diagramas de flujo. Antes de
escribir una sola lnea de cdigo, es muy conveniente tener una idea bsica sobre cmo
resolver el problema; este pequeo truco ahorrar muchas horas de trabajo y mucha
frustracin.
3.
3.1.
Algoritmos Bsicos
Ingresar libro
Figura 1: Algoritmo - Ingresar libro
INICIO
NO
Nuevo
libro?
S
Crear libro
Actualizar lista de
l_disponibles
FIN
Fuente: Elaboracin propia
3.2.
Borrar libro
Figura 2: Algoritmo - Borrar libro
INICIO
NO
Existe
el libro?
S
NO
Est
disponible?
S
Eliminar libro
Actualizar lista de
l_disponibles
FIN
Fuente: Elaboracin propia
3.3.
Ingresar cliente
Figura 3: Algoritmo - Ingresar Cliente
INICIO
NO
Nuevo
cliente?
S
Crear cliente
Actualizar lista de
c_sin_libros
FIN
Fuente: Elaboracin propia
3.4.
Borrar cliente
Figura 4: Algoritmo - Borrar Cliente
INICIO
NO
Existe
cliente?
S
NO
Cliente
sin
libros?
S
Eliminar cliente
Actualizar lista de
c_sin_libros
FIN
Fuente: Elaboracin propia
3.5.
Prestar libro
Figura 5: Algoritmo - Prestar libro
INICIO
NO
Existe
el libro?
S
NO
Existe el
cliente?
S
El libro
est
disponible?
NO
S
El cliente
tiene menos
de 3 libros?
NO
S
Registrar cliente
en libro
Registrar libro en
cliente
Actualizar lista de
l_disponibles
Actualizar lista de
l_prestados
Actualizar lista de
c_sin_libros
Actualizar lista de
c_con_libros
FIN
Fuente: Elaboracin propia
8
3.6.
Recibir libro
Figura 6: Algoritmo - Recibir libro
INICIO
NO
Existe
el libro?
S
NO
Existe el
cliente?
S
NO
El libro est
prestado a
ese cliente?
S
Quitar cliente en
libro
Quitar libro en
cliente
Actualizar lista de
l_disponibles
Actualizar lista de
l_prestados
Actualizar lista de
c_sin_libros
Actualizar lista de
c_con_libros
FIN
Fuente: Elaboracin propia
4.
Cdigo python
4.1.
Objeto Libro
class Libro():
"""Objeto que representa un libro"""
def __init__(self, titulo, autor, id):
self.titulo = titulo
self.autor = autor
self.id = id
self.prestado = None
def __str__(self):
msg = "\nTitulo: "+str(self.titulo)+"\nautor: "+str(self.autor)\
+"\nid: "+str(self.id)+"\nPrestado: "+str(self.prestado)+"\n"
return msg
4.2.
Objeto Cliente
class Cliente():
"""Objeto que representa un cliente"""
def __init__(self, nombre, id):
self.nombre = nombre
self.id = id
10
self.libros = list()
def __str__(self):
msg = "\nNombre: "+str(self.nombre)+"\nid: "+str(self.id)\
+"\nlibros: "+str(self.libros)+"\n"
return msg
4.3.
Objeto Bibliotecario
class Bibliotecario(Libro, Cliente):
"""Objeto que representa un bibliotecario"""
def __init__(self):
self.libros = dict()
self.clientes = dict()
self.l_disponibles = list()
self.l_prestados = list()
self.c_sin_libros = list()
self.c_con_libros = list()
def ingresar_libro(self, titulo, autor, id_libro):
"""Metodo que define como ingresar un libro"""
while True:
#Nuevo libro?
if self.libros.__contains__(id_libro):
print("\nLibro ya existe\n")
break
#Crear libro
n_libro = Libro(titulo, autor, id_libro)
self.libros.__setitem__(n_libro.id, n_libro)
self.l_disponibles.append(n_libro.id)
break
def borrar_libro(self, id_libro):
"""Metodo que define como borrar un libro"""
while True:
#Existe el libro?
if not self.libros.__contains__(id_libro):
print("\nEl libro no existe\n")
11
break
#Esta disponible?
if not self.l_disponibles.__contains__(id_libro):
print("\nEl libro no esta disponible\n")
break
#Eliminar libro
self.libros.__delitem__(id_libro)
self.l_disponibles.remove(id_libro)
break
def ingresar_cliente(self, nombre, id_cliente):
"""Metodo que define como ingresar un nuevo cliente"""
while True:
#Nuevo cliente?
if self.clientes.__contains__(id_cliente):
print("\nCliente ya existe\n")
break
#Crear cliente
n_cliente = Cliente(nombre, id_cliente)
self.clientes.__setitem__(n_cliente.id, n_cliente)
self.c_sin_libros.append(n_cliente.id)
break
def borrar_cliente(self, id_cliente):
"""Metodo que define como borrar un cliente"""
while True:
#Existe cliente?
if not self.clientes.__contains__(id_cliente):
print("\nEl cliente no existe\n")
break
#Cliente sin libros?
if not self.c_sin_libros.__contains__(id_cliente):
print("\nEl cliente tiene libros\n")
break
#Eliminar cliente
self.clientes.__delitem__(id_cliente)
self.c_sin_libros.remove(id_cliente)
12
break
def prestar_libro(self, id_cliente, id_libro):
"""Metodo que define como prestar un libro"""
while True:
#Existe el libro?
if not self.libros.__contains__(id_libro):
print("\nNo existe el libro\n")
break
#Existe el cliente?
if not self.clientes.__contains__(id_cliente):
print("\nNo existe el cliente\n")
break
#El libro esta disponible?
if not self.l_disponibles.__contains__(id_libro):
print("\nEl libro no esta disponible\n")
break
#El cliente tiene menos de tres libros?
if self.clientes.__getitem__(id_cliente).libros.__len__() > 2:
print("\nEl cliente ya tiene tres libros\n")
break
#Registrar cliente en libro
el_libro = self.libros.pop(id_libro)
el_libro.prestado = id_cliente
self.libros.__setitem__(id_libro, el_libro)
#Registrar libro en cliente
el_cliente = self.clientes.pop(id_cliente)
el_cliente.libros.append(id_libro)
self.clientes.__setitem__(id_cliente, el_cliente)
self.l_disponibles.remove(id_libro)
self.l_prestados.append(id_libro)
#Actualizar lista c_sin_libros
if self.c_sin_libros.__contains__(id_cliente):
self.c_sin_libros.remove(id_cliente)
#Actualizar lista c_con_libros
if not self.c_con_libros.__contains__(id_cliente):
13
self.c_con_libros.append(id_cliente)
break
def recibir_libro(self, id_cliente, id_libro):
"""Metodo que define como recibir un libro"""
while True:
#Existe el libro?
if not self.libros.__contains__(id_libro):
print("\nNo existe el libro\n")
break
#Existe el cliente?
if not self.clientes.__contains__(id_cliente):
print("\nNo existe el cliente\n")
break
#El libro esta prestado al cliente?
el_libro = self.libros.pop(id_libro)
if not el_libro.prestado == id_cliente:
print("\nEl libro no esta prestado a este cliente\n")
break
el_libro.prestado = None
el_cliente = self.clientes.pop(id_cliente)
el_cliente.libros.remove(id_libro)
#Actulizar libros y clientes
self.libros.__setitem__(id_libro, el_libro)
self.clientes.__setitem__(id_cliente, el_cliente)
self.l_disponibles.append(id_libro)
self.l_prestados.remove(id_libro)
#Actualizar lista c_sin_libros
if el_cliente.libros.__len__() < 1:
self.c_sin_libros.append(id_cliente)
#Actualizar lista c_con_libros
if el_cliente.libros.__len__() < 1:
self.c_con_libros.remove(id_cliente)
break
def __str__(self):
msg = "\nLibros disponibles: " + str(self.l_disponibles)\
14
15
5.
Conclusiones
Antes de acometer la escritura de cdigo, conviene realizar un anlisis bsico, un
diseo preliminar y la escritura del pseudocdigo, con lo cual se puede aumentar
la productividad y reducir la frustracin en el proceso de depuracin.
Python 3 es un estupendo lenguaje para aprender a programar, y si a esto se le suma
un cdigo convenientemente distribuido junto con los comentarios pertinentes, es
posible disminuir la probabilidad de bloqueo mental que sufre nuestro cerebro
ante objetos abstractos y poco intuitivos.
La programacin incremental consiste en escribir unas pocas lneas y ejecutar pruebas constantes sobre ellas. Esto facilita enormemente las tareas posteriores de depuracin y evita sorpresas al final.
16
6.
Lecturas recomendadas
17