Desarrollo de Un Programa en Python 3 Para Gestionar Una Biblioteca

download Desarrollo de Un Programa en Python 3 Para Gestionar Una Biblioteca

of 19

description

Se presenta un prototipo para manejar una biblioteca, escrito en python 3

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