Desarrollo de Un Programa en Python Para Gestionar Una Biblioteca

Embed Size (px)

Citation preview

  • Desarrollo de un programa en Pythonpara gestionar una biblioteca

    Camilo Bernal

    19 de agosto de 2014

  • ndice1. Introduccin 1

    2. Anlisis preliminar 2

    3. Diseo bsico 33.1. Mdulo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.2. Mdulo libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.3. Mdulo socio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.4. Mdulo biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.5. Mdulo validaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.6. Mdulo menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    4. Pseudo-cdigo 64.1. Mdulo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.2. Mdulo libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.3. Mdulo socio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.4. Mdulo biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74.5. Mdulo validaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94.6. Mdulo menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    5. Cdigo Python 135.1. Mdulo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135.2. Mdulo libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135.3. Mdulo socio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.4. Mdulo biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155.5. Mdulo validaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235.6. Mdulo menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    6. Conclusiones 31

    7. Lecturas recomendadas 32

    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, que si bien no es perfecto, al menos funciona como prototipo.

    1

  • 2. Anlisis preliminar

    Se requiere construir un sistema para gestionar una biblioteca. En la biblioteca hay librosque se pueden prestar a los diferentes socios. Los socios se pueden afiliar a la bibliotecay luego solicitar hasta tres libros, los cuales pueden conservar en su poder hasta por10 das. Despus de los 10 das, el socio se considera moroso y se le aplican tres dasde sancin por cada da de retraso. La sancin consiste en la imposibilidad de solicitarnuevos libros hasta tanto no la cumpla. Un socio afiliado puede solicitar la desafiliacina la biblioteca. Se pueden ingresar nuevos libros a los ya existentes en la biblioteca.

    La biblioteca inicialmente no tiene ningn libro, as que los ir adquiriendo por dona-ciones o compras. Se plantea la posibilidad de iniciar prestando un nico libro y simularel paso del tiempo a travs de una variable aleatoria. Cuando el programa funcione, seampliar para el manejo de mltiples libros.

    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 escribir todo el pseudocdigo. Antes deescribir una sola lnea de cdigo, es muy conveniente tener perfectamente claro cmoresolver el problema; este pequeo truco ahorrar muchas horas de trabajo y muchafrustracin.

    2

  • 3. Diseo bsico

    El programa se construir en mdulos, a fin de evitar que los ficheros individuales tenganuna cantidad excesiva de cdigo.

    Se construirn 6 mdulos: , , , , y. En el mdulo se llama a los dems objetos que constituyen el pro-grama. El mdulo tiene una clase Libro encargada de fabricar objetos con losatributos de un libro. El mdulo tiene la clase Socio, que fabrica objetos con losatributos de un socio de la biblioteca. El mdulo contiene la clase Bibliote-ca, encargada de fabricar objetos para la gestin de una biblioteca. El mdulo permite elegir entre una serie de opciones. El mdulo servir para vali-dar las entradas ingresadas por el usuario del programa. Inicialmente se construirn losmdulos , , y , y slo cuando estn terminadosse proceder a la construccin del mdulo . El mdulo ser elltimo en ser construido, una vez que todos los dems estn funcionando correctamente.

    A continuacin se presenta un bosquejo bsico de lo que contendr cada mdulo.

    3.1. Mdulo main

    De f i n i r func ion main

    Exp l i ca r l o que haceI n s t an c i a r l a c l a s e B i b l i o t e c a de l mdulo In s t an c i a r l a c l a s e E l e g i r de l mdulo Desplegar l a s opc iones para i n t e r a c t ua r con e l usuar io

    3.2. Mdulo libro

    De f i n i r c l a s e Libro

    Exp l i ca r l o que haceI n i c i a l i z a rConstru i r mtodo para mostrar a t r i bu t o s

    3.3. Mdulo socio

    3

  • De f i n i r c l a s e Soc io ( Hereda de Libro )

    Exp l i ca r l o que haceI n i c i a l i z a rConstru i r mtodo mostrar a t r i bu t o s

    3.4. Mdulo biblioteca

    De f i n i r c l a s e B i b l i o t e c a ( Hereda de Libro y de s o c i o )

    Exp l i ca r l o que haceI n i c i a l i z a rConstru i r mtodo most ra rL ibro sDi spon ib l e sConstru i r mtodo mostrarL ibrosPrestadosc on s t r u i r mtodo pr e s t a rL ib roc on s t r u i r mtodo r e c i b i r L i b r oc on s t r u i r mtodo rec ib i rDonac i onc on s t r u i r mtodo comprarLibroConstru i r mtodo mostrarSoc iosConstru i r mtodo mostrarSociosMorososConstru i r mtodo most ra rSoc io sS inL ibro sConstru i r mtodo mostrarSoc iosConLibrosConstru i r mtodo a f i l i a r S o c i oConstru i r mtodo d e s a f i l i a r S o c i oc on s t r u i r mtodo mostrar a t r i bu t o s

    3.5. Mdulo validaciones

    De f i n i r c l a s e Val idador

    Exp l i ca r l o que haceI n i c i a l i z a rConstru i r mtodo va l i d a rT i t u l oConstru i r mtodo va l idarAutorConstuir mtodo va l i da rEd i c i onConstru i r mtodo validarNombrec on s t r u i r mtodo va l idar IDConstru i r mtodo va l i d a rE l e c c i onConstru i r mtodo mostrar a t r i bu t o s

    3.6. Mdulo menu

    4

  • De f i n i r c l a s e E l e g i r

    Exp l i ca r l o que haceI n i c i a l i z a rConstuir mtodo desp l egarOc ionesConstuir mtodo e jecutarOpc ionConstuir mtodo e lMos t ra rL ib ro sD i spon ib l e sConstuir mtodo e lMost ra rL ibrosPres tadosConstru i r mtodo e lP r e s t a rL ib r oConstuir mtodo e lRe c i b i rL i b r oConstuir mtodo elDonarLibroConstuir mtodo elComprarLibroConstuir mtodo e lMos t ra rSoc i o sConstuir mtodo e lMos t ra rSoc i o sS inL ib ro sConstuir mtodo e lMostrarSoc iosConLibrosConstuir mtodo e lMostrarSoc iosMorososConstuir mtodo e l A f i l i a r S o c i oConstuir mtodo e lD e s a f i l i a r S o c i oConstuir mtodo s a l i rConstru i r mtodo mostar a t r i bu t o s

    5

  • 4. Pseudo-cdigo

    Una vez realizado el diseo bsico, se puede empezar a escribir el pseudo-cdigo. Paraesto es suficiente con utilizar el diseo previo y empezar a realizar pequeas adiciones,que servirn como pistas y evitarn el bloqueo mental ms adelante.

    4.1. Mdulo main

    De f i n i r func ion main

    I n s t an c i a r l a c l a s e B i b l i o t e c a de l mdulo In s t an c i a r l a c l a s e E l e g i r de l mdulo Desplegar opc iones para i n t e r a c t ua r con e l usuar io

    4.2. Mdulo libro

    De f i n i r c l a s e Libro

    Permite c on s t r u i r un ob je to con l o s a t r i bu t o s de un\l i b r o

    I n i c i a l i z a rI n i c i a l i z a r t i t u l oI n i c i a l i z a r autorI n i c i a l z a r n_edicionI n i c i a l i z a r estado

    Constru i r mtodo para mostrar a t r i bu t o sMostrar l o s a t r i bu t o s de l ob j e to con una breve \

    d e s c r i p c i n

    4.3. Mdulo socio

    De f i n i r c l a s e Soc io ( )

    Permite c on s t r u i r un ob je to con l o s a t r i bu t o s y \mtodos de un s o c i o de b i b l i o t e c a

    I n i c i a l i z a rI n i c i a l i z a r nombreI n i c i a l i z a r IDI n i c i a l i z a r estado

    6

  • I n i c i a l i z a r l i b r o sI n i c i a l i z a r Pena l i z a c i on

    Constru i r mtodo mostrar a t r i bu t o sMostrar a t r i bu t o s con una breve d e s c r i p c i n

    4.4. Mdulo biblioteca

    De f i n i r c l a s e B i b l i o t e c a ( Hereda de Libro , Soc io y \

    Va l idac i one s )Permite c on s t r u i r un ob je to con l o s a t r i bu t o s y \

    mtodos de una b i b l i o t e c aI n i c i a l i z a r

    I n i c i a l i z a r l i s t a l i b r o s_d i s p on i b l e sI n i c i a l i z a r l i s t a l i b ro s_pre s t ado sI n i c i a l i z a r l i s t a s o c i o s_s i n_ l i b r o sI n i c i a l i z a r l i s t a soc io s_con_l ibrosI n i c i a l i z a r l i s t a socios_morosos

    Constru i r mtodo most ra rL ibro sDi spon ib l e sS i l i b r o s_d i s p on i b l e s t i e n e l i b r o s :

    Mostrar l i b r o s con c i c l o f o rConstru i r mtodo mostrarL ibrosPrestados

    S i l i b r o s_pre s t ado s t i e n e l i b r o s :Mostrar l i b r o s pre s tados con c i c l o f o r

    c on s t r u i r mtodo pr e s t a rL ib ro ( )E l e g i r un s o c i o a l azarInd i c a r e l t t u l o de l l i b r o q se desea p r e s t a rRea l i z a r proceso gene ra l de v e r i f i c a c i nS i cumple con todos l o s r e qu i s i t o s , p r e ta r e l \

    l i b r o

    c on s t r u i r mtodo r e c i b i r L i b r o ( soc io , l i b r o )E l e g i r un s o c i o a l azarRea l i z a r proceso gene ra l de v e r i f i c a c i nRec ib i r l i b r o

    c on s t r u i r mtodo rec ib i rDonac i onS o l i c i t a r a t r i bu t o s de l l i b r oAsignar estado = d i s pon i b l eI n s t an c i a r c l a s e Libro con datos s o l i c i t a d o sagregar ob j e to in s t anc i ado a l i b r o s_d i s p on i b l e sAgradecer

    7

  • c on s t r u i r mtodo comprarLibroS o l i c i t a r t t u l o a t r i bu t o s de l i b r oAsignar estado = d i s pon i b l eI n s t an c i a r ob j e to l i b r o con datos s o l i c i t a d o sagregar ob j e to in s t anc i ado a l i b r o s_d i s p on i b l e s

    Constru i r mtodo mostrarSoc iosi n i c i a r c i c l o f o r sobre l i s t a soc io s_con_l ibros +\

    so c i o s_s i n_ l i b r o s + socios_morososmostrar a t r i bu t o s de l s o c i o para cada cada uno

    Constru i r mtodo mostrarSociosMorososi n i c i a r c i c l o f o r sobre l i s t a s o c i o s morosos

    mostrar a t r i bu t o s de l s o c i oConstru i r mtodo most ra rSoc io sS inL ibro s

    i n i c i a r c i c l o f o r sobre l i s t a s o c i o s_s i n_ l i b r o smostrar a t r i bu t o s de l s o c i o

    Constru i r mtodo mostrarSoc iosConLibrosi n i c i a r c i c l o f o r sobre l i s t a soc io s_con_l ibros

    mostrar a t r i bu t o s de l s o c i oConstru i r mtodo a f i l i a r S o c i o

    S o l i c i t a r nombreS o l i c i t a r IDAsignar estado = normalAsignar l i b r o s = [ ]Asignar p ena l i z a c i on = 0In s t an c i a r ob j e to s o c i o con l o s datos s o l i c i t a d o sIn t r oduc i r ob j e to en so c i o s_s i n_ l i b r o s

    Constru i r mtodo d e s a f i l i a r S o c i oS o l i c i t a r IDi n i c i a r c i c l o f o r sobre s o c i o s_s i n_ l i b r o sS i se encuentra en so c i o s_s i n_ l i b r o s :

    e x t r a e r ob j e to de s o c i o s_s i n_ l i b r o sr e t o rna r

    i n i c i a r c i c l o f o r sobre soc io s_con_l ibrosS i se encuentra en soc io s_con_l ibros :

    Informar que antes debe devo lver l o s l i b r o s \que t i e n e para poder d e s a f i l i a r s e

    r e t o rna ri n i c i a r c i c l o f o r sobre socios_morososS i se encuentra en socios_morosos :

    Informar que e s t en l a l i s t a de s o c i o s morosos \y que debe e spe ra r 10 d a s antes de

    i n t en t a r d e s a f i l i a r s e

    8

  • ex t r a e r s o c i o de socios_morososcambiar a t r i bu to estado de l ob j e to s o c i o a normali n t r odu c i r s o c i o a s o c i o s_s i n_ l i b r o sr e t o rna r

    S i no se encuentra :Informar que no se encontr e l ID co r r e spond i en t e \

    a l s o c i oc on s t r u i r mtodo mostrar a t r i bu t o s

    mostrar a t r i bu t o s con una breve d e s c r i p c i n

    4.5. Mdulo validaciones

    De f i n i r c l a s e Val idador

    " " " Permite c r ea r ob j e t o s que va l idan l a s entradas de\usuar io " " "

    I n i c i a l i z a rI n i c i a l i z a r e_va l idarT i tu loI n i c i a l i z a r e_val idarAutorI n i c i a l i z a r e_va l idarEdic ionI n i c i a l i z a r e_validarNombreI n i c i a l i z a r e_val idarID

    Constru i r mtodo va l i d a rT i t u l o# El t t u l o debe tene r a l menos 4 c a r a c t e r e sS i e l t t u l o t i e n e a l menos cuatro c a r a c t e r e s

    e_va l idarTi tu lo va l e TrueSino

    Avisar que e l t t u l o no es v l i doConstru i r mtodo va l idarAutor

    # El autor debe tener a l menos 4 c a r a c t e r e sS i e l t t u l o t i e n e a l menos cuatro c a r a c t e r e s

    e_val idarAutor va l e TrueSino

    Avisar que e l nombre de Autor no es v l i doConstuir mtodo va l i da rEd i c i on

    # El nmero de ed i c i n es un entero p o s i t i v oI n i c i a l i z a r e s tados es_entero , e s_pos i t i vo a Fa l seIn t en ta r c onv e r t i r en entero

    S i se puede , es_entero va l e TrueS i es entero , v e r i f i c a r s i e s p o s i t i v o

    S i es po s i t i vo , e s_pos i t i vo va l e TrueS i cumple l a s dos cond i c i one s :

    9

  • e_va l idarEdic ion va l e TrueSino

    Avisar que e l N de ed i c i n no es v l i doConstru i r mtodo validarNombre

    # El nombre debe tener a l menor 4 c a r a c t e r e sS i e l nombre t i e n e a l menor 4 c a r a c t e r e s

    evalidarNombre va l e TrueSino

    Avisar que e l nombre de l Soc io no es v l i doc on s t r u i r mtodo va l idar ID

    # ID es un nmero entero p o s i t i v o de a l menos 5 c i f r a sI n i c i a l i z a r e s tados es_entero , e s_pos i t ivo , tiene_5c_\o_mas a Fal seIn t en ta r c onv e r t i r en un entero

    S i se puede , es_entero va l e TrueS i es entero , v e r i f i c a r s i e s p o s i t i v o

    S i es po s i t i vo , e s_pos i t i vo va l e TrueS i l a l ong i tud es de a l menos 5

    tiene_5c_o_mas va l e TrueS i cumple l a s t r e s cond i c i one s :

    e_val idarID va l e TrueSino :

    Avisar que e l ID de l s o c i o no es v l i doc on s t r u i r mtodo va l i d a rE l e c c i on

    La e l e c c i n debe s e r un nmero entero ent re 1 y 13c on s t r u i r mtodo mostrar a t r i bu t o s

    mostrar a t r i bu t o s con una breve d e s c r i p c i n

    4.6. Mdulo menu

    De f i n i r c l a s e E l e g i r

    Construye ob j e t o s que permiten e l e g i r de ent re un men \de opc iones

    I n i c i a l i z a r# I n i c i a l i z a r opcion

    Constru i r mtodo e lDesp legarOpc iones# Muestra l a s opc iones que t i e n e e l usuar io

    10

  • Constru i r mtodo e jecutarOpc ion# Ejecuta l a opcin e l e g i d a y re to rna a e lDesp l ega r \Opciones

    Constuir mtodo e lMos t ra rL ib ro sD i spon ib l e s# Permite mostrar l o s l i b r o s d i s p on i b l e s en l a b i b l i o t e c ainvocar a l mtodo most ra rL ibro sDi spon ib l e s de l ob j e to \b i b l i o t e c a

    Constuir mtodo e lMost ra rL ibrosPres tados# Permite mostrar l o s l i b r o s pre s tados a l o s s o c i o sinvocar a l mtodo mostrarL ibrosPrestados de l ob j e to \b i b l i o t e c a

    Constru i r mtodo e l e lP r e s t a rL ib r o# Da la p o s i b i l i d a d de s o l i c i t a r un l i b r o en prstamoinvocar a l mtodo s o l i c i t a rP r e s t amo de l ob j e to s o c i o

    Constuir mtodo e lRe c i b i rL i b r o# Permite a un s o c i o devo lver un l i b r o que tenga en \# prstamoinvocar a l mtodo devo lve rL ibro de l ob j e to s o c i o

    Constuir mtodo elDonarLibro# Permite donar un l i b r o a l a b i b l i o t e c ainvocar a l mtodo donarLibro de l ob j e to s o c i o

    Constuir mtodo elComprarLibro# Se usa cuando l a b i b l i o t e c a qu i e r e adqu i r i r un \#l i b r o a t rav s de comprainvocar a l mtodo comprarLibro de l ob j e to b i b l i o t e c a

    Constuir mtodo e lMos t ra rSoc i o s# Muestra todos l o s s o c i o s de l a b i b l i o t e c ainvocar a l mtodo mostrarSoc ios de l ob j e to b i b l i o t e c a

    Constuir mtodo e lMos t ra rSoc i o sS inL ib ro s# Muestra l o s s o c i o s que no t i enen l i b r o s en prstamoinvocar a l mtodo most ra rSoc io sS inL ibro s de l ob j e to \b i b l i o t e c a

    Constuir mtodo e lMostrarSoc iosConLibros

    11

  • # Muestra l o s s o c i o s que t i enen l i b r o s en prstamoinvocar a l mtodo mostrarSoc iosConLibros de l ob j e to \b i b l i o t e c a

    Constuir mtodo e lMostrarSoc iosMorosos# Muestra a l o s s o c i o s que no entregaron l o s l i b r o s en \l o s p la zo s e s t a b l e c i d o sinvocar a l mtodo mostrarSociosMorosos de l ob j e to \b i b l i o t e c a

    Constuir mtodo e l A f i l i a r S o c i o# Permite dar de a l t a a un nuevo s o c i oinvocar a l mtodo a f i l i a r S o c i o de l ob j e to b i b l i o t e c a

    Constuir mtodo e lD e s a f i l i a r S o c i o# Permite dar de baja a un s o c i o de l a b i b l i o t e c ainvocar a l mtodo d e s a f i l i a r S o c i o de l ob j e to b i b l i o t e c a

    Constru i r mtodo mostrar a t r i bu t o s# Muestra l o s a t r i bu t o s de l ob j e to con una breve d e s c r i p c i n

    12

  • 5. 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 escibir cdigo de manera irreflexiva es la receta perfecta para lafrustracin: ojal no caigan en ese error.

    A continuacin se presenta una propuesta del cdigo en Python, talvez est plagada deerrores, ingenuidades e inconsistencias, pero incluso de eso podemos aprender, y aprenderes el nico objetivo de este documento.

    5.1. Mdulo main

    #! / usr /bin /env python# encoding : Latin1import b i b l i o t e c aimport menude f main ( ) :

    " " " Funcion que permite l lamar a l o s dems componentes de lprograma para g e s t i ona r una b i b l i o t e c a " " "

    # In s t an c i a r e l ob j e to B i b l i o t e c a de l mdulo l a b i b l i o t e c a = b i b l i o t e c a . B i b l i o t e c a ( )

    # In s t an c i a r e l ob j e to E l e g i r de l mdulo menu_de_opciones = menu . E l e g i r ( l a b i b l i o t e c a )

    # Desplegar opc iones para i n t e r a c t ua r con e l usuar iomenu_de_opciones . desp legarOpc iones ( )

    main ( )

    5.2. Mdulo libro

    #! / usr /bin /env python# encoding : Latin1c l a s s Libro ( ) :

    13

  • " " " Permite c on s t r u i r un ob j e to con l o s a t r i bu t o s de un l i b r o " " "

    # I n i c i a l i z a rde f __init__( s e l f , t i t u l o , autor , n_edicion , estado= d i spon ib l e ) :

    s e l f . t i t u l o = t i t u l os e l f . autor = autors e l f . n_edicion = n_edicions e l f . e stado = estado

    # Constru i r mtodo para mostrar a t r i bu t o sde f __str__( s e l f ) :

    # Mostrar l o s a t r i bu t o s de l ob j e to con una breve d e s c r i p c i ns = "\ nAtr ibutos de l l i b r o \n "s += "\ nTitu lo : " + s t r ( s e l f . t i t u l o )s += "\ nAutor : " + s t r ( s e l f . autor )s += "\nN ed i c i n : " + s t r ( s e l f . n_edicion )s += "\ nEstado : " + s t r ( s e l f . e s tado ) + "\n "re turn s

    5.3. Mdulo socio#! / usr /bin /env python# encoding : Latin1c l a s s Soc io ( ) :

    " " " Permite c on s t r u i r un ob j e to con l o s a t r i bu t o s y mtodos de un s o c i o de b i b l i o t e c a " " "

    # I n i c i a l i z a rde f __init__( s e l f , nombre , ID , estado = normal , l i b r o s = [ ] , p ena l i z a c i on = 0 ) :

    s e l f . nombre = nombres e l f . ID = IDs e l f . e s tado = estados e l f . l i b r o s = l i b r o ss e l f . p ena l i z a c i on = pena l i z a c i on

    # Constru i r mtodo mostrar a t r i bu t o sde f __str__( s e l f ) :

    # Mostrar a t r i bu t o s con una breve d e s c r i p c i ns = "\ nAtr ibutos de l s o c i o \n"s += "\nNombre : " + s t r ( s e l f . nombre )s += "\nID : " + s t r ( s e l f . ID)s += "\ nEstado : " + s t r ( s e l f . e s tado )s += "\ nLibros : "s += "\n"f o r i in s e l f . l i b r o s :

    s += s t r ( i )s += "\n\n"

    14

  • s += " Pena l i za c i n : " + s t r ( s e l f . p ena l i z a c i on ) + "\n"re turn s

    5.4. Mdulo biblioteca#! / usr /bin /env python# encoding : Latin1import randomimport v a l i d a c i o n e sfrom l i b r o import Librofrom so c i o import Soc io# De f i n i r c l a s e B i b l i o t e c a ( )c l a s s B i b l i o t e c a ( Libro , Socio , v a l i d a c i o n e s . Val idador ) :

    " " " Permite c on s t r u i r un ob j e to con l o s a t r i bu t o s y mtodos de una b i b l i o t e c a " " "

    # I n i c i a l i z a rde f __init__( s e l f ) :

    s e l f . l i b r o s_d i s p on i b l e s = [ ]s e l f . l i b r o s_pre s t ado s = [ ]s e l f . s o c i o s_s i n_ l i b r o s = [ ]s e l f . s oc io s_con_l ibros = [ ]s e l f . soc ios_morosos = [ ]

    # Constru i r mtodo most ra rL ib ro sDi spon ib l e sde f mos t ra rL ib ro sDi spon ib l e s ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o mostrar l o s l i b r o s d i s p on i b l e s \n "# Si l i b r o s_d i s p on i b l e s t i e n e l i b r o s :i f l en ( s e l f . l i b r o s_d i s p on i b l e s ) > 0 :

    # Mostrar l i b r o s con c i c l o f o rf o r i in s e l f . l i b r o s_d i s p on i b l e s :

    p r i n t ie l s e :

    p r i n t "\nNo hay l i b r o s d i s p on i b l e s \n "p r i n t "\ nProceso de v i s u a l i z a c i n f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo mostrarL ibrosPres tadosde f mostrarL ibrosPres tados ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o mostrar l o s l i b r o s pre s tados \n"# Si l i b r o s_pre s t ado s t i e n e l i b r o s :i f l en ( s e l f . l i b r o s_pre s t ado s ) > 0 :

    # Mostrar l i b r o s pre s tados con c i c l o f o rf o r i in s e l f . l i b r o s_pre s t ado s :

    p r i n t ie l s e :

    p r i n t "\nNo hay l i b r o s pre s tados \n"p r i n t "\ nProceso de v i s u a l i z a c i n f i n a l i z a d o \n"

    15

  • pr in t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo pr e s t a rL ib ro ( soc io , t i t u l o )de f p r e s t a rL ib ro ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o p r e s t a r un l i b r o \n"# E l e g i r a uno de l o s s o c i o sl i s t a_de_soc i o s = s e l f . s o c i o s_s i n_ l i b r o s + s e l f . s oc io s_con_l ibros + \s e l f . soc ios_morososi f l en ( l i s t a_de_soc i o s ) > 0 :

    s o c i o = random . cho i c e ( l i s t a_de_soc i o s )e l s e :

    p r i n t "\nNo hay s o c i o s \n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )re turn

    # Ind i c a r e l t t u l o de l l i b r o s o l i c i t a d owhi l e True :

    t i t u l o = raw_input ( " T tu lo exacto de l l i b r o : \ n " )i f s e l f . v a l i d a rT i t u l o ( t i t u l o ) : break

    # Rea l i z a r proceso gene ra l de v e r i f i c a c i o n#I n i c i a l i z a r i nd i c ado r e s de estado( l i b ro_d i spon ib l e , l im i t e_ l i b r o s , socio_moroso)=\( False , False , Fa l se )#Rea l i z a r proceso de v e r i f a c i n#Ve r i f i c a r s i e l t i t u l o e s ta en l i b r o s_d i s p on i b l e sf o r i in s e l f . l i b r o s_d i s p on i b l e s :

    i f t i t u l o == i . t i t u l o :l i b r o_d i spon i b l e = Truel i b r o = i

    #Ve r i f i c a r que e l s o c i o no haya alcanzado e l l m i t e de l i b r o s q# puede teneri f l en ( s o c i o . l i b r o s ) == 3 :

    l im i t e_ l i b r o s = True#Ve r i f i c a r s i s o c i o es morosoi f s o c i o . estado == moroso :

    socio_moroso = True# Si e l l i b r o no e s t d i s pon i b l ei f not l i b r o_d i spon i b l e :

    # Ind i c a r a l s o c i o que e l l i b r o no e s t d i s pon i b l e por e l# momentop r in t "\ nApreciado ( a ) s o c i o ( a ) : e l l i b r o no e s t d i s pon i b l e \n"re turn

    # Si e l s o c i o ya a lcanz e l l m i t e de l i b r o si f l im i t e_ l i b r o s :

    # Ind i c a r a l s o c i o que t i e n e 3 l i b r o s en su poder y q debe# devo l v e r l o sp r i n t "\ nEl s o c i o ya t i e n e 3 l i b r o s en prstamo "p r i n t "Debe devo lver l o s l i b r o s q t i e n e para poder s o l i c i t a r "p r i n t " ot ro prstamo "p r i n t "\ nPres ione ENTER para cont inuar \n"

    16

  • raw_input ( )re turn

    # Si es un s o c i o morosoi f socio_moroso :

    # Ind i c a r a l s o c i o que e s t en mora , y que debe# devo lver l o s l i b r o s que tengap r in t "\ nEl s o c i o se encuentra en estado moroso . "p r i n t "Debe devo lver l o s l i b r o s que tenga "p r i n t " y e spe ra r a que termine l a p ena l i z a c i n "# Extraer s o c i o de socios_morososs e l f . soc ios_morosos . remove ( s o c i o )# Ve r i f i c a r a t r i bu to p ena l i z a c i on de l s o c i op ena l i z a c i on = so c i o . p ena l i z a c i on# Si p ena l i z a c i on > 1 :i f p ena l i z a c i on > 1 :

    # r e s t a r 1 a l a t r i bu to p ena l i z a c i npena l i z a c i on = 1so c i o . p ena l i z a c i on = pena l i z a c i on# In t r oduc i r s o c i o nuevamente a# socios_morososs e l f . soc ios_morosos . append ( s o c i o )

    # Si p ena l i z a c i on i gua l a 1 :e l s e :

    # Igua l a r a t r i bu to p ena l i z a c i on a ceros o c i o . p ena l i z a c i on = 0# Cambiar a t r i bu to estado de l s o c i o a normals o c i o . estado = normal # In t r oduc i r s o c i o en s o c i o s_s i n_ l i b r o ss e l f . s o c i o s_s i n_ l i b r o s . append ( s o c i o )

    re turn# Si se cumplen todos l o s r e q u i s i t o s para p r e s t a r l e e l l i b r oi f not socio_moroso and not l im i t e_ l i b r o s and l i b r o_d i spon i b l e :

    # Extraer l i b r o de l i b r o s_d i p on i b l e ss e l f . l i b r o s_d i s p on i b l e s . remove ( l i b r o )# Cambiar estado de l i b r o a prestadol i b r o . estado = prestado # In t r oduc i r l i b r o en l i b ro s_pre s t ado ss e l f . l i b r o s_pre s t ado s . append ( l i b r o )# Extraer s o c i o de s o c i o s_s i n_ l i b r o s ( s i e s t )i f s o c i o in s e l f . s o c i o s_s i n_ l i b r o s :

    s e l f . s o c i o s_s i n_ l i b r o s . remove ( s o c i o )# Extraer s o c i o de soc io s_con_l ibros ( s i e s t )i f s o c i o in s e l f . s oc io s_con_l ibros :

    s e l f . s oc io s_con_l ibros . remove ( s o c i o )# Agregar l i b r o a l a t r i bu to l i b r o s de l ob j e to s o c i os o c i o . l i b r o s . append ( l i b r o )# In t r oduc i r s o c i o a soc io s_con_l ib ross e l f . s oc io s_con_l ibros . append ( s o c i o )

    p r i n t "\ nLibro prestado : " , l i b r o . t i t u l op r i n t "\ nSocio a quien se l e p r e s t : " , s o c i o . nombrep r i n t "\ nProceso de prstamo f i n a l i z a d o con x i t o \n"p r i n t "\n\n"

    17

  • pr in t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo r e c i b i r L i b r o ( soc io , l i b r o )de f r e c i b i r L i b r o ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o r e c i b i r un l i b r o \n"# E l e g i r a uno de l o s s o c i o s con l i b r o si f l en ( s e l f . s oc io s_con_l ibros ) > 0 :

    s o c i o = random . cho i c e ( s e l f . soc io s_con_l ib ros )e l s e :

    p r i n t "\nNo hay s o c i o s con l i b r o s \n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )re turn

    # E l e g i r un l i b r ol i b r o = random . cho i c e ( s o c i o . l i b r o s )# Rea l i z a r proceso gene ra l de v e r i f i c a c i n#I n i c i a l i z a r i nd i c ado r e s de estado( socio_moroso , entrega_puntual ) = ( False , Fa l se )#Ve r i f i c a r s i e l s o c i o es morosoi f s o c i o in s e l f . soc ios_morosos :

    socio_moroso = True#Ve r i f i c a r entrega puntuali f random . cho i c e ( xrange ( 1 , 16 ) )

  • # Int r oduc i r s o c i o en s o c i o s_s i n_ l i b r o s s i no t i e n e l i b r o s# en otro caso i n t r o d u c i r l o en soc io s_con_l ib rosi f l en ( s o c i o . l i b r o s ) == 0 :

    s e l f . s o c i o s_s i n_ l i b r o s . append ( s o c i o )e l s e :

    s e l f . s oc io s_con_l ibros . append ( s o c i o )

    # Si l a entrega de l l i b r o no es puntuali f not entrega_puntual :

    # Extraer l i b r o de l i b r o s_pre s t ado s ( s i se puede )i f l i b r o in s e l f . l i b r o s_pre s t ado s :

    s e l f . l i b r o s_pre s t ado s . remove ( l i b r o )# Cambiar estado de l i b r o a d i s pon i b l el i b r o . estado = d i spon ib l e # In t r oduc i r l i b r o en l i b r o s_d i s p on i b l e s ( s i no e s t )i f l i b r o not in s e l f . l i b r o s_d i s p on i b l e s :

    s e l f . l i b r o s_d i s p on i b l e s . append ( l i b r o )# Extraer s o c i o de soc io s_con_l ibross e l f . s oc io s_con_l ibros . remove ( s o c i o )# Quitar l i b r o a l a t r i bu to l i b r o s de l ob j e to s o c i o# ( s i se puede )i f l i b r o in s o c i o . l i b r o s :

    s o c i o . l i b r o s . remove ( l i b r o )# Cambiar estado de l ob j e to s o c i o a morosos o c i o . estado = moroso # Agregar p ena l i z a c i n a s o c i os o c i o . p ena l i z a c i on += random . cho i c e ( xrange (1 , 11 ) )# In t r oduc i r s o c i o en socios_morososs e l f . soc ios_morosos . append ( s o c i o )

    p r i n t "\ nEl l i b r o r e c i b i d o es : " , l i b r o . t i t u l op r i n t "\ nEl s o c i o que l o entreg es : " , s o c i o . nombrep r i n t "\ nProceso de r e c epc i n f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo rec ib i rDonac i onde f r e c ib i rDonac i on ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o r e c i b i r una donacin \n"# S o l i c i t a r t t u l owhi l e True :

    t i t u l o = raw_input ( "\ nTitu lo : \ n " )i f s e l f . v a l i d a rT i t u l o ( t i t u l o ) : break

    # S o l i c i t a r autorwhi l e True :

    autor = raw_input ( "\ nAutor : \ n " )i f s e l f . va l idarAutor ( autor ) : break

    # S o l i c i t a r nmero de ed i c i nwhi l e True :

    n_edicion = raw_input ( "\ nN de ed i c i n : \ n " )i f s e l f . v a l i da rEd i c i on ( n_edicion ) : break

    19

  • # In s t an c i a r ob j e to l i b r o con datos s o l i c i t a d o snuevo_libro = Libro ( t i t u l o , autor , n_edicion )# Agregar ob j e to in s t anc i ado a l i b r o s_d i s p on i b l e ss e l f . l i b r o s_d i s p on i b l e s . append ( nuevo_libro )# Agradecerp r i n t "\nMuchas g r a c i a s por su donacin . "p r i n t " El l i b r o e s t a r a l s e r v i c i o de l a comunidad\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo comprarLibrode f comprarLibro ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o comprar un l i b r o \n"# S o l i c i t a r t t u l owhi l e True :

    t i t u l o = raw_input ( "\ nTitu lo : \ n " )i f s e l f . v a l i d a rT i t u l o ( t i t u l o ) : break

    # S o l i c i t a r autorwhi l e True :

    autor = raw_input ( "\ nAutor : \ n " )i f s e l f . va l idarAutor ( autor ) : break

    # S o l i c i t a r nmero de ed i c i nwhi l e True :

    n_edicion = raw_input ( "\ nN de ed i c i n : \ n " )i f s e l f . v a l i da rEd i c i on ( n_edicion ) : break

    # In s t an c i a r ob j e to l i b r o con datos s o l i c i t a d o snuevo_libro = Libro ( t i t u l o , autor , n_edicion )# Agregar ob j e to in s t anc i ado a l i b r o s_d i s p on i b l e ss e l f . l i b r o s_d i s p on i b l e s . append ( nuevo_libro )p r i n t "\ nProceso de compra f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo mostrarSoc iosde f most rarSoc ios ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o mostrar s o c i o s \n"l i s t a_de_soc i o s = s e l f . s oc io s_con_l ibros + s e l f . s o c i o s_s i n_ l i b r o s +\s e l f . soc ios_morososi f l en ( l i s t a_de_soc i o s ) > 0 :

    f o r i in l i s t a_de_soc i o s :p r i n t i

    e l s e :p r i n t "\nNo hay s o c i o s \n"

    p r i n t "\ nProceso de v i s u a l i z a c i n f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo mostrarSociosMorososde f mostrarSociosMorosos ( s e l f ) :

    20

  • pr in t "\n\n"p r i n t "\ nSe ha e l e g i d o mostrar l o s s o c i o s morosos\n"i f l en ( s e l f . soc ios_morosos ) > 0 :

    f o r i in s e l f . soc ios_morosos :p r i n t i

    e l s e :p r i n t "\nNo hay s o c i o s morosos\n"

    p r i n t "\ nProceso de v i s u a l i z a c i n f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo most ra rSoc io sS inL ibro sde f mos t ra rSoc io sS inL ibro s ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o mostrar l o s s o c i o s s i n l i b r o s \n"i f l en ( s e l f . s o c i o s_s i n_ l i b r o s ) > 0 :

    f o r i in s e l f . s o c i o s_s i n_ l i b r o s :p r i n t i

    e l s e :p r i n t "\nNo hay s o c i o s s i n l i b r o s \n"

    p r i n t "\ nProceso de v i s u a l i z a c i n f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo mostrarSoc iosConLibrosde f mostrarSoc iosConLibros ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o mostrar l o s s o c i o s con l i b r o s \n"i f l en ( s e l f . s oc io s_con_l ibros ) > 0 :

    f o r i in s e l f . s oc io s_con_l ibros :p r i n t i

    e l s e :p r i n t "\nNo hay s o c i o s con l i b r o s \n"

    p r i n t "\ nProceso de v i s u a l i z a c i n f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo a f i l i a r S o c i ode f a f i l i a r S o c i o ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o a f i l i a r un s o c i o \n"# S o l i c i t a r nombrewhi l e True :

    nombre = raw_input ( "\ nNombre de l nuevo s o c i o : \ n " )i f s e l f . validarNombre ( nombre ) : break

    # S o l i c i t a r IDwhi le True :

    ID = raw_input ( "\ nID de l nuevo s o c i o : \ n " )i f s e l f . va l idar ID ( ID ) : break

    # In s t an c i a r ob j e to s o c i o con l o s datos s o l i c i t a d o s

    21

  • nuevo_socio = Soc io (nombre , ID)# In t r oduc i r ob j e to en so c i o s_s i n_ l i b r o ss e l f . s o c i o s_s i n_ l i b r o s . append ( nuevo_socio )p r i n t "\ nProceso de a f i l i a c i n f i n a l i z a d o \n"p r i n t "\n\n"p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo d e s a f i l i a r S o c i ode f d e s a f i l i a r S o c i o ( s e l f ) :

    p r i n t "\n\n"p r i n t "\ nSe ha e l e g i d o d e s a f i l i a r un s o c i o \n"# S o l i c i t a r IDwhi le True :

    ID = raw_input ( "\ nID de s o c i o a d e s a f i l i a r : \ n " )i f s e l f . va l idar ID ( ID ) : break

    # Buscar en s o c i o s_s i n_ l i b r o sf o r i in s e l f . s o c i o s_s i n_ l i b r o s :

    i f ID == i . ID :s e l f . s o c i o s_s i n_ l i b r o s . remove ( i )r e turn

    # Buscar en soc io s_con_l ib rosf o r i in s e l f . s oc io s_con_l ibros :

    i f ID == i . ID :p r i n t "\nDebe devo lver l o s l i b r o s que t i e n e para poder "p r i n t " d e s a f i l i a r s e \n"re turn

    # Buscar en socios_morososf o r i in s e l f . soc ios_morosos :

    i f ID == i . ID :p r i n t "\ nEl s o c i o se encuentra en estado moroso , \ n debe "p r i n t " e spe ra r 10 d a s \para poder d e s a f i l i a r s e \n"# Extraer s o c i o de socios_morososs e l f . soc ios_morosos . remove ( i )# Cambiar a t r i bu to estado de l ob j e to s o c i o a normali . e s tado = normal # In t r oduc i r s o c i o a s o c i o s_s i n_ l i b r o ss e l f . s o c i o s_s i n_ l i b r o s . append ( i )r e turn

    p r in t "\nNo se encontr e l ID de l s o c i o . No e s t a f i l i a d o . \ n "p r i n t "\ nPres ione ENTER para cont inuar \n"raw_input ( )

    # Constru i r mtodo mostrar a t r i bu t o sde f __str__( s e l f ) :

    # Mostrar a t r i bu t o s con una breve d e s c r i p c i ns = "\ nAtr ibutos de l a b i b l i o t e c a \n"s += "\ nLibros d i s p on i b l e s : \ n "f o r i in s e l f . l i b r o s_d i s p on i b l e s :

    s += s t r ( i )s += "\n"s += "\ nLibros pre s tados : \ n "

    22

  • f o r i in s e l f . l i b r o s_pre s t ado s :s += s t r ( i )

    s += "\n"s += "\ nSoc ios s i n l i b r o s : \ n "f o r i in s e l f . s o c i o s_s i n_ l i b r o s :

    s += s t r ( i )s += "\n"s += "\ nSoc ios con l i b r o s : \ n "f o r i in s e l f . s oc io s_con_l ibros :

    s += s t r ( i )s += "\n"s += "\ nSoc ios morosos : \ n "f o r i in s e l f . soc ios_morosos :

    s += s t r ( i )s += "\n"

    re turn s

    5.5. Mdulo validaciones#! / usr /bin /env python# encoding : Latin1c l a s s Val idador ( ) :

    " " " Permite c r ea r ob j e t o s que va l idan l a s entradas de usuar io " " "

    # I n i c i a l i z a rde f __init__( s e l f ) :

    s e l f . e_va l idarTi tu lo = Falses e l f . e_val idarAutor = Falses e l f . e_va l idarEdic ion = Falses e l f . e_validarNombre = Falses e l f . e_val idarID = Falses e l f . e_va l ida rE l ecc i on = False

    # Constru i r mtodo va l i d a rT i t u l ode f v a l i d a rT i t u l o ( s e l f , t i t u l o ) :

    # El t t u l o debe tener a l menos 4 c a r a c t e r e si f l en ( t i t u l o ) >= 4 :

    s e l f . e_va l idarTi tu lo = Truee l s e :

    # Avisar que e l t t u l o no es v l i dop r i n t "\ nEl t t u l o ingre sado no es v l i do "p r i n t " Recuerde que debe tene r a l menos 4 c a r a c t e r e s \n"s e l f . e_va l idarTi tu lo = False

    re turn s e l f . e_va l idarTi tu lo

    # Constru i r mtodo va l idarAutorde f va l idarAutor ( s e l f , autor ) :

    # El autor debe tene r a l menos 4 c a r a c t e r e si f l en ( autor ) >= 4 :

    s e l f . e_val idarAutor = True

    23

  • e l s e :p r i n t "\ nEl nombre de l autor no es v l i do "p r i n t " Recuerde que debe tene r a l menos 4 c a r a c t e r e s \n"s e l f . e_val idarAutor = False

    re turn s e l f . e_val idarAutor

    # Constuir mtodo va l i da rEd i c i onde f va l i da rEd i c i on ( s e l f , n_edicion ) :

    # El nmero de ed i c i n es un entero p o s i t i v o# I n i c i a l i z a r e s tados es_entero , e s_pos i t i vo a Fa l se( es_entero , e s_pos i t i vo ) = ( False , Fa l se )# Inten ta r c onv e r t i r en enterot ry :

    n_edicion = in t ( n_edicion )es_entero = True

    except :p r i n t "\ nEl nmero de ed i c i n ingre sado no es v l i do "p r i n t " Recuerde que debe s e r un entero p o s i t i v o "s e l f . e_va l idarEdic ion = Falsere turn s e l f . e_va l idarEdic ion

    # Si es entero , v e r i f i c a r s i e s p o s i t i v oi f n_edicion > 0 :

    e s_pos i t i vo = True# Si cumple l a s dos cond i c i one s :i f es_entero and es_pos i t i vo :

    s e l f . e_va l idarEdic ion = Truee l s e :

    p r i n t "\ nEl nmero de ed i c i n ingre sado no es v l i do "p r i n t " Recuerde que debe s e r un entero p o s i t i v o \n"s e l f . e_va l idarEdic ion = False

    re turn s e l f . e_va l idarEdic ion

    # Constru i r mtodo validarNombrede f validarNombre ( s e l f , nombre ) :

    # El nombre debe tene r a l menor 4 c a r a c t e r e s# Si e l nombre t i e n e a l menor 4 c a r a c t e r e si f l en ( nombre ) >= 4 :

    s e l f . e_validarNombre = Truee l s e :

    p r i n t "\ nEl nombre de s o c i o ingre sado no es v l i do "p r i n t " Recuerde que debe tene r a l menos cuatro c a r a c t e r e s \n"s e l f . e_validarNombre = False

    re turn s e l f . e_validarNombre

    # con s t r u i r mtodo va l idar IDde f va l idar ID ( s e l f , ID ) :

    # ID es un nmero entero p o s i t i v o de a l menos 5 c i f r a s# I n i c i a l i z a r e s tados es_entero , e s_pos i t ivo , tiene_5c_o_mas a Fal se( es_entero , e s_pos i t ivo , tiene_5c_o_mas ) = ( False , False , Fa l se )# Inten ta r c onv e r t i r en un enterot ry :

    ID = in t ( ID)# Si se puede , es_entero va l e True

    24

  • es_entero = Trueexcept :

    # Avisar que e l ID de l s o c i o no es v l i dop r i n t "\ nEl ID de s o c i o ingre sado es i n c o r r e c t o "p r i n t " Recuerde que debe s e r un nmero entero p o s i t i v o de a l menos "p r i n t "5 c i f r a s \n"s e l f . e_val idarID = Falsere turn s e l f . e_val idarID

    # Si es entero , v e r i f i c a r s i e s p o s i t i v oi f ID > 0 :

    # Si es po s i t i vo , e s_pos i t i vo va l e Truee s_pos i t i vo = True

    # Si l a l ong i tud es de a l menos 5i f l en ( s t r ( ID ) ) >= 5 :

    # tiene_5c_o_mas va l e Truetiene_5c_o_mas = True

    # Si cumple l a s t r e s cond i c i one s :i f es_entero and es_pos i t i vo and tiene_5c_o_mas :

    # e_val idarID va l e Trues e l f . e_val idarID = True

    e l s e :# Avisar que e l ID de l s o c i o no es v l i dop r i n t "\ nEl ID de s o c i o ingre sado es i n c o r r e c t o "p r i n t " Recuerde que debe s e r un nmero entero p o s i t i v o de a l menos "p r i n t "5 c i f r a s \n"s e l f . e_val idarID = False

    re turn s e l f . e_val idarID

    # Constuir mtodo va l i d a rE l e c c i onde f v a l i d a rE l e c c i on ( s e l f , e l e c c i o n ) :

    # La e l e c c i n es un nmero entero ent r e 1 y 13# I n i c i a l i z a r i nd i c ado r e s de estado a Fal se( es_entero , rango_val ido ) = ( False , Fa l se )#Tratar de c onv e r t i r en nmero entero#try :

    e l e c c i o n = in t ( e l e c c i o n )es_entero = True

    except :p r i n t "\nLa opcin e l e g i d a es i nv l i d a "p r i n t " Recuerde que debe i n g r e s a r un nmero entero ent r e 1 y 13\n"s e l f . e_va l ida rE l ecc i on = Falsere turn s e l f . e_va l ida rE l ecc i on

    #Averiguar s i l a e l e c c i n e s t en e l rango apropiadoi f e l e c c i o n in xrange ( 1 , 1 4 ) :

    rango_val ido = True# Si se cumplen l a s dos cond i c i one si f es_entero and rango_val ido :

    s e l f . e_va l ida rE l ecc i on = Truere turn s e l f . e_va l ida rE l ecc i on

    # Constru i r mtodo mostrar a t r i bu t o sde f __str__( s e l f ) :

    25

  • # Mostrar a t r i bu t o s con una breve d e s c r i p c i ns = "\ nAtr ibutos de ob j e to Val idador \n"s += "\ nEstado de t t u l o de l l i b r o : " + s t r ( s e l f . e_va l idarTi tu lo )s += "\ nEstado de autor de l l i b r o : " + s t r ( s e l f . e_val idarAutor )s += "\ nEstado de N ed i c i n de l l i b r o : " + s t r ( s e l f . e_va l idarEdic ion )s += "\ nEstado de Nombre de l s o c i o : " + s t r ( s e l f . e_validarNombre )s += "\ nEstado de ID de l s o c i o : " + s t r ( s e l f . e_val idarID ) + "\n"re turn s

    5.6. Mdulo menu

    #! / usr /bin /env python# encoding : Latin1import b i b l i o t e c aimport v a l i d a c i o n e sc l a s s E l e g i r ( v a l i d a c i o n e s . Val idador ) :

    " " " Construye ob j e t o s que permiten e l e g i r de ent re un men de opc iones " " "

    # I n i c i a l i z a rde f __init__( s e l f , b i b l i o t e c a ) :

    s e l f . b i b l i o t e c a = b i b l i o t e c as e l f . opcion = 13

    # Constru i r mtodo desp legarOpc ionesde f desp legarOpc iones ( s e l f ) :

    # Muestra l a s opc iones que t i e n e e l usuar iop r i n t "\n\n\n\n\n\n\n\n\n\n\n\n"p r i n t "\n============================================="pr in t "GESTIN DE BILIOTECA"p r i n t "=============================================\n"p r in t "\ nPor favor , e l i j a una opcion : \ n "p r i n t "\ n1 \tMostrar l i b r o s d i s p on i b l e s "p r i n t "2 \tMostrar l i b r o s pre s tados "p r i n t "3 \tPre s ta r l i b r o "p r i n t "4 \tRec i b i r l i b r o "p r i n t "5 \tRec i b i r donacin "p r i n t "6 \tComprar l i b r o "p r i n t "7 \tMostrar s o c i o s "p r i n t "8 \tMostrar s o c i o s s i n l i b r o s "p r i n t "9 \tMostrar s o c i o s con l i b r o s "p r i n t "10 \tMostrar s o c i o s morosos "p r i n t "11 \ t A f i l i a r s o c i o "p r i n t "12 \ tD e s a f i l i a r s o c i o "p r i n t "13 \ t S a l i r \n\n "

    26

  • whi le True :p r i n t " Ing r e s e opcion y pr e s i one ENTER:\ n"opcion = raw_input ( )i f s e l f . v a l i d a rE l e c c i on ( opcion ) : break

    s e l f . opcion = in t ( opcion )s e l f . e j ecutarOpc ion ( )i f s e l f . opcion != 13 :

    s e l f . desp legarOpc iones ( )# Constuir mtodo e jecutarOpc ionde f e jecutarOpc ion ( s e l f ) :

    i f s e l f . opcion == 1 :s e l f . e lMos t ra rL ib ro sD i spon ib l e s ( )

    e l i f s e l f . opcion == 2 :s e l f . e lMost ra rL ibrosPres tados ( )

    e l i f s e l f . opcion == 3 :s e l f . e lP r e s t a rL ib r o ( )

    e l i f s e l f . opcion == 4 :s e l f . e lR e c i b i rL i b r o ( )

    e l i f s e l f . opcion == 5 :s e l f . e lDonarLibro ( )

    e l i f s e l f . opcion == 6 :s e l f . elComprarLibro ( )

    e l i f s e l f . opcion == 7 :s e l f . e lMos t ra rSoc i o s ( )

    e l i f s e l f . opcion == 8 :s e l f . e lMos t ra rSoc i o sS inL ib ro s ( )

    e l i f s e l f . opcion == 9 :s e l f . e lMostrarSoc iosConLibros ( )

    e l i f s e l f . opcion == 10 :s e l f . e lMostrarSoc iosMorosos ( )

    e l i f s e l f . opcion == 11 :s e l f . e l A f i l i a r S o c i o ( )

    e l i f s e l f . opcion == 12 :s e l f . e l D e s a f i l i a r S o c i o ( )

    e l i f s e l f . opcion == 13 :s e l f . s a l i r ( )

    # Constuir mtodo e lMos t ra rL ib ro sD i spon ib l e sde f e lMos t ra rL ib ro sD i spon ib l e s ( s e l f ) :

    # Permite mostrar l o s l i b r o s d i s p on i b l e s en l a b i b l i o t e c a# invocar a l mtodo most ra rL ib ro sDi spon ib l e s de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . mos t ra rL ib ro sDi spon ib l e s ( )

    27

  • # Constuir mtodo e lMost ra rL ibrosPres tadosde f e lMost ra rL ibrosPres tados ( s e l f ) :

    # Permite mostrar l o s l i b r o s pre s tados a l o s s o c i o s# invocar a l mtodo mostrarL ibrosPrestados de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . mostrarL ibrosPrestados ( )

    # Constru i r mtodo e lP r e s t a rL ib r ode f e lP r e s t a rL ib r o ( s e l f ) :

    # Da l a p o s i b i l i d a d de p r e s t a r un l i b r o a un s o c i o# invocar a l mtodo pr e s t a rL ib ro de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . p r e s t a rL ib ro ( )

    # Constuir mtodo e lRe c i b i rL i b r ode f e lRe c i b i rL i b r o ( s e l f ) :

    # Permite a un s o c i o devo lver un l i b r o que tenga en prstamo# invocar a l mtodo r e c i b i r L i b r o de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . r e c i b i r L i b r o ( )

    # Constuir mtodo elDonarLibrode f e lDonarLibro ( s e l f ) :

    # Permite donar un l i b r o a l a b i b l i o t e c a# invocar a l mtodo rec ib i rDonac ion de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . r e c ib i rDonac ion ( )

    # Constuir mtodo elComprarLibrode f elComprarLibro ( s e l f ) :

    # Se usa cuando l a b i b l i o t e c a qu i e r e adqu i r i r un l i b r o a t rav s de# compra# invocar a l mtodo comprarLibro de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . comprarLibro ( )

    # Constuir mtodo e lMos t ra rSoc i o sde f e lMos t ra rSoc i o s ( s e l f ) :

    # Muestra todos l o s s o c i o s de l a b i b l i o t e c a# invocar a l mtodo mostrarSoc ios de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . mostrarSoc ios ( )

    # Constuir mtodo e lMos t ra rSoc i o sS inL ib ro sde f e lMos t ra rSoc i o sS inL ib ro s ( s e l f ) :

    # Muestra l o s s o c i o s que no t i enen l i b r o s en prstamo# invocar a l mtodo most ra rSoc io sS inL ibro s de l ob j e to b i b l i o t e c a

    28

  • s e l f . b i b l i o t e c a . mos t ra rSoc io sS inL ibro s ( )

    # Constuir mtodo e lMostrarSoc iosConLibrosde f e lMostrarSoc iosConLibros ( s e l f ) :

    # Muestra l o s s o c i o s que t i enen l i b r o s en prstamo# invocar a l mtodo mostrarSoc iosConLibros de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . mostrarSoc iosConLibros ( )

    # Constuir mtodo e lMostrarSoc iosMorososde f e lMostrarSoc iosMorosos ( s e l f ) :

    # Muestra a l o s s o c i o s que no entregaron l o s l i b r o s en l o s p l azo s# e s t a b l e c i d o s# invocar a l mtodo mostrarSociosMorosos de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . mostrarSociosMorosos ( )

    # Constuir mtodo e l A f i l i a r S o c i ode f e l A f i l i a r S o c i o ( s e l f ) :

    # Permite dar de a l t a a un nuevo s o c i o# invocar a l mtodo a f i l i a r S o c i o de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . a f i l i a r S o c i o ( )

    # Constuir mtodo e lD e s a f i l i a r S o c i ode f e l D e s a f i l i a r S o c i o ( s e l f ) :

    # Permite dar de baja a un s o c i o de l a b i b l i o t e c a# invocar a l mtodo d e s a f i l i a r S o c i o de l ob j e to b i b l i o t e c as e l f . b i b l i o t e c a . d e s a f i l i a r S o c i o ( )

    # Constru i r mtodo S a l i rde f s a l i r ( s e l f ) :

    # Sa le de l men de opc ionesp r i n t "\n\n"p r i n t "Ha e l e g i d o s a l i r \n\n "p r i n t "\ nPres ione ENTER para cont inuar \n "raw_input ( )re turn

    # Constru i r mtodo mostrar a t r i bu t o sde f __str__( s e l f ) :

    # Muestra l o s a t r i bu t o s de l ob j e to con una breve d e s c r i p c i ns = "\n\n "s += " Atr ibutos de l ob j e to men y una i n s t an c i a de l ob j e to "s += " b i b l i o t e c a "

    29

  • s += "\ nOpcin : " + s t r ( s e l f . opcion )s += "\n\ nAtr ibutos de l ob j e to b i b l i o t e c a in s t anc i ado : \ n\n"s += s t r ( s e l f . b i b l i o t e c a )re turn s

    30

  • 6. 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 es un estupendo lenguaje para aprender a programar, y si a esto se lesuma un cdigo convenientemente distrituido en mdulos y funciones junto con loscomentarios pertinentes, es posible disminuir la probabilidad de bloqueo mentalque sufre nuestro cerebro ante 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.

    31

  • 7. 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

    32

    1 Introduccin2 Anlisis preliminar3 Diseo bsico3.1 Mdulo main3.2 Mdulo libro3.3 Mdulo socio3.4 Mdulo biblioteca3.5 Mdulo validaciones3.6 Mdulo menu

    4 Pseudo-cdigo4.1 Mdulo main4.2 Mdulo libro4.3 Mdulo socio4.4 Mdulo biblioteca4.5 Mdulo validaciones4.6 Mdulo menu

    5 Cdigo Python5.1 Mdulo main5.2 Mdulo libro5.3 Mdulo socio5.4 Mdulo biblioteca5.5 Mdulo validaciones5.6 Mdulo menu

    6 Conclusiones7 Lecturas recomendadas