Está en la página 1de 19

Desarrollo de un programa en Python

para gestionar una biblioteca


(Versin 0.1)

Camilo Bernal
19 de febrero de 2016

ndice

1.

Introduccin

Lo primero que se debe aclarar es que no soy un experto en programacin ni mucho


menos. Si eres un aprendiz (como yo) este manual puede ayudarte. Si eres un experto,
quizs slo te sirva para aprender cmo "no hacer las cosas como un aprendiz".
Se presenta un problema de gestin de una biblioteca, en la cual se deben manejar
tareas relativas a socios y libros. El documento presenta un ejemplo de resolucin del
problema partiendo desde un diseo muy bsico y concluyendo con un programa en
lenguaje Python 3, que si bien no es perfecto, al menos funciona como prototipo.

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

Creo que no es intil repetirlo: El cdigo se escribe NICAMENTE cuando ya se tenga


alguna idea de cmo resolver el problema y se haya planteado la solucin con alguna
claridad. Lanzarse a escribir cdigo de manera irreflexiva es la receta perfecta para la
frustracin: ojal no caigan en ese error.
Se decidi construir tres objetos: Libro, Cliente y Bibliotecario. Este ltimo objeto es el
que se encarga de administrar las relaciones entre los clientes y la biblioteca.
A continuacin se presenta una propuesta del cdigo en Python 3, tal vez est plagada de
errores, ingenuidades e inconsistencias, pero incluso de eso podemos aprender, y aprender
es el nico objetivo de este documento.

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

+"\nLibros prestados: " + str(self.l_prestados)\


+"\nC. sin libros: " + str(self.c_sin_libros)\
+"\nC. con libros: " + str(self.c_con_libros)+"\n"
return msg

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

Hay varios buenos manuales en internet. En lo personal recomiendo que busquen en


google los ficheros PDF con los siguientes ttulos:
1. "Aprenda a Pensar Como un Programador con Python", de Allen Downey
2. "Inmersin en Python 3", de Mark Pilgrim
3. "El tutorial de Python", de Guido van Rossum
4. "Python Reference Manual", de Guido van Rossum

17

También podría gustarte