UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 8 I CICLO 2012 Nota: 100 Laboratorio 8. Funciones y recursión / Diccionarios Estudiante: José David Vargas Quirós Carné: B16945 1. Se modificó el programa creado anteriormente para resolver ecuaciones cuadráticas con soluciones reales o complejas que recibe los coeficientes mediante la consola de forma no interactiva. Ahora el calculo del discriminante y de los valores de x1 y x2 se hace mediante dos funciones. Dicho programa está en el archivo adjunto imaginariosArgvFuncs.py. El nuevo código es el siguiente: # ! / u s r / b i n / python # −*− coding : l a t i n −1 −*− i m p o r t math i m p o r t sys # S i l a c a n t i d a d de argumentos no es c o r r e c t a se muestra un e r r o r i f l e n ( sys . argv ) ! = 4 : p r i n t "Número de argumentos i n c o r r e c t o " p r i n t " Uso : %s a b c " % ( sys . argv [ 0 ] ) sys . e x i t ( 1 ) #Se a = b = c = o b t i e n e n l o s c o e f i c i e n t e s d e l v e c t o r sys . argv f l o a t ( sys . argv [ 1 ] ) f l o a t ( sys . argv [ 2 ] ) f l o a t ( sys . argv [ 3 ] ) # S i a es cero l a e c u a c i ón no es cuadr á t i c a y se muestra un e r r o r i f a == 0 : p r i n t " La e c u a c i ón no es cuadr á t i c a " sys . e x i t ( 1 ) #La f u n c i ón d i s c r i m i n a n t e ( a , b , c ) r e c i b e l o s c o e f i c i e n t e s y a p a r t i r de e l l o s calcula el discriminante y lo retorna def d i s c r i m i n a n t e ( a , b , c ) : d i s c = f l o a t ( b * b−4* a * c ) return disc #La f u n c i ón s o l s ( a , b , c ) r e c i b e l o s c o e f i c i e n t e s y u t i l i z a a l a f u n c i ón d i s c r i m i n a n t e ( a , b , c ) para o b t e n e r e l d i s c r i m i n a n t e . Luego c a l c u l a l a s s o l u c i o n e s y r e t o r n a l a cadena que i n d i c a l a s o l u c i ón . def sols ( a , b , c ) : disc = discriminante (a , b , c ) UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 8 I CICLO 2012 # S i e l d i s c r i m i n a n t e es menor que 0 se c a l c u l a n l a s s o l u c i o n e s complejas i f disc < 0: a1 = (−b ) / ( 2 * a ) b1 = f l o a t ( ( math . s q r t (− d i s c ) ) / ( 2 * a ) ) s o l = " Las s o l u c i o n e s complejas son : \ n %.2 f + %.2 f i \ n %.2 f − %.2 f i " % ( a1 , b1 , a1 , b1 ) # S i e l d i s c r i m i n a n t e es 0 se c a l c u l a l a ú n i c a s o l u c i ón e l i f d i s c == 0 : s o l = f l o a t (−b / 2 * a ) s o l = " La s o l u c i o n es %.2 f " % ( s o l ) #Si e l d i s c r i m i n a n t e else : s o l 1 = f l o a t (( −b + s o l 2 = f l o a t (( −b − s o l = " La s o l u c i ón return sol es mayor que 0 se c a l c u l a n l a s 2 s o l u c i o n e s math . s q r t ( d i s c ) ) / ( 2 * a ) ) math . s q r t ( d i s c ) ) / ( 2 * a ) ) 1 es %.2 f \ nLa s o l u c i ón 2 es %.2 f " % ( sol1 , s o l 2 ) #Se imprime l a cadena con l a s o l u c i ón p r i n t sols (a , b , c ) 2. Se creó un programa capaz de calcular el enésimo término de la sucesión de Fibonacci mediante recursión. El código del archivo adjunto fibonnacci.py es el siguiente: # ! / u s r / b i n / python # −*− coding : l a t i n −1 −*− i m p o r t math i m p o r t sys # S i l a c a n t i d a d de argumentos no es c o r r e c t a se muestra un e r r o r i f l e n ( sys . argv ) ! = 2 : p r i n t "Número de argumentos i n c o r r e c t o " p r i n t " Uso : %s n " % ( sys . argv [ 0 ] ) sys . e x i t ( 1 ) # E l ú n i c o v a l o r que se r e c i b e es l a p o s i c i ón d e l t é rmino en l a s e r i e n = i n t ( sys . argv [ 1 ] ) #La f u n c i ón f i b ( n ) u t i l i z a r e c u r s i ón para c a l c u l a r e l v a l o r d e l enésimo t é rmino def f i b ( n ) : #La r e c u r s i ón se d e t i e n e cuando n es 1 o 0 i f ( n == 0 ) o r ( n == 1 ) : return 1 #La f u n c i ón se l l a m a a s í misma m i e n t r a s n sea mayor a 1 else : r e t u r n f i b ( n−1)+ f i b ( n−2) #Se imprime e l r e s u l t a d o print fib (n) UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 8 I CICLO 2012 3. Se creó un programa que permite administrar información básica sobre estudiantes. Dentro de un diccionario se almacena el carné y el nombre de cada estudiante y es posible añadir estudiantes, ver todos los estudiantes en orden o buscar alguno en específico por número de carné. El programa no utiliza archivos por lo que una vez cerrado se pierden los datos. Además el programa maneja los errores básicos. El código utilizado con los comentarios de explicación es el siguiente (archivo diccionario.py): # ! / u s r / b i n / python # −*− coding : l a t i n −1 −*− i m p o r t math i m p o r t sys #Se crea un d i c c i o n a r i o vac í o diccionario = {} # Este c i c l o i n f i n i t o p e r m i t e que é l programa s i g a desplegando e l menú i n d e f i n i d a m e n t e cade vez que se r e a l i z a una a c c i ón . while 1: #Lo p r i m e r o que se hace es m o s t r a r e l menú . menu = " " " |||||||||||| | | | MENU | | | |||||||||||| \ n 1 . Agregar e s t u d i a n t e \ n 2 . Buscar e s t u d i a n t e \ n 3. L i s t a r estudiantes \ n 4. S a l i r """ p r i n t menu #Se s o l i c i t a a l u s u a r i o una o p c i ón d e l menú o p t = i n t ( r a w _ i n p u t ( " D i g i t e una o p c i ón : " ) ) #La f u n c i ón i n s e r t a r ( ) s o l i c i t a un carn é y nombre a l u s u a r i o y l o e s c r i b e en el diccionario def i n s e r t a r ( ) : carne = " " nombre = " " w h i l e carne == " " : carne = r a w _ i n p u t ( " I n s e r t e e l carn é : " ) w h i l e nombre == " " : nombre = r a w _ i n p u t ( " I n s e r t e e l nombre : " ) #La cadena con e l nombre i n t r o d u c i d o por e l u s u a r i o se separa y se pone cada p a l a b r a ( nombre y a p e l l i d o s ) en mayú s c u l a . Luego l a cadena se une nuevamente . l i s t a = nombre . s p l i t ( ’ ’ ) cont = 0 UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 8 I CICLO 2012 while cont < len ( l i s t a ) : l i s t a [ cont ] = l i s t a [ cont ] . c a p i t a l i z e ( ) c o n t += 1 nombre = " " . j o i n ( l i s t a ) d i c c i o n a r i o [ carne ] = nombre #La f u n c i ón v e r s o l i c i t a un carn é a l u s u a r i o y muestra e l nombre d e l e s t u d i a n t e con ese carn é . S i no hay un e s t u d i a n t e con e l carn é s o l i c i t a d o se muestra un e r r o r . def ver ( ) : carne = r a w _ i n p u t ( " I n s e r t e e l carn é : " ) i f carne i n d i c c i o n a r i o : p r i n t " %s => %s " % ( carne , d i c c i o n a r i o [ carne ] ) else : p r i n t "No hay un e s t u d i a n t e con ese carn é . " #La f u n c i ón l i s t a r ordena e l d i c c i o n a r i o por carn é e imprime todos l o s e s t u d i a n t e s en p a n t a l l a . S i e l d i c c i o n a r i o e s t á vac í o se imprime un e r r o r . def l i s t a r ( ) : i f l e n ( d i c c i o n a r i o ) == 0 : p r i n t "No hay e s t u d i a n t e s almacenados . " else : keys = d i c c i o n a r i o . keys ( ) keys . s o r t ( ) cont = 0; w h i l e c o n t < l e n ( keys ) : p r i n t " %s => %s " % ( keys [ c o n t ] , d i c c i o n a r i o [ keys [ c o n t ] ] ) c o n t += 1 # Esta s e r i e i f / e l s e i n v o c a l a f u n c i ón c o r r e c t a de acuerdo a l a a c c i ón que e l i g i ó el usuario i f o p t == 1 : insertar () e l i f o p t == 2 : ver ( ) e l i f o p t == 3 : listar () e l i f o p t == 4 : sys . e x i t ( 1 ) else : p r i n t " La o p c i ón no e x i s t e . Debe d i g i t a r una o p c i ón d e l menú e n t r e 1 y 4 . "