Desarrollo de Un Programa en Python 3 Para Gestionar Una Biblioteca
-
Upload
camilo-bernal -
Category
Documents
-
view
14 -
download
0
description
Transcript of Desarrollo de Un Programa en Python 3 Para Gestionar Una Biblioteca
-
Desarrollo de un programa en Pythonpara gestionar una biblioteca
(Versin 0.1)
Camilo Bernal
19 de febrero de 2016
-
ndice
I
-
1. Introduccin
Lo primero que se debe aclarar es que no soy un experto en programacin ni muchomenos. 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 manejartareas relativas a socios y libros. El documento presenta un ejemplo de resolucin delproblema partiendo desde un diseo muy bsico y concluyendo con un programa enlenguaje Python 3, que si bien no es perfecto, al menos funciona como prototipo.
1
-
2. Anlisis preliminar
Se requiere realizar un programa que permite realizar las tareas ms comunes en unabiblioteca. Las tareas esenciales son: Ingresar nuevos libros, Borrar libros, Ingresar nuevossocios, Borrar socios, Prestar y recibir libros. Inicialmente se representarn los algoritmoscorrespondientes a estas tareas como diagramas de flujo.
Se recomienda hacer un trabajo de programacin incremental, esto es ir realizando pe-queos cambios al programa y volver a llamar al intrprete para tareas de depuracin, afin 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, serelaciona con el bloqueo mental ante una cantidad excesiva de cdigo y excepciones. Loque recomiendo es realizar un diseo previo y ayudarse con diagramas de flujo. Antes deescribir una sola lnea de cdigo, es muy conveniente tener una idea bsica sobre cmoresolver el problema; este pequeo truco ahorrar muchas horas de trabajo y muchafrustracin.
2
-
3. Algoritmos Bsicos
3.1. Ingresar libro
Figura 1: Algoritmo - Ingresar libro
INICIO
Nuevolibro?
Crear libro
Actualizar lista de l_disponibles
FIN
S
NONO
Fuente: Elaboracin propia
3
-
3.2. Borrar libro
Figura 2: Algoritmo - Borrar libro
INICIO
Existe el libro?
Eliminar libro
Actualizar lista de l_disponibles
FIN
S
NONO
Est disponible?
S
NO
Fuente: Elaboracin propia
4
-
3.3. Ingresar cliente
Figura 3: Algoritmo - Ingresar Cliente
INICIO
Nuevocliente?
Crear cliente
Actualizar lista de c_sin_libros
FIN
S
NONO
Fuente: Elaboracin propia
5
-
3.4. Borrar cliente
Figura 4: Algoritmo - Borrar Cliente
INICIO
Existecliente?
Eliminar cliente
Actualizar lista de c_sin_libros
FIN
S
NONO
Cliente sin
libros?
NO
S
Fuente: Elaboracin propia
6
-
7
-
3.5. Prestar libro
Figura 5: Algoritmo - Prestar libro
INICIO
Existe el libro?
Existe el cliente?
El libro est
disponible?
El cliente tiene menos de 3 libros?
Registrar cliente en libro
Registrar libro en cliente
Actualizar lista de l_disponibles
Actualizar lista de c_sin_libros
Actualizar lista de c_con_libros
Actualizar lista de l_prestados
FIN
S
S
S
S
NO
NO
NO
NO
NO
Fuente: Elaboracin propia
8
-
3.6. Recibir libro
Figura 6: Algoritmo - Recibir libro
INICIO
Existe el libro?
Existe el cliente?
El libro est prestado a
ese cliente?
Quitar cliente en libro
Quitar libro en cliente
Actualizar lista de l_disponibles
Actualizar lista de c_sin_libros
Actualizar lista de c_con_libros
Actualizar lista de l_prestados
FIN
S
S
S
NO
NO
NO
NO
Fuente: Elaboracin propia
9
-
4. Cdigo python
Creo que no es intil repetirlo: El cdigo se escribe NICAMENTE cuando ya se tengaalguna idea de cmo resolver el problema y se haya planteado la solucin con algunaclaridad. Lanzarse a escribir cdigo de manera irreflexiva es la receta perfecta para lafrustracin: ojal no caigan en ese error.
Se decidi construir tres objetos: Libro, Cliente y Bibliotecario. Este ltimo objeto es elque 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 deerrores, ingenuidades e inconsistencias, pero incluso de eso podemos aprender, y aprenderes 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 = tituloself.autor = autorself.id = idself.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 = nombreself.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 libron_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 libroself.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 clienten_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 clienteself.clientes.__delitem__(id_cliente)self.c_sin_libros.remove(id_cliente)
12
-
breakdef 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 libroel_libro = self.libros.pop(id_libro)el_libro.prestado = id_clienteself.libros.__setitem__(id_libro, el_libro)#Registrar libro en clienteel_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_librosif self.c_sin_libros.__contains__(id_cliente):
self.c_sin_libros.remove(id_cliente)#Actualizar lista c_con_librosif 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 = Noneel_cliente = self.clientes.pop(id_cliente)el_cliente.libros.remove(id_libro)#Actulizar libros y clientesself.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_librosif el_cliente.libros.__len__() < 1:
self.c_sin_libros.append(id_cliente)#Actualizar lista c_con_librosif 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, undiseo preliminar y la escritura del pseudocdigo, con lo cual se puede aumentarla 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 sumaun cdigo convenientemente distribuido junto con los comentarios pertinentes, esposible disminuir la probabilidad de bloqueo mental que sufre nuestro cerebroante objetos abstractos y poco intuitivos.
La programacin incremental consiste en escribir unas pocas lneas y ejecutar prue-bas constantes sobre ellas. Esto facilita enormemente las tareas posteriores de de-puracin y evita sorpresas al final.
16
-
6. Lecturas recomendadas
Hay varios buenos manuales en internet. En lo personal recomiendo que busquen engoogle 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
1 Introduccin2 Anlisis preliminar3 Algoritmos Bsicos3.1 Ingresar libro3.2 Borrar libro3.3 Ingresar cliente3.4 Borrar cliente3.5 Prestar libro3.6 Recibir libro
4 Cdigo python4.1 Objeto Libro4.2 Objeto Cliente4.3 Objeto Bibliotecario
5 Conclusiones6 Lecturas recomendadas