UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 I CICLO 2012 LABORATORIO 8 FUNCIONES Y RECURSIÓN DICCIONARIOS CHRISTIAN CHAVES BEJARANO A81740 1. Modifique el programa para solucionar ecuaciones cuadráticas implementado en los laboratorios 7 y 8 para que utilice funciones. Implemente una función que calcule el discriminante y otra que encuentre y retorne los valores de x 1 y x 2 Mediante el siguiente código desarrollado en lenguaje de Python se soluciona el problema propuesto, en un primer código se propone la solución mediante el ingreso de valores con raw.input() en una segunda propuesta se utiliza la variable sys.argv esto con la finalidad de abarcar los dos tipos de métodos para el ingreso de valores vistos en los laboratorios pasados. A diferencia de los laboratorios anteriores se sustituye las soluciones mediante funciones implementadas a lo largo todo el código por una funcion declarada con deb función() que es llamada cuando es necesita sin necesidad de ingresar de nuevo todo el código que involucra dicha función: Mediante raw input #!/ usr / bin / python # Declara la direccion absoluta del ejecutor de python # -*- coding : utf -8 -*- # Permite agregar tildes y otros simbolos import math # Importa la libreria math, que permite utilizar operaciones y funciones matematicas # Se definen las funcione a utilizar # Se define el metodo que calcula el discriminante def discriminante (a, b, c): discriminante =b*b -(4* a* c) return discriminante # Se define el metodo que calcula la funcion cuadratica def cuadratica (a, b, discriminante ): if discriminante < 0: # Si el discriminante es menor a cero se implementa para raices complejas print " Las raices son complejas " real =( -b /(2* a)) imaginario = math. sqrt ( -1* discriminante ) /(2* a) print " Solucion 1 es x1: \ n %.1f + %.1f j" % ( real, imaginario ) print " Solucion 2 es x2: \ n %.1f - %.1f j" % ( real, imaginario ) print " Las raices son reales " # De otra manera las soluciones seran unicamente reales solucion1 = (-b+ math. sqrt ( discriminante )) /(2* a) solucion2 = (-b- math. sqrt ( discriminante )) /(2* a) 1
print " Solucion 1 es x1:" print solucion1 print " Solucion 2 es x2:" print solucion2 print " Este programa calcula una ecuacion ax2 + bx +c =0 con a distinto de 0" # Breve explicacion del objetivo del presente programa a = raw_ input (" Ingrese el digito a: ") b = raw_ input (" Ingrese el digito b: ") c = raw_ input (" Ingrese el digito c: ") # Se declaran las variables para que sean introducidas por el usuario de forma interactiva if(a. isalpha ()): elif (b. isalpha ()): elif (c. isalpha ()): print " Espere " # Este if and else permite indicar que las variables a,b, c deben ser numeros, si son numeros continua sino indica que debe ser ingresado un numero a= float (a) b= float (b) c= float (c) # Convierte los strings ingresados por el usuario en numeros con decimales float discriminante = discriminante (a, b, c)# Se llama la funcion discriminante print " El discriminante es:" print discriminante # Determina el discrimante y lo imprime... cuadratica (a, b, discriminante ) # Determina la funcion cuadratica e imprime La ejecución del mismo se puede observar en la terminal mediante el comando python nombredelarchivo.py, donde el usuario ingresa los valores deseados a como se le indica en la terminal: Mediante sys argv #!/ usr / bin / python # -*- coding : latin -1 -*- # Permite agregar tildes y otros simbolos import sys # Importa la libreria sys, que permite el uso de variables argv import math # Importa la libreria math, que permite utilizar operaciones y funciones matematicas # Se definen las funcione a utilizar 2
Figura 1: Ecuación cuadrática mediante funciones y raw input # Se define el metodo que calcula el discriminante def discriminante (a, b, c): discriminante =b*b -(4* a* c) return discriminante # Se define el metodo que calcula la funcion cuadratica def cuadratica (a, b, discriminante ): if discriminante < 0: # Si el discriminante es menor a cero se implementa para raices complejas print " Las raices son complejas " real =( -b /(2* a)) imaginario = math. sqrt ( -1* discriminante ) /(2* a) # Se utiliza el metodo discriminante dentro de la funcion cuadratica print " Solucion 1 es x1: \ n %.1f + %.1f j" % ( real, imaginario ) print " Solucion 2 es x2: \ n %.1f - %.1f j" % ( real, imaginario ) print " Las raices son reales " # De otra manera las soluciones seran unicamente reales solucion1 = (-b+ math. sqrt ( discriminante )) /(2* a) #Se utiliza el metodo discriminante dentro de la funcion cuadratica solucion2 = (-b- math. sqrt ( discriminante )) /(2* a) print " Solucion 1 es x1:" print solucion1 print " Solucion 2 es x2:" print solucion2 print " Este programa calcula una ecuacion ax2 + bx +c =0 con a distinto de 0" # Breve explicacion del objetivo del presente programa a= sys. argv [1] b= sys. argv [2] c= sys. argv [3] # Utiliza la variable argv para direccionar los valores ingresados por el 3
usuario while len ( sys. argv )!=4: print " Cantidad de valores incorrectos " print " Uso : %s A B C" %sys. argv [0] sys. exit (1) # Este while obliga al programa a utilizar solo tres valores, sino indica que hay error if(a. isalpha ()): elif (b. isalpha ()): elif (c. isalpha ()): print " Espere " # Este if and else permite indicar que las variables a,b, c deben ser numeros, si son numeros continua sino indica que debe ser ingresado un numero a= float ( sys. argv [1]) b= float ( sys. argv [2]) c= float ( sys. argv [3]) # Convierte los strings ingresados por el usuario en numeros con decimales float discriminante = discriminante (a, b, c)# Se llama la funcion discriminante print " El discriminante es:" print discriminante # Determina el discrimante y lo imprime... cuadratica (a, b, discriminante ) # Determina la funcion cuadratica e imprime La ejecución del mismo se puede observar en la terminal mediante el comando python nombredelarchivo.py a b c, donde los terminos a b c representan las constantes de la función cuadrática deseados por el usuario, los siguientes gráficos muestran la ejecución del programa: Figura 2: Ecuación cuadrática mediante funciones y sys.argv 2. Escriba un programa que encuentre el n-esimo término de la sucesión de Fibonacci: 4
F ib(n) = { 1 si n = {0, 1} F ib(n 1) + F ib(n 2) si n > 1. El presente programa ha sido desarrollado de forma recursiva para el calculo del n-esimo término de la sucesión de Fibonacci, el siguiente código muestra la solución propuesta: #!/ usr / bin / python # -*- coding : latin -1 -*- # Permite agregar tildes y otros simbolos import sys # Importa la libreria sys, que permite el uso de variables argv import math # Importa la libreria math, que permite utilizar operaciones y funciones matematicas print " Este programa encuentra el n- esimo termino de la sucesion Fibonacci " # Breve explicacion del objetivo del presente programa # Funcion Fibonacci mediante recursion a utilizar def Fib (n): if n ==0: # En algunos documentos se indica que si n es igual a cero, el fibonacci es cero sin embargo se especifica otra cosa en el enunciado return 1 elif n ==1: return 1 return Fib (n -1) + Fib (n -2) sys. argv. remove ( parte2. py ) # Dado que la lista incluye el nombre del archivo en la posicion cero este debe ser removido n= sys. argv [0] # Se redefine el termino n en la posicion n if ( n. isalpha ()):# Para solucionar el error si se ingresa una letra en lugar de un entero sys. exit (1) elif len ( sys. argv )!=1: # Solo se debe ingresar un n por lo tanto se corrije el error que involucre que se ingresen mas valores print " Solo se puede calcular para un n- esimo termino " sys. exit (1) # El elif permite indicar el error de que se trate de ordenar menos de dos valores lo cual no tendria sentido # Se calcula el fibonacci de manera recursiva y se imprime n= int (n) Fib = Fib (n) print Fib 5
Este código muestra la utilización de la función sys.argv() mediante el cual se ingresa el valor n deseado para el cálculo de la sucesión de Fibonacci, la siguiente ilustración muestra la funcionabilidad del mismo: Figura 3: Programa que calcula el n-esimo termino de Fibonacci 3. Escriba un programa para administrar información de estudiantes de la Universidad de Costa Rica. El programa almacenará dentro de un diccionario el carné (llave) y el nombre (valor) de los estudiantes y le permitirá a los usuarios listar todos los estudiantes u obtener el nombre de un usuario específico. El programa debe proporcionar al usuario un menú con 3 opciones: a) Introducir la información de un estudiante: Solicita al usuario los datos de un estudiante (nombre y carné) y los almacena en el diccionario. El nombre del estudiante debe almacenarse con la primera letra del nombre y los apellidos en mayúscula y las demás en minúscula, sin importar como lo haya introducido el usuario. b) Ver la información de un estudiante: Solicita al usuario un carné e imprime el nombre asociado o bien un error si el carné no está en el diccionario. c) Listar todos los estudiantes: Imprime el carné y el nombre de todos los estudiantes, ordenado por carné. Cada una de las operaciones del programa debe implementarse en una función independiente. El programa debe tener control de errores básico (deben imprimirse mensajes de error claros si la cantidad de argumentos es incorrecta, si el diccionario está vacío, si no se puede encontrar un carné, etc. Mediante el siguiente código, se propone la solucion al problema descrito, en este caso el manejo de funciones y de diccionariios es de gran importancia de hecho es la base a la solución del problema. Inicialmente se describen cada una de las funciones a agregar estas son: agregar un estudiante, ver si existe un estudiante y por último listar todos los estudiantes incluidos. #!/ usr / bin / python # -*- coding : utf -8 -*- # # Declara la direccion absoluta del ejecutor de python y el descodificador agregar tildes y otros simbolos import sys # Importa la libreria sys, que permite el uso de variables argv 6
import math # Importa la libreria math, que permite utilizar operaciones y funciones matematicas print " Este programa permite administrar informacion de estudiantes de la Universidad de Costa Rica " # Breve explicacion del objetivo del presente programa # Se definen las funciones a utilizar # Se define el metodo para agregar un nuevo estudiante def estudiante ( administrador ): # Se solicita ingresar el carne del nuevo estudiante carne = raw_ input (" Ingrese el carne del estudiante a incluir : ") if len ( carne )!=6: # Se trabaja con 6 digitos el carne porque este es el utilizado por la universidad print "\ nel carne debe ser de seis digitos \ n" # Se solicita que se ingrese el nombre del estudiante nombreestudiante = raw_ input (" Ingrese el nombre del estudiante : ") # Se separa el nombre en partes para analizar cuantos nombres posee nombre = nombreestudiante. split (" ") if len ( nombre ) ==4: # Si posee dos nombres se analiza de la siguiente manera nombre1, nombre2, apellido1, apellido2 = nombreestudiante. split (" ") # Para poner la primera letra en mayuscula y las demas en minuscula nombre1 = nombre1. capitalize () nombre2 = nombre2. capitalize () apellido1 = apellido1. capitalize () apellido2 = apellido2. capitalize () carne = carne. capitalize () nombre = ( nombre1, nombre2, apellido1, apellido2 ) nombreestudiante =. join ( nombre ) # Se une de nuevo el nombre administrador [ carne ]= nombreestudiante # Asignamos cada carne con el nombre respectivo print "\ nse ha incluido el estudiante \ n" # Se imprime indicacion de que se ha incluido el estudiante # Si el estudiante solo posee un nombre se trabaja de la siguiente manera elif len ( nombre ) ==3: nombre1, apellido1, apellido2 = nombreestudiante. split (" ") # Para poner la primera letra en mayuscula y las demas en minuscula nombre1 = nombre1. capitalize () apellido1 = apellido1. capitalize () apellido2 = apellido2. capitalize () carne = carne. capitalize () nombre = ( nombre1, apellido1, apellido2 ) nombreestudiante =. join ( nombre ) administrador [ carne ]= nombreestudiante print "\ nse ha incluido el estudiante \ n" # Indica error si no se ha ingresado el nombre completo print " Debe ingresar el nombre completo del estudiante con un maximo de dos nombres " 7
# Definimos metodo para buscar si existe un estudiante con cierto carne def verestudiante ( administrador ): # Se solicita al usuario que ingrese el carne carnesolicitado = raw_ input (" Ingrese el carne a buscar : ") # Esto es por si el carne es ingresado de la siguiente manera a81740 con la primera letra en minuscula if carnesolicitado. capitalize () in administrador : # Si se encuentra el estudiante se imprime el nombre print "\ ncarne : %s \ nestudiante : %s\ n" %( carnesolicitado, administrador [ carnesolicitado ]) # De lo contrario se indica el error print "\ nel estudiante no se ha encontrado \ n" # Metodo para imprimir la lista de estudiantes def listarnombres ( administrador ): # Si la cantidad de carnes es igual a cero entonces se indica el error if len ( administrador ) ==0: print "\ nno se han agregado estudiantes \ n" # De lo contrario se imprime cada uno de los pares carne nombre en forma ordenada por carnes i=0 while i < len ( administrador. items ()): ordenado = sorted ( administrador. items ()) print ordenado [ i] i +=1 # Se crea el diccionario vacio inicialmente administrador ={} # Para evitar que el programa abandone a= True while a: # Se pregunta al usuario que desea realizar print " Que desea realizar? \ n 1) Ingresar un estudiante nuevo \ n 2) Buscar un estudiante \ n 3) Ver todos los estudiantes \ n" # Se ingresa la opcion opcion = raw_ input (" Escoja un numero y presione enter : ") if opcion. isalpha (): print "\ ndebe ingresar un numero \ n" elif opcion =="1": estudiante ( administrador ) elif opcion =="2": verestudiante ( administrador ) elif opcion =="3": listarnombres ( administrador ) a= False La ejecución del mismo se puede observar en la terminal mediante el comando python nombredelarchivo.py, 8
en este caso se trabaja con la a y d para mostrar la ejecución de ambas formas de ordenamiento: Figura 4: Administrador de estudiantes 9