Está en la página 1de 34

Desarrollo de un programa en Python

para gestionar una biblioteca


Camilo Bernal
19 de agosto de 2014
ndice
1. Introduccin 1
2. Anlisis preliminar 2
3. Diseo bsico 3
3.1. Mdulo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.2. Mdulo libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.3. Mdulo socio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.4. Mdulo biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.5. Mdulo validaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.6. Mdulo menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4. Pseudo-cdigo 6
4.1. Mdulo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2. Mdulo libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.3. Mdulo socio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.4. Mdulo biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.5. Mdulo validaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.6. Mdulo menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5. Cdigo Python 13
5.1. Mdulo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2. Mdulo libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.3. Mdulo socio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.4. Mdulo biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.5. Mdulo validaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.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 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, 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 libros
que se pueden prestar a los diferentes socios. Los socios se pueden aliar a la biblioteca
y luego solicitar hasta tres libros, los cuales pueden conservar en su poder hasta por
10 das. Despus de los 10 das, el socio se considera moroso y se le aplican tres das
de sancin por cada da de retraso. La sancin consiste en la imposibilidad de solicitar
nuevos libros hasta tanto no la cumpla. Un socio aliado puede solicitar la desaliacin
a 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 simular
el paso del tiempo a travs de una variable aleatoria. Cuando el programa funcione, se
ampliar 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, a
n 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 escribir todo el pseudocdigo. Antes de
escribir una sola lnea de cdigo, es muy conveniente tener perfectamente claro cmo
resolver el problema; este pequeo truco ahorrar muchas horas de trabajo y mucha
frustracin.
2
3. Diseo bsico
El programa se construir en mdulos, a n de evitar que los cheros individuales tengan
una cantidad excesiva de cdigo.
Se construirn 6 mdulos: <main>, <libro>, <socio>, <bilioteca>, <validaciones> y
<menu>. En el mdulo <main> se llama a los dems objetos que constituyen el pro-
grama. El mdulo <libro> tiene una clase Libro encargada de fabricar objetos con los
atributos de un libro. El mdulo <socio> tiene la clase Socio, que fabrica objetos con los
atributos de un socio de la biblioteca. El mdulo <biblioteca> contiene la clase Bibliote-
ca, encargada de fabricar objetos para la gestin de una biblioteca. El mdulo <menu>
permite elegir entre una serie de opciones. El mdulo <validaciones> servir para vali-
dar las entradas ingresadas por el usuario del programa. Inicialmente se construirn los
mdulos <main>, <libro>, <socio> y <biblioteca>, y slo cuando estn terminados
se proceder a la construccin del mdulo <validaciones>. El mdulo <menu> ser el
ltimo 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 ni r f unci on main
Expl i car l o que hace
I ns t anc i ar l a c l a s e Bi bl i ot e c a del mdulo <manej o_bi bl i oteca>
I ns t anc i ar l a c l a s e El e gi r del mdulo <menu>
Despl egar l a s opci ones para i nt e r ac t uar con e l us uar i o
3.2. Mdulo libro

De f i ni r c l a s e Li bro
Expl i car l o que hace
I n i c i a l i z a r
Cons t r ui r mtodo para mostrar at r i but os
3.3. Mdulo socio
3

De f i ni r c l a s e Soci o ( Hereda de Li bro )


Expl i car l o que hace
I n i c i a l i z a r
Cons t r ui r mtodo mostrar at r i but os
3.4. Mdulo biblioteca

De f i ni r c l a s e Bi bl i ot e c a ( Hereda de Li bro y de s oc i o )
Expl i car l o que hace
I n i c i a l i z a r
Cons t r ui r mtodo mos t r ar Li br os Di s poni bl es
Cons t r ui r mtodo mos t r ar Li br os Pr es t ados
c o ns t r ui r mtodo pr e s t ar Li br o
c o ns t r ui r mtodo r e c i bi r Li br o
c o ns t r ui r mtodo r e ci bi r Donaci on
c o ns t r ui r mtodo comprarLi bro
Cons t r ui r mtodo mos t r ar Soci os
Cons t r ui r mtodo mostrarSoci osMorosos
Cons t r ui r mtodo mos t r ar Soci os Si nLi br os
Cons t r ui r mtodo mostrarSoci osConLi bros
Cons t r ui r mtodo a f i l i a r S o c i o
Cons t r ui r mtodo d e s a f i l i a r S o c i o
c o ns t r ui r mtodo mostrar at r i but os
3.5. Mdulo validaciones

De f i ni r c l a s e Val i dador
Expl i car l o que hace
I n i c i a l i z a r
Cons t r ui r mtodo val i dar Ti t ul o
Cons t r ui r mtodo val i dar Aut or
Constui r mtodo val i dar Edi c i on
Cons t r ui r mtodo val i darNombre
c o ns t r ui r mtodo val i dar I D
Cons t r ui r mtodo val i dar El e c c i on
Cons t r ui r mtodo mostrar at r i but os
3.6. Mdulo menu
4

De f i ni r c l a s e El e gi r
Expl i car l o que hace
I n i c i a l i z a r
Constui r mtodo des pl egar Oci ones
Constui r mtodo ej ecut ar Opci on
Constui r mtodo e l Mos t r ar Li br os Di s poni bl e s
Constui r mtodo el Mos t r ar Li br os Pr es t ados
Cons t r ui r mtodo e l Pr e s t ar Li br o
Constui r mtodo e l Re c i bi r Li br o
Constui r mtodo el DonarLi bro
Constui r mtodo el ComprarLi bro
Constui r mtodo el Mos t r ar Soc i os
Constui r mtodo e l Mos t r ar Soc i os Si nLi br os
Constui r mtodo el Mos t r ar Soci os ConLi br os
Constui r mtodo el Mos t r ar Soci os Mor os os
Constui r mtodo e l Af i l i a r S o c i o
Constui r mtodo e l De s a f i l i a r S o c i o
Constui r mtodo s a l i r
Cons t r ui r mtodo mostar at r i but os
5
4. Pseudo-cdigo
Una vez realizado el diseo bsico, se puede empezar a escribir el pseudo-cdigo. Para
esto es suciente 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 ni r f unci on main
I ns t anc i ar l a c l a s e Bi bl i ot e c a del mdulo <bi bl i ot e c a >
I ns t anc i ar l a c l a s e El e gi r del mdulo <menu>
Despl egar opci ones para i nt e r ac t uar con e l us uar i o
4.2. Mdulo libro

De f i ni r c l a s e Li bro
Permi te c o ns t r ui r un obj et o con l o s at r i but os de un\
l i br o
I n i c i a l i z a r
I n i c i a l i z a r t i t u l o
I n i c i a l i z a r autor
I n i c i a l z a r n_edi ci on
I n i c i a l i z a r est ado
Cons t r ui r mtodo para mostrar at r i but os
Mostrar l o s at r i but os del obj et o con una breve \
de s c r i pc i n
4.3. Mdulo socio

De f i ni r c l a s e Soci o ( )
Permi te c o ns t r ui r un obj et o con l o s at r i but os y \
mtodos de un s oc i o de bi bl i o t e c a
I n i c i a l i z a r
I n i c i a l i z a r nombre
I n i c i a l i z a r ID
I n i c i a l i z a r est ado
6
I n i c i a l i z a r l i b r o s
I n i c i a l i z a r Pe nal i z ac i on
Cons t r ui r mtodo mostrar at r i but os
Mostrar at r i but os con una breve de s c r i pc i n
4.4. Mdulo biblioteca

De f i ni r c l a s e Bi bl i ot e c a ( Hereda de Li bro , Soci o y \


Val i daci ones )
Permi te c o ns t r ui r un obj et o con l o s at r i but os y \
mtodos de una bi bl i o t e c a
I 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 br o s _di s po ni bl e s
I n i c i a l i z a r l i s t a l i br os _pr e s t ados
I n i c i a l i z a r l i s t a s oc i os _s i n_l i br os
I n i c i a l i z a r l i s t a s oci os _con_l i br os
I n i c i a l i z a r l i s t a soci os_morosos
Cons t r ui r mtodo mos t r ar Li br os Di s poni bl es
Si l i br o s _di s po ni bl e s t i e ne l i b r o s :
Mostrar l i b r o s con c i c l o f o r
Cons t r ui r mtodo mos t r ar Li br os Pr es t ados
Si l i br os _pr e s t ados t i e ne l i b r o s :
Mostrar l i b r o s pr es t ados con c i c l o f o r
c o ns t r ui r mtodo pr e s t ar Li br o ( )
El e gi r un s oc i o al azar
I ndi c ar e l t t u l o del l i br o q s e desea pr e s t ar
Re al i z ar pr oces o ge ne r al de v e r i f i c a c i n
Si cumple con todos l o s r e qui s i t o s , pr et ar e l \
l i br o
c o ns t r ui r mtodo r e c i bi r Li br o ( s oci o , l i br o )
El e gi r un s oc i o al azar
Re al i z ar pr oces o ge ne r al de v e r i f i c a c i n
Re c i bi r l i br o
c o ns t r ui r mtodo r e ci bi r Donaci on
S o l i c i t a r at r i but os del l i br o
Asi gnar estado = di s poni bl e
I ns t anc i ar c l a s e Li bro con datos s o l i c i t a d o s
agr egar obj et o i ns t anc i ado a l i br os _di s po ni bl e s
Agradecer
7
c o ns t r ui r mtodo comprarLi bro
S o l i c i t a r t t u l o at r i but os de l i br o
Asi gnar estado = di s poni bl e
I ns t anc i ar obj et o l i br o con datos s o l i c i t a d o s
agr egar obj et o i ns t anc i ado a l i br o s _di s po ni bl e s
Cons t r ui r mtodo mos t r ar Soci os
i n i c i a r c i c l o f o r s obr e l i s t a s oci os _con_l i br os +\
s oc i os _s i n_l i br os + soci os_morosos
mostrar at r i but os del s oc i o para cada cada uno
Cons t r ui r mtodo mostrarSoci osMorosos
i n i c i a r c i c l o f o r s obr e l i s t a s o c i o s morosos
mostrar at r i but os del s oc i o
Cons t r ui r mtodo mos t r ar Soci os Si nLi br os
i n i c i a r c i c l o f o r s obr e l i s t a s oc i os _s i n_l i br os
mostrar at r i but os del s oc i o
Cons t r ui r mtodo mostrarSoci osConLi bros
i n i c i a r c i c l o f o r s obr e l i s t a s oci os _con_l i br os
mostrar at r i but os del s oc i o
Cons t r ui r mtodo a f i l i a r S o c i o
S o l i c i t a r nombre
S o l i c i t a r ID
Asi gnar estado = normal
Asi gnar l i b r o s = [ ]
Asi gnar pe nal i z ac i on = 0
I ns t anc i ar obj et o s oc i o con l o s datos s o l i c i t a d o s
I nt r oduc i r obj et o en s oc i os _s i n_l i br os
Cons t r ui r mtodo d e s a f i l i a r S o c i o
S o l i c i t a r ID
i n i c i a r c i c l o f o r s obr e s oc i os _s i n_l i br os
Si s e encuentra en s oc i os _s i n_l i br os :
e xt r ae r obj et o de s oc i os _s i n_l i br os
r e t or nar
i n i c i a r c i c l o f o r s obr e s oci os _con_l i br os
Si s e encuentra en s oci os _con_l i br os :
Inf ormar que ant es debe devol ver l o s l i b r o s \
que t i e ne para poder d e s a f i l i a r s e
r e t or nar
i n i c i a r c i c l o f o r s obr e soci os_morosos
Si s e encuentra en soci os_morosos :
Inf ormar que e s t en l a l i s t a de s o c i o s morosos \
y que debe e s pe r ar 10 d as ant es de
i nt e nt ar d e s a f i l i a r s e
8
e xt r ae r s oc i o de soci os_morosos
cambi ar at r i but o estado del obj et o s oc i o a normal
i nt r o duc i r s oc i o a s oc i os _s i n_l i br os
r e t or nar
Si no s e encuentra :
Inf ormar que no s e encontr e l ID c or r e s pondi e nt e \
al s oc i o
c o ns t r ui r mtodo mostrar at r i but os
mostrar at r i but os con una breve de s c r i pc i n
4.5. Mdulo validaciones

De f i ni r c l a s e Val i dador
" " " Permi te c r e ar obj e t os que val i dan l a s ent r adas de\
us uar i o " " "
I n i c i a l i z a r
I n i c i a l i z a r e_val i dar Ti t ul o
I n i c i a l i z a r e_val i darAutor
I n i c i a l i z a r e_val i dar Edi ci on
I n i c i a l i z a r e_validarNombre
I n i c i a l i z a r e_val i darID
Cons t r ui r mtodo val i dar Ti t ul o
# El t t u l o debe t ener al menos 4 c a r a c t e r e s
Si e l t t u l o t i e ne al menos cuat ro c ar ac t e r e s
e_val i dar Ti t ul o val e True
Si no
Avi sar que e l t t u l o no es vl i do
Cons t r ui r mtodo val i dar Aut or
# El autor debe t ener al menos 4 c ar ac t e r e s
Si e l t t u l o t i e ne al menos cuat ro c ar ac t e r e s
e_val i darAutor val e True
Si no
Avi sar que e l nombre de Autor no es vl i do
Constui r mtodo val i dar Edi c i on
# El nmero de e di c i n es un ent er o po s i t i vo
I n i c i a l i z a r es t ados es_entero , es _pos i t i vo a Fal s e
I nt e nt ar c onve r t i r en ent er o
Si s e puede , es_entero val e True
Si es entero , v e r i f i c a r s i es po s i t i vo
Si es pos i t i vo , es _pos i t i vo val e True
Si cumple l a s dos c ondi c i one s :
9
e_val i dar Edi ci on val e True
Si no
Avi sar que e l N de e di c i n no es vl i do
Cons t r ui r mtodo val i darNombre
# El nombre debe t ener al menor 4 c a r a c t e r e s
Si e l nombre t i e ne al menor 4 c a r a c t e r e s
eval i darNombre val e True
Si no
Avi sar que e l nombre del Soci o no es vl i do
c o ns t r ui r mtodo val i dar I D
# ID es un nmero ent er o po s i t i vo de al menos 5 c i f r a s
I n i c i a l i z a r es t ados es_entero , es _pos i t i vo , ti ene_5c_\
o_mas a Fal s e
I nt e nt ar c onve r t i r en un ent er o
Si s e puede , es_entero val e True
Si es entero , v e r i f i c a r s i es po s i t i vo
Si es pos i t i vo , es _pos i t i vo val e True
Si l a l ongi t ud es de al menos 5
tiene_5c_o_mas val e True
Si cumple l a s t r e s c ondi c i one s :
e_val i darID val e True
Si no :
Avi sar que e l ID del s oc i o no es vl i do
c o ns t r ui r mtodo val i dar El e c c i on
La e l e c c i n debe s e r un nmero ent er o ent r e 1 y 13
c o ns t r ui r mtodo mostrar at r i but os
mostrar at r i but os con una breve de s c r i pc i n
4.6. Mdulo menu

De f i ni r c l a s e El e gi r
Construye obj e t os que permi ten e l e g i r de ent r e un men \
de opci ones
I n i c i a l i z a r
# I n i c i a l i z a r opci on
Cons t r ui r mtodo el Des pl egar Opci ones
# Muestra l a s opci ones que t i e ne e l us uar i o
10
Cons t r ui r mtodo ej ecut ar Opci on
# Ej ecuta l a opci n e l e gi da y r et or na a e l De s pl e gar \
Opci ones
Constui r mtodo e l Mos t r ar Li br os Di s poni bl e s
# Permi te mostrar l o s l i b r o s di s po ni bl e s en l a bi bl i o t e c a
i nvocar al mtodo mos t r ar Li br os Di s poni bl es del obj et o \
bi bl i o t e c a
Constui r mtodo el Mos t r ar Li br os Pr es t ados
# Permi te mostrar l o s l i b r o s pr es t ados a l o s s o c i o s
i nvocar al mtodo mos t r ar Li br os Pr es t ados del obj et o \
bi bl i o t e c a
Cons t r ui r mtodo e l e l Pr e s t ar Li br o
# Da l a po s i bi l i da d de s o l i c i t a r un l i br o en prstamo
i nvocar al mtodo s ol i c i t ar Pr e s t amo del obj et o s oc i o
Constui r mtodo e l Re c i bi r Li br o
# Permi te a un s oc i o devol ver un l i br o que tenga en \
# prstamo
i nvocar al mtodo devol ver Li br o del obj et o s oc i o
Constui r mtodo el DonarLi bro
# Permi te donar un l i br o a l a bi bl i o t e c a
i nvocar al mtodo donarLi bro del obj et o s oc i o
Constui r mtodo el ComprarLi bro
# Se usa cuando l a bi bl i o t e c a qui e r e adqui r i r un \
#l i br o a t r av s de compra
i nvocar al mtodo comprarLi bro del obj et o bi bl i o t e c a
Constui r mtodo el Mos t r ar Soc i os
# Muestra todos l o s s o c i o s de l a bi bl i o t e c a
i nvocar al mtodo mos t r ar Soci os del obj et o bi bl i o t e c a
Constui r mtodo e l Mos t r ar Soc i os Si nLi br os
# Muestra l o s s o c i o s que no t i e ne n l i b r o s en prstamo
i nvocar al mtodo mos t r ar Soci os Si nLi br os del obj et o \
bi bl i o t e c a
Constui r mtodo el Mos t r ar Soci os ConLi br os
11
# Muestra l o s s o c i o s que t i e ne n l i b r o s en prstamo
i nvocar al mtodo mostrarSoci osConLi bros del obj et o \
bi bl i o t e c a
Constui r mtodo el Mos t r ar Soci os Mor os os
# Muestra a l o s s o c i o s que no ent r egar on l o s l i b r o s en \
l o s pl azos e s t a bl e c i do s
i nvocar al mtodo mostrarSoci osMorosos del obj et o \
bi bl i o t e c a
Constui r mtodo e l Af i l i a r S o c i o
# Permi te dar de al t a a un nuevo s oc i o
i nvocar al mtodo a f i l i a r S o c i o del obj et o bi bl i o t e c a
Constui r mtodo e l De s a f i l i a r S o c i o
# Permi te dar de baj a a un s oc i o de l a bi bl i o t e c a
i nvocar al mtodo d e s a f i l i a r S o c i o del obj et o bi bl i o t e c a
Cons t r ui r mtodo mostrar at r i but os
# Muestra l o s at r i but os del obj et o con una breve de s c r i pc i n
12
5. 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 escibir cdigo de manera irreexiva es la receta perfecta para la
frustracin: ojal no caigan en ese error.
A continuacin se presenta una propuesta del cdigo en Python, talvez est plagada de
errores, ingenuidades e inconsistencias, pero incluso de eso podemos aprender, y aprender
es el nico objetivo de este documento.
5.1. Mdulo main
#! / usr / bi n/env python
# encodi ng : Lati n1
i mport bi bl i o t e c a
i mport menu
def main ( ) :
" " " Funcion que permi te l l amar a l o s dems componentes del
programa para ge s t i onar una bi bl i o t e c a " " "
# I ns t anc i ar e l obj et o Bi bl i ot e c a del mdulo <manej o_bi bl i oteca>
l a b i b l i o t e c a = bi bl i o t e c a . Bi bl i ot e c a ( )
# I ns t anc i ar e l obj et o El e gi r del mdulo <menu>
menu_de_opciones = menu. El e gi r ( l a b i b l i o t e c a )
# Despl egar opci ones para i nt e r ac t uar con e l us uar i o
menu_de_opciones . des pl egar Opci ones ( )
main ( )
5.2. Mdulo libro
#! / usr / bi n/env python
# encodi ng : Lati n1
c l a s s Li bro ( ) :
13
" " " Permi te c o ns t r ui r un obj et o con l o s at r i but os de un l i br o " " "
# I n i c i a l i z a r
def __init__( s e l f , t i t ul o , autor , n_edi ci on , estado = di s poni bl e ) :
s e l f . t i t u l o = t i t u l o
s e l f . autor = autor
s e l f . n_edi ci on = n_edi ci on
s e l f . est ado = est ado
# Cons t r ui r mtodo para mostrar at r i but os
def __str__( s e l f ) :
# Mostrar l o s at r i but os del obj et o con una breve de s c r i pc i n
s = "\ nAtri butos del l i br o \n"
s += "\ nTi tul o : " + 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 e di c i n : " + s t r ( s e l f . n_edi ci on )
s += "\ nEstado : " + s t r ( s e l f . estado ) + "\n"
r et ur n s
5.3. Mdulo socio
#! / usr / bi n/env python
# encodi ng : Lati n1
c l a s s Soci o ( ) :
" " " Permi te c o ns t r ui r un obj et o con l o s at r i but os y mtodos de un s oc i o de bi bl i o t e c a " " "
# I n i c i a l i z a r
def __init__( s e l f , nombre , ID, est ado = normal , l i b r o s = [ ] , pe nal i z ac i on = 0 ) :
s e l f . nombre = nombre
s e l f . ID = ID
s e l f . estado = est ado
s e l f . l i b r o s = l i b r o s
s e l f . pe nal i z ac i on = pe nal i z ac i on
# Cons t r ui r mtodo mostrar at r i but os
def __str__( s e l f ) :
# Mostrar at r i but os con una breve de s c r i pc i n
s = "\ nAtri butos del s oc 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 . est ado )
s += "\ nLi bros : "
s += "\n"
f o r i i n s e l f . l i b r o s :
s += s t r ( i )
s += "\n\n"
14
s += " Pe nal i z ac i n : " + s t r ( s e l f . pe nal i z ac i on ) + "\n"
r et ur n s
5.4. Mdulo biblioteca
#! / usr / bi n/env python
# encodi ng : Lati n1
i mport random
i mport val i dac i one s
from l i b r o i mport Li bro
from s oc i o i mport Soci o
# De f i ni r c l a s e Bi bl i ot e c a ( )
c l a s s Bi bl i ot e c a ( Li bro , Soci o , val i dac i one s . Val i dador ) :
" " " Permi te c o ns t r ui r un obj et o con l o s at r i but os y mtodos de una bi bl i o t e c a " " "
# I n i c i a l i z a r
def __init__( s e l f ) :
s e l f . l i br o s _di s po ni bl e s = [ ]
s e l f . l i br os _pr e s t ados = [ ]
s e l f . s oc i os _s i n_l i br os = [ ]
s e l f . s oci os _con_l i br os = [ ]
s e l f . soci os_morosos = [ ]
# Cons t r ui r mtodo mos t r ar Li br os Di s poni bl es
def mos t r ar Li br os Di s poni bl es ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do mostrar l o s l i b r o s di s po ni bl e s \n"
# Si l i br o s _di s po ni bl e s t i e ne l i b r o s :
i f l en ( s e l f . l i br o s _di s po ni bl e s ) > 0:
# Mostrar l i b r o s con c i c l o f o r
f o r i i n s e l f . l i br o s _di s po ni bl e s :
pr i nt i
e l s e :
pr i nt "\nNo hay l i b r o s di s po ni bl e s \n"
pr i nt "\ nProceso de v i s ua l i z a c i n f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo mos t r ar Li br os Pr es t ados
def mos t r ar Li br os Pr es t ados ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do mostrar l o s l i b r o s pr es t ados \n"
# Si l i br os _pr e s t ados t i e ne l i b r o s :
i f l en ( s e l f . l i br os _pr e s t ados ) > 0:
# Mostrar l i b r o s pr es t ados con c i c l o f o r
f o r i i n s e l f . l i br os _pr e s t ados :
pr i nt i
e l s e :
pr i nt "\nNo hay l i b r o s pr es t ados \n"
pr i nt "\ nProceso de v i s ua l i z a c i n f i na l i z a do \n"
15
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo pr e s t ar Li br o ( s oci o , t i t u l o )
def pr e s t ar Li br o ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do pr e s t ar un l i br o \n"
# El e gi r a uno de l o s s o c i o s
l i s t a_de _s oc i os = s e l f . s oc i os _s i n_l i br os + s e l f . s oci os _con_l i br os + \
s e l f . soci os_morosos
i f l en ( l i s t a_de _s oc i os ) > 0:
s oc i o = random . choi c e ( l i s t a_de _s oc i os )
e l s e :
pr i nt "\nNo hay s o c i o s \n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
r et ur n
# I ndi c ar e l t t u l o del l i b r o s o l i c i t a d o
whi l e True :
t i t u l o = raw_input ( " T t ul o exacto del l i b r o : \ n" )
i f s e l f . val i dar Ti t ul o ( t i t u l o ) : break
# Re al i z ar pr oces o ge ne r al 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 ndi c ador e s de est ado
( l i br o_di s poni bl e , l i mi t e _l i br os , soci o_moroso)=\
( Fal se , Fal se , Fal s e )
#Re al i z ar pr oces o 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 t a en l i br o s _di s po ni bl e s
f o r i i n s e l f . l i br o s _di s po ni bl e s :
i f t i t u l o == i . t i t u l o :
l i br o_di s poni bl e = True
l i b r o = i
#Ve r i f i c a r que e l s oc i o no haya al canzado e l l mi t e de l i b r o s q
# puede t ener
i f l en ( s oc i o . l i b r o s ) == 3:
l i mi t e _l i br o s = True
#Ve r i f i c a r s i s oc i o es moroso
i f s oc i o . est ado == moroso :
soci o_moroso = True
# Si e l l i b r o no e s t di s poni bl e
i f not l i br o_di s poni bl e :
# I ndi c ar al s oc i o que e l l i b r o no e s t di s poni bl e por e l
# momento
pr i nt "\ nApreci ado ( a ) s oc i o ( a ) : e l l i b r o no e s t di s poni bl e \n"
r et ur n
# Si e l s oc i o ya al canz e l l mi t e de l i b r o s
i f l i mi t e _l i br o s :
# I ndi c ar al s oc i o que t i e ne 3 l i b r o s en su poder y q debe
# de vol ve r l os
pr i nt "\ nEl s oc i o ya t i e ne 3 l i b r o s en prstamo "
pr i nt " Debe devol ver l o s l i b r o s q t i e ne para poder s o l i c i t a r "
pr i nt " ot r o prstamo "
pr i nt "\ nPresi one ENTER para cont i nuar \n"
16
raw_input ( )
r et ur n
# Si es un s oc i o moroso
i f soci o_moroso :
# I ndi c ar al s oc i o que e s t en mora , y que debe
# devol ver l o s l i b r o s que tenga
pr i nt "\ nEl s oc i o s e encuentra en est ado moroso . "
pr i nt " Debe devol ver l o s l i b r o s que tenga "
pr i nt " y e s pe r ar a que termi ne l a pe nal i z ac i n "
# Extraer s oc i o de soci os_morosos
s e l f . soci os_morosos . remove ( s oc i o )
# Ve r i f i c a r at r i but o pe nal i z ac i on del s oc i o
pe nal i z ac i on = s oc i o . pe nal i z ac i on
# Si pe nal i z ac i on > 1:
i f pe nal i z ac i on > 1:
# r e s t a r 1 al at r i but o pe nal i z ac i n
pe nal i z ac i on = 1
s oc i o . pe nal i z ac i on = pe nal i z ac i on
# I nt r oduc i r s oc i o nuevamente a
# soci os_morosos
s e l f . soci os_morosos . append ( s oc i o )
# Si pe nal i z ac i on i gual a 1:
e l s e :
# I gual ar at r i but o pe nal i z ac i on a cer o
s oc i o . pe nal i z ac i on = 0
# Cambiar at r i but o est ado del s oc i o a normal
s oc i o . est ado = normal
# I nt r oduc i r s oc i o en s oc i os _s i n_l i br os
s e l f . s oc i os _s i n_l i br os . append ( s oc i o )
r et ur n
# Si s e cumplen todos l o s r e q u i s i t o s para pr e s t a r l e e l l i b r o
i f not soci o_moroso and not l i mi t e _l i br o s and l i br o_di s poni bl e :
# Extraer l i b r o de l i br os _di poni bl e s
s e l f . l i br o s _di s po ni bl e s . remove ( l i b r o )
# Cambiar est ado de l i b r o a pr es t ado
l i b r o . est ado = prestado
# I nt r oduc i r l i b r o en l i br os _pr e s t ados
s e l f . l i br os _pr e s t ados . append ( l i b r o )
# Extraer s oc i o de s oc i os _s i n_l i br os ( s i e s t )
i f s oc i o i n s e l f . s oc i os _s i n_l i br os :
s e l f . s oc i os _s i n_l i br os . remove ( s oc i o )
# Extraer s oc i o de s oci os _con_l i br os ( s i e s t )
i f s oc i o i n s e l f . s oci os _con_l i br os :
s e l f . s oci os _con_l i br os . remove ( s oc i o )
# Agregar l i b r o al at r i but o l i b r o s del obj et o s oc i o
s oc i o . l i b r o s . append ( l i br o )
# I nt r oduc i r s oc i o a s oci os _con_l i br os
s e l f . s oci os _con_l i br os . append ( s oc i o )
pr i nt "\ nLi bro pr es t ado : " , l i b r o . t i t u l o
pr i nt "\ nSoci o a qui en s e l e pr es t : " , s oc i o . nombre
pr i nt "\ nProceso de prstamo f i na l i z a do con xi t o \n"
pr i nt "\n\n"
17
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo r e c i bi r Li br o ( s oci o , l i b r o )
def r e c i bi r Li br o ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do r e c i b i r un l i b r o \n"
# El e gi r a uno de l o s s o c i o s con l i b r o s
i f l en ( s e l f . s oci os _con_l i br os ) > 0:
s oc i o = random . choi c e ( s e l f . s oci os _con_l i br os )
e l s e :
pr i nt "\nNo hay s o c i o s con l i b r o s \n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
r et ur n
# El e gi r un l i b r o
l i b r o = random. c hoi c e ( s oc i o . l i b r o s )
# Re al i z ar pr oces o ge ne r al de v e r i f i c a c i n
#I n i c i a l i z a r i ndi c ador e s de est ado
( soci o_moroso , entrega_puntual ) = ( Fal se , Fal s e )
#Ve r i f i c a r s i e l s oc i o es moroso
i f s oc i o i n s e l f . soci os_morosos :
soci o_moroso = True
#Ve r i f i c a r ent r ega puntual
i f random . choi c e ( xrange ( 1 , 16) ) <= 10:
entrega_puntual = True
# Si e l s oc i o es moroso
i f soci o_moroso :
# Extraer l i b r o de l i br os _pr e s t ados
s e l f . l i br os _pr e s t ados . remove ( l i b r o )
# Cambiar est ado de l i b r o a di s poni bl e
l i b r o . est ado = di s poni bl e
# I nt r oduc i r l i b r o en l i br o s _di s po ni bl e s
s e l f . l i br o s _di s po ni bl e s . append ( l i br o )
# Extraer s oc i o de soci os_morosos
s e l f . soci os_morosos . remove ( s oc i o )
# Qui tar l i b r o al at r i but o l i b r o s del obj et o s oc i o
s oc i o . l i b r o s . remove ( l i b r o )
# I nt r oduc i r s oc i o en soci os_morosos nuevamente
s e l f . soci os_morosos . append ( s oc i o )
# Si e l s oc i o no es moroso
i f not soci o_moroso :
# Extraer l i b r o de l i br os _pr e s t ados
s e l f . l i br os _pr e s t ados . remove ( l i b r o )
# Cambiar est ado de l i b r o a di s poni bl e
l i b r o . est ado = di s poni bl e
# I nt r oduc i r l i b r o en l i br o s _di s po ni bl e s
s e l f . l i br o s _di s po ni bl e s . append ( l i br o )
# Extraer s oc i o de s oci os _con_l i br os
s e l f . s oci os _con_l i br os . remove ( s oc i o )
# Qui tar l i b r o al at r i but o l i b r o s del obj et o s oc i o
s oc i o . l i b r o s . remove ( l i b r o )
18
# I nt r oduc i r s oc i o en s oc i os _s i n_l i br os s i no t i e ne l i b r o s
# en ot r o caso i nt r o duc i r l o en s oci os _con_l i br os
i f l en ( s oc i o . l i b r o s ) == 0:
s e l f . s oc i os _s i n_l i br os . append ( s oc i o )
e l s e :
s e l f . s oci os _con_l i br os . append ( s oc i o )
# Si l a ent r ega del l i b r o no es puntual
i f not entrega_puntual :
# Extraer l i b r o de l i br os _pr e s t ados ( s i s e puede )
i f l i b r o i n s e l f . l i br os _pr e s t ados :
s e l f . l i br os _pr e s t ados . remove ( l i b r o )
# Cambiar est ado de l i b r o a di s poni bl e
l i b r o . est ado = di s poni bl e
# I nt r oduc i r l i b r o en l i br o s _di s po ni bl e s ( s i no e s t )
i f l i b r o not i n s e l f . l i br o s _di s po ni bl e s :
s e l f . l i br o s _di s po ni bl e s . append ( l i br o )
# Extraer s oc i o de s oci os _con_l i br os
s e l f . s oci os _con_l i br os . remove ( s oc i o )
# Qui tar l i b r o al at r i but o l i b r o s del obj et o s oc i o
# ( s i s e puede )
i f l i b r o i n s oc i o . l i b r o s :
s oc i o . l i b r o s . remove ( l i b r o )
# Cambiar est ado del obj et o s oc i o a moroso
s oc i o . est ado = moroso
# Agregar pe nal i z ac i n a s oc i o
s oc i o . pe nal i z ac i on += random . choi c e ( xrange ( 1 , 11) )
# I nt r oduc i r s oc i o en soci os_morosos
s e l f . soci os_morosos . append ( s oc i o )
pr i nt "\ nEl l i b r o r e c i bi do es : " , l i b r o . t i t u l o
pr i nt "\ nEl s oc i o que l o ent r eg es : " , s oc i o . nombre
pr i nt "\ nProceso de r e c e pc i n f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo r eci bi r Donaci on
def r eci bi r Donaci on ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do r e c i b i r una donaci n\n"
# S o l i c i t a r t t u l o
whi l e True :
t i t u l o = raw_input ( " \ nTi tul o : \ n" )
i f s e l f . val i dar Ti t ul o ( t i t u l o ) : break
# S o l i c i t a r autor
whi l e True :
autor = raw_input ( " \ nAutor : \ n " )
i f s e l f . val i dar Aut or ( autor ) : break
# S o l i c i t a r nmero de e di c i n
whi l e True :
n_edi ci on = raw_input ( " \ nN de e di c i n : \ n " )
i f s e l f . val i dar Edi c i on ( n_edi ci on ) : break
19
# I ns t anc i ar obj et o l i b r o con datos s o l i c i t a d o s
nuevo_l i bro = Li bro ( t i t ul o , autor , n_edi ci on )
# Agregar obj et o i ns t anc i ado a l i br o s _di s po ni bl e s
s e l f . l i br o s _di s po ni bl e s . append ( nuevo_l i bro )
# Agradecer
pr i nt "\nMuchas gr ac i as por su donaci n . "
pr i nt " El l i b r o e s t ar al s e r v i c i o de l a comunidad\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo comprarLi bro
def comprarLi bro ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do comprar un l i b r o \n"
# S o l i c i t a r t t u l o
whi l e True :
t i t u l o = raw_input ( " \ nTi tul o : \ n" )
i f s e l f . val i dar Ti t ul o ( t i t u l o ) : break
# S o l i c i t a r autor
whi l e True :
autor = raw_input ( " \ nAutor : \ n " )
i f s e l f . val i dar Aut or ( autor ) : break
# S o l i c i t a r nmero de e di c i n
whi l e True :
n_edi ci on = raw_input ( " \ nN de e di c i n : \ n " )
i f s e l f . val i dar Edi c i on ( n_edi ci on ) : break
# I ns t anc i ar obj et o l i b r o con datos s o l i c i t a d o s
nuevo_l i bro = Li bro ( t i t ul o , autor , n_edi ci on )
# Agregar obj et o i ns t anc i ado a l i br o s _di s po ni bl e s
s e l f . l i br o s _di s po ni bl e s . append ( nuevo_l i bro )
pr i nt "\ nProceso de compra f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo mos t r ar Soci os
def mos t r ar Soci os ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do mostrar s o c i o s \n"
l i s t a_de _s oc i os = s e l f . s oci os _con_l i br os + s e l f . s oc i os _s i n_l i br os +\
s e l f . soci os_morosos
i f l en ( l i s t a_de _s oc i os ) > 0:
f o r i i n l i s t a_de _s oc i os :
pr i nt i
e l s e :
pr i nt "\nNo hay s o c i o s \n"
pr i nt "\ nProceso de v i s ua l i z a c i n f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo mostrarSoci osMorosos
def mostrarSoci osMorosos ( s e l f ) :
20
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do mostrar l o s s o c i o s morosos \n"
i f l en ( s e l f . soci os_morosos ) > 0:
f o r i i n s e l f . soci os_morosos :
pr i nt i
e l s e :
pr i nt "\nNo hay s o c i o s morosos \n"
pr i nt "\ nProceso de v i s ua l i z a c i n f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo mos t r ar Soci os Si nLi br os
def mos t r ar Soci os Si nLi br os ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do 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 oc i os _s i n_l i br os ) > 0:
f o r i i n s e l f . s oc i os _s i n_l i br os :
pr i nt i
e l s e :
pr i nt "\nNo hay s o c i o s s i n l i b r o s \n"
pr i nt "\ nProceso de v i s ua l i z a c i n f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo mostrarSoci osConLi bros
def mostrarSoci osConLi bros ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do 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 oci os _con_l i br os ) > 0:
f o r i i n s e l f . s oci os _con_l i br os :
pr i nt i
e l s e :
pr i nt "\nNo hay s o c i o s con l i b r o s \n"
pr i nt "\ nProceso de v i s ua l i z a c i n f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo a f i l i a r S o c i o
def a f i l i a r S o c i o ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do a f i l i a r un s oc i o \n"
# S o l i c i t a r nombre
whi l e True :
nombre = raw_input ( " \ nNombre del nuevo s oc i o : \ n " )
i f s e l f . val i darNombre ( nombre ) : break
# S o l i c i t a r ID
whi l e True :
ID = raw_input ( " \ nID del nuevo s oc i o : \ n " )
i f s e l f . val i dar I D ( ID ) : break
# I ns t anc i ar obj et o s oc i o con l o s datos s o l i c i t a d o s
21
nuevo_soci o = Soci o ( nombre , ID)
# I nt r oduc i r obj et o en s oc i os _s i n_l i br os
s e l f . s oc i os _s i n_l i br os . append ( nuevo_soci o )
pr i nt "\ nProceso de a f i l i a c i n f i na l i z a do \n"
pr i nt "\n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo d e s a f i l i a r S o c i o
def d e s a f i l i a r S o c i o ( s e l f ) :
pr i nt "\n\n"
pr i nt "\ nSe ha e l e gi do d e s a f i l i a r un s oc i o \n"
# S o l i c i t a r ID
whi l e True :
ID = raw_input ( " \ nID de s oc i o a d e s a f i l i a r : \ n" )
i f s e l f . val i dar I D ( ID ) : break
# Buscar en s oc i os _s i n_l i br os
f o r i i n s e l f . s oc i os _s i n_l i br os :
i f ID == i . ID:
s e l f . s oc i os _s i n_l i br os . remove ( i )
r et ur n
# Buscar en s oci os _con_l i br os
f o r i i n s e l f . s oci os _con_l i br os :
i f ID == i . ID:
pr i nt "\nDebe devol ver l o s l i b r o s que t i e ne para poder "
pr i nt " d e s a f i l i a r s e \n"
r et ur n
# Buscar en soci os_morosos
f o r i i n s e l f . soci os_morosos :
i f ID == i . ID:
pr i nt "\ nEl s oc i o s e encuentra en est ado moroso , \ n debe "
pr i nt " e s pe r ar 10 d as \
para poder d e s a f i l i a r s e \n"
# Extraer s oc i o de soci os_morosos
s e l f . soci os_morosos . remove ( i )
# Cambiar at r i but o est ado del obj et o s oc i o a normal
i . estado = normal
# I nt r oduc i r s oc i o a s oc i os _s i n_l i br os
s e l f . s oc i os _s i n_l i br os . append ( i )
r et ur n
pr i nt "\nNo s e encontr e l ID del s oc i o . No e s t a f i l i a d o . \ n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
# Cons t r ui r mtodo mostrar at r i but os
def __str__( s e l f ) :
# Mostrar at r i but os con una breve de s c r i pc i n
s = "\ nAtri butos de l a bi bl i o t e c a \n"
s += "\ nLi bros di s po ni bl e s : \ n"
f o r i i n s e l f . l i br o s _di s po ni bl e s :
s += s t r ( i )
s += "\n"
s += "\ nLi bros pr es t ados : \ n"
22
f o r i i n s e l f . l i br os _pr e s t ados :
s += s t r ( i )
s += "\n"
s += "\ nSoci os s i n l i b r o s : \ n"
f o r i i n s e l f . s oc i os _s i n_l i br os :
s += s t r ( i )
s += "\n"
s += "\ nSoci os con l i b r o s : \ n"
f o r i i n s e l f . s oci os _con_l i br os :
s += s t r ( i )
s += "\n"
s += "\ nSoci os morosos : \ n"
f o r i i n s e l f . soci os_morosos :
s += s t r ( i )
s += "\n"
r et ur n s
5.5. Mdulo validaciones
#! / usr / bi n/env python
# encodi ng : Lati n1
c l a s s Val i dador ( ) :
" " " Permi te c r e ar obj e t os que val i dan l a s ent r adas de us uar i o " " "
# I n i c i a l i z a r
def __init__( s e l f ) :
s e l f . e_val i dar Ti t ul o = Fal s e
s e l f . e_val i darAutor = Fal s e
s e l f . e_val i dar Edi ci on = Fal s e
s e l f . e_validarNombre = Fal s e
s e l f . e_val i darID = Fal s e
s e l f . e_val i dar El ecci on = Fal s e
# Cons t r ui r mtodo val i dar Ti t ul o
def val i dar Ti t ul o ( s e l f , t i t u l o ) :
# El t t u l o debe t ener al menos 4 c a r a c t e r e s
i f l en ( t i t u l o ) >= 4:
s e l f . e_val i dar Ti t ul o = True
e l s e :
# Avi sar que e l t t u l o no es vl i do
pr i nt "\ nEl t t u l o i ngr es ado no es vl i do "
pr i nt " Recuerde que debe t ener al menos 4 c a r a c t e r e s \n"
s e l f . e_val i dar Ti t ul o = Fal s e
r et ur n s e l f . e_val i dar Ti t ul o
# Cons t r ui r mtodo val i dar Aut or
def val i dar Aut or ( s e l f , autor ) :
# El autor debe t ener al menos 4 c a r a c t e r e s
i f l en ( autor ) >= 4:
s e l f . e_val i darAutor = True
23
e l s e :
pr i nt "\ nEl nombre del autor no es vl i do "
pr i nt " Recuerde que debe t ener al menos 4 c a r a c t e r e s \n"
s e l f . e_val i darAutor = Fal s e
r et ur n s e l f . e_val i darAutor
# Constui r mtodo val i dar Edi c i on
def val i dar Edi c i on ( s e l f , n_edi ci on ) :
# El nmero de e di c i n es un ent er o po s i t i vo
# I n i c i a l i z a r es t ados es_entero , es _pos i t i vo a Fal s e
( es_entero , es _pos i t i vo ) = ( Fal se , Fal s e )
# I nt e nt ar c onve r t i r en ent er o
t r y :
n_edi ci on = i nt ( n_edi ci on )
es_entero = True
except :
pr i nt "\ nEl nmero de e di c i n i ngr es ado no es vl i do "
pr i nt " Recuerde que debe s e r un ent er o po s i t i vo "
s e l f . e_val i dar Edi ci on = Fal s e
r et ur n s e l f . e_val i dar Edi ci on
# Si es entero , v e r i f i c a r s i es po s i t i vo
i f n_edi ci on > 0:
es _pos i t i vo = True
# Si cumple l a s dos c ondi c i one s :
i f es_entero and es _pos i t i vo :
s e l f . e_val i dar Edi ci on = True
e l s e :
pr i nt "\ nEl nmero de e di c i n i ngr es ado no es vl i do "
pr i nt " Recuerde que debe s e r un ent er o po s i t i vo \n"
s e l f . e_val i dar Edi ci on = Fal s e
r et ur n s e l f . e_val i dar Edi ci on
# Cons t r ui r mtodo val i darNombre
def val i darNombre ( s e l f , nombre ) :
# El nombre debe t ener al menor 4 c a r a c t e r e s
# Si e l nombre t i e ne al menor 4 c a r a c t e r e s
i f l en ( nombre ) >= 4:
s e l f . e_validarNombre = True
e l s e :
pr i nt "\ nEl nombre de s oc i o i ngr es ado no es vl i do "
pr i nt " Recuerde que debe t ener al menos cuat r o c a r a c t e r e s \n"
s e l f . e_validarNombre = Fal s e
r et ur n s e l f . e_validarNombre
# c o ns t r ui r mtodo val i dar I D
def val i dar I D ( s e l f , ID ) :
# ID es un nmero ent er o po s i t i vo de al menos 5 c i f r a s
# I n i c i a l i z a r es t ados es_entero , es _pos i t i vo , tiene_5c_o_mas a Fal s e
( es_entero , es _pos i t i vo , tiene_5c_o_mas ) = ( Fal se , Fal se , Fal s e )
# I nt e nt ar c onve r t i r en un ent er o
t r y :
ID = i nt ( ID)
# Si s e puede , es_entero val e True
24
es_entero = True
except :
# Avi sar que e l ID del s oc i o no es vl i do
pr i nt "\ nEl ID de s oc i o i ngr es ado es i nc o r r e c t o "
pr i nt " Recuerde que debe s e r un nmero ent er o po s i t i vo de al menos "
pr i nt "5 c i f r a s \n"
s e l f . e_val i darID = Fal s e
r et ur n s e l f . e_val i darID
# Si es entero , v e r i f i c a r s i es po s i t i vo
i f ID > 0:
# Si es pos i t i vo , es _pos i t i vo val e True
es _pos i t i vo = True
# Si l a l ongi t ud es de al menos 5
i f l en ( s t r ( ID) ) >= 5:
# tiene_5c_o_mas val e True
tiene_5c_o_mas = True
# Si cumple l a s t r e s c ondi c i one s :
i f es_entero and es _pos i t i vo and tiene_5c_o_mas :
# e_val i darID val e True
s e l f . e_val i darID = True
e l s e :
# Avi sar que e l ID del s oc i o no es vl i do
pr i nt "\ nEl ID de s oc i o i ngr es ado es i nc o r r e c t o "
pr i nt " Recuerde que debe s e r un nmero ent er o po s i t i vo de al menos "
pr i nt "5 c i f r a s \n"
s e l f . e_val i darID = Fal s e
r et ur n s e l f . e_val i darID
# Constui r mtodo val i dar El e c c i on
def val i dar El 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 ent er o ent r e 1 y 13
# I n i c i a l i z a r i ndi c ador e s de est ado a Fal s e
( es_entero , rango_val i do ) = ( Fal se , Fal s e )
#Tratar de c onve r t i r en nmero ent er o
#
t r y :
e l e c c i o n = i nt ( e l e c c i o n )
es_entero = True
except :
pr i nt "\nLa opci n e l e gi da es i nvl i da "
pr i nt " Recuerde que debe i ng r e s ar un nmero ent er o ent r e 1 y 13\n"
s e l f . e_val i dar El ecci on = Fal s e
r et ur n s e l f . e_val i dar El ecci on
#Averi guar s i l a e l e c c i n e s t en e l rango apropi ado
i f e l e c c i o n i n xrange ( 1 , 1 4 ) :
rango_val i do = True
# Si s e cumplen l a s dos c ondi c i one s
i f es_entero and rango_val i do :
s e l f . e_val i dar El ecci on = True
r et ur n s e l f . e_val i dar El ecci on
# Cons t r ui r mtodo mostrar at r i but os
def __str__( s e l f ) :
25
# Mostrar at r i but os con una breve de s c r i pc i n
s = "\ nAtri butos de obj et o Val i dador \n"
s += "\ nEstado de t t u l o del l i b r o : " + s t r ( s e l f . e_val i dar Ti t ul o )
s += "\ nEstado de autor del l i b r o : " + s t r ( s e l f . e_val i darAutor )
s += "\ nEstado de N e di c i n del l i b r o : " + s t r ( s e l f . e_val i dar Edi ci on )
s += "\ nEstado de Nombre del s oc i o : " + s t r ( s e l f . e_validarNombre )
s += "\ nEstado de ID del s oc i o : " + s t r ( s e l f . e_val i darID ) + "\n"
r et ur n s
5.6. Mdulo menu
#! / usr / bi n/env python
# encodi ng : Lati n1
i mport bi bl i o t e c a
i mport val i dac i o ne s
c l a s s El e gi r ( val i da c i one s . Val i dador ) :
" " " Construye obj e t os que permi ten e l e g i r de ent r e un men de opci ones " " "
# I n i c i a l i z a r
def __init__( s e l f , bi bl i o t e c a ) :
s e l f . bi bl i o t e c a = bi bl i o t e c a
s e l f . opci on = 13
# Cons t r ui r mtodo des pl egar Opci ones
def des pl egar Opci ones ( s e l f ) :
# Muestra l a s opci ones que t i e ne e l us uar i o
pr i nt "\n\n\n\n\n\n\n\n\n\n\n\n"
pr i nt "\n============================================="
pr i nt "GESTIN DE BILIOTECA"
pr i nt "=============================================\n"
pr i nt "\ nPor f avor , e l i j a una opci on : \ n"
pr i nt "\ n1 \tMostrar l i b r o s di s po ni bl e s "
pr i nt "2 \tMostrar l i b r o s pr es t ados "
pr i nt "3 \t Pr e s t ar l i br o "
pr i nt "4 \t Re c i bi r l i br o "
pr i nt "5 \t Re c i bi r donaci n "
pr i nt "6 \tComprar l i br o "
pr i nt "7 \tMostrar s o c i o s "
pr i nt "8 \tMostrar s o c i o s s i n l i b r o s "
pr i nt "9 \tMostrar s o c i o s con l i b r o s "
pr i nt "10 \tMostrar s o c i o s morosos "
pr i nt "11 \ t Af i l i a r s oc i o "
pr i nt "12 \ t De s a f i l i a r s oc i o "
pr i nt "13 \ t S a l i r \n\n"
26
whi l e True :
pr i nt " I ngr e s e opci on y pr e s i one ENTER: \ n"
opci on = raw_input ( )
i f s e l f . val i dar El e c c i on ( opci on ) : break
s e l f . opci on = i nt ( opci on )
s e l f . ej ecut ar Opci on ( )
i f s e l f . opci on != 13:
s e l f . des pl egar Opci ones ( )
# Constui r mtodo ej ecut ar Opci on
def ej ecut ar Opci on ( s e l f ) :
i f s e l f . opci on == 1:
s e l f . e l Mos t r ar Li br os Di s poni bl e s ( )
e l i f s e l f . opci on == 2:
s e l f . el Mos t r ar Li br os Pr es t ados ( )
e l i f s e l f . opci on == 3:
s e l f . e l Pr e s t ar Li br o ( )
e l i f s e l f . opci on == 4:
s e l f . e l Re c i bi r Li br o ( )
e l i f s e l f . opci on == 5:
s e l f . el DonarLi bro ( )
e l i f s e l f . opci on == 6:
s e l f . el ComprarLi bro ( )
e l i f s e l f . opci on == 7:
s e l f . e l Mos t r ar Soci os ( )
e l i f s e l f . opci on == 8:
s e l f . e l Mos t r ar Soc i os Si nLi br os ( )
e l i f s e l f . opci on == 9:
s e l f . el Mos t r ar Soci os ConLi br os ( )
e l i f s e l f . opci on == 10:
s e l f . el Mos t r ar Soci os Mor os os ( )
e l i f s e l f . opci on == 11:
s e l f . e l Af i l i a r S o c i o ( )
e l i f s e l f . opci on == 12:
s e l f . e l De s a f i l i a r S o c i o ( )
e l i f s e l f . opci on == 13:
s e l f . s a l i r ( )
# Constui r mtodo e l Mos t r ar Li br os Di s poni bl e s
def e l Mos t r ar Li br os Di s poni bl e s ( s e l f ) :
# Permi te mostrar l o s l i b r o s di s po ni bl e s en l a bi bl i o t e c a
# i nvocar al mtodo mos t r ar Li br os Di s poni bl es del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . mos t r ar Li br os Di s poni bl es ( )
27
# Constui r mtodo el Mos t r ar Li br os Pr es t ados
def el Mos t r ar Li br os Pr es t ados ( s e l f ) :
# Permi te mostrar l o s l i b r o s pr es t ados a l o s s o c i o s
# i nvocar al mtodo mos t r ar Li br os Pr es t ados del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . mos t r ar Li br os Pr es t ados ( )
# Cons t r ui r mtodo e l Pr e s t ar Li br o
def e l Pr e s t ar Li br o ( s e l f ) :
# Da l a po s i bi l i da d de pr e s t ar un l i br o a un s oc i o
# i nvocar al mtodo pr e s t ar Li br o del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . pr e s t ar Li br o ( )
# Constui r mtodo e l Re c i bi r Li br o
def e l Re c i bi r Li br o ( s e l f ) :
# Permi te a un s oc i o devol ver un l i br o que tenga en prstamo
# i nvocar al mtodo r e c i bi r Li br o del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . r e c i bi r Li br o ( )
# Constui r mtodo el DonarLi bro
def el DonarLi bro ( s e l f ) :
# Permi te donar un l i br o a l a bi bl i o t e c a
# i nvocar al mtodo r ec i bi r Donac i on del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . r ec i bi r Donac i on ( )
# Constui r mtodo el ComprarLi bro
def el ComprarLi bro ( s e l f ) :
# Se usa cuando l a bi bl i o t e c a qui e r e adqui r i r un l i br o a t r av s de
# compra
# i nvocar al mtodo comprarLi bro del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . comprarLi bro ( )
# Constui r mtodo el Mos t r ar Soc i os
def e l Mos t r ar Soc i os ( s e l f ) :
# Muestra todos l o s s o c i o s de l a bi bl i o t e c a
# i nvocar al mtodo mos t r ar Soci os del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . mos t r ar Soci os ( )
# Constui r mtodo e l Mos t r ar Soc i os Si nLi br os
def e l Mos t r ar Soc i os Si nLi br os ( s e l f ) :
# Muestra l o s s o c i o s que no t i e ne n l i b r o s en prstamo
# i nvocar al mtodo mos t r ar Soci os Si nLi br os del obj et o bi bl i o t e c a
28
s e l f . bi bl i o t e c a . mos t r ar Soci os Si nLi br os ( )
# Constui r mtodo el Mos t r ar Soci os ConLi br os
def el Mos t r ar Soci os ConLi br os ( s e l f ) :
# Muestra l o s s o c i o s que t i e ne n l i b r o s en prstamo
# i nvocar al mtodo mostrarSoci osConLi bros del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . mostrarSoci osConLi bros ( )
# Constui r mtodo el Mos t r ar Soci os Mor os os
def el Mos t r ar Soci os Mor os os ( s e l f ) :
# Muestra a l o s s o c i o s que no ent r egar on l o s l i b r o s en l o s pl az os
# e s t a bl e c i do s
# i nvocar al mtodo mostrarSoci osMorosos del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . mostrarSoci osMorosos ( )
# Constui r mtodo e l Af i l i a r S o c i o
def e l Af i l i a r S o c i o ( s e l f ) :
# Permi te dar de al t a a un nuevo s oc i o
# i nvocar al mtodo a f i l i a r S o c i o del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . a f i l i a r S o c i o ( )
# Constui r mtodo e l De s a f i l i a r S o c i o
def e l De s a f i l i a r S o c i o ( s e l f ) :
# Permi te dar de baj a a un s oc i o de l a bi bl i o t e c a
# i nvocar al mtodo d e s a f i l i a r S o c i o del obj et o bi bl i o t e c a
s e l f . bi bl i o t e c a . d e s a f i l i a r S o c i o ( )
# Cons t r ui r mtodo Sa l i r
def s a l i r ( s e l f ) :
# Sal e del men de opci ones
pr i nt "\n\n"
pr i nt "Ha e l e gi do s a l i r \n\n"
pr i nt "\ nPresi one ENTER para cont i nuar \n"
raw_input ( )
r et ur n
# Cons t r ui r mtodo mostrar at r i but os
def __str__( s e l f ) :
# Muestra l o s at r i but os del obj et o con una breve de s c r i pc i n
s = "\n\n"
s += " At r i but os del obj et o men y una i ns t anc i a del obj et o "
s += " bi bl i o t e c a "
29
s += "\ nOpcin : " + s t r ( s e l f . opci on )
s += "\n\ nAtri butos del obj et o bi bl i o t e c a i ns t anc i ado : \ n\n"
s += s t r ( s e l f . bi bl i o t e c a )
r et ur n s
30
6. 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 es un estupendo lenguaje para aprender a programar, y si a esto se le
suma un cdigo convenientemente distrituido en mdulos y funciones 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 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 en
google los cheros 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