Descomposición de problemas: funciones por Alicia Beatriz Paur Este documento adapta ejercitación de la Guía de Trabajos Prácticos de la asignatura Algorítmica y Programación I, carrera: Licenciatura en Sistemas y Analista Programador Universitario-Facultad de Ingeniería (UNPSJB, sede Trelew) con la finalidad de generar objetos de aprendizaje (OA) de menor granularidad y mayor modularidad tendientes a aumentar su reusabilidad en diferentes contextos. La guía de trabajos prácticos de Algorítmica y Programación I ha sido desarrollada por los docentes de esa cátedra entre los que se incluye la autora de esta adaptación. El objetivo de este OA es practicar el concepto de descomposición de problemas, especialmente las funciones, su definición, especificación, parámetros formales, reales y también la introducción del concepto de recursividad. Subproblemas 1- ¿Qué subproblemas se presentan para determinar si tres números que pretenden representar día, mes y año conforman una fecha? 2- ¿Qué subproblemas se presentan para aceptar como válida la inscripción de un alumno en alguna materia de su carrera? 3- Reconoce en los siguientes enunciados: Para cada subproblema encontrado, qué datos debieran ser comunicados desde el algoritmo que los invoca y qué datos debieran ser devueltos por el subalgoritmo. a) De una lista de facturas a pagar, se quiere saber cuántos días faltan para su primer y segundo vencimiento y el importe del interés resultante si se optara por el segundo vencimiento MontoInterés = Monto * TasaDiaria / 100 * CantDiasSegVcto). b) Un doctor desea obtener un listado de sus pacientes que sufren de Diabetes y de ellos cuales hace más de un mes que no concurren a una visita (Nombre completo, teléfono y fecha completa de última visita). Para ello tiene registrado los resultados de nivel de insulina del último análisis de cada paciente. c) Emitir la liquidación de sueldos de cada empleado con detalle de nombre y apellido, importe bruto, importe de cada descuento de ley e importe neto a pagar. De cada empleado se informa la cantidad de horas trabajadas y su categoría. El importe bruto de cada empleado depende de las horas trabajadas y el valor/hora. Cada categoría tiene fijado el valor de la hora trabajada. Los descuentos jubilatorios, de obra social y de seguro, se aplican sobre el importe bruto con un porcentaje fijo propio de cada uno de ellos. Funciones 1- Identifica si las siguientes definiciones de funciones son correctas. En caso de no serlo explica el error: a) Función promedio (E n1, n2: entero) (*Devuelve el promedio de dos números *) Inicio prom ← (n1 + n2) / 2 Fin b) Función esDigito (E c: caracter): lógico (*Devuelve verdadero si el carácter recibido corresponde a un dígito, caso contrario devuelve Falso *) Inicio esDigito ← c <= ‘9’ y c >= '0' Fin c) Función menor (E n1,n2: entero): lógico (*Devuelve el valor menor entre n1 y n2 *) Inicio si n1 < n2 entonces menor ← n1 sino menor ← n2 finSi Fin d) Función esDigito (E c: caracter): lógico (*Devuelve verdadero si el carácter recibido es un dígito, caso contrario devuelve Falso *) Inicio si c <= ‘9’ y c >= '0' entonces esDigito ←Verdadero finSi Fin 2- Diseña una función esMinúscula, que devuelva verdadero si la letra que recibe es minúscula, caso contrario devuelve falso. ¿Qué parámetro recibe? ¿Tipo? 3- En el siguiente algoritmo, distingue la invocación y la definición de cada función, los parámetros formales y los reales o actuales. Realiza la traza del mismo para determinar qué hace el algoritmo cuentaCaracteres. a) Indica los valores mostrados, si la entrada de datos es 3 x + 2 y = 5 xyz. Algoritmo cuentaCaracteres Var car: caracter cantL, cantD, cantO: entero Inicio cantL ← 0 cantD ← 0 cantO ← 0 repetir mostrar(“Ingrese un carácter”) ingresar (car) si esLetra(car) entonces cantL ← cantL + 1 sino si esDigito(car) entonces cantD ← cantD + 1 sino cantO ← cantO + 1 finSi finSi hasta car = ´.´ mostrar (“Letras:“, cantL, “ Digitos:“ , cantD, “ Otros:“, cantO) Fin Función esDigito (E c: caracter): lógico (*Devuelve verdadero si el carácter recibido es un dígito, caso contrario devuelve Falso *) Inicio esDigito ← c <= ‘9’ y c >= '0' Fin Función esLetra (E c: caracter): lógico (*Devuelve verdadero si el carácter recibido es una letra del alfabeto, caso contrario devuelve Falso *) Inicio .... resuelto en ejercicio anterior ... Fin b) Indica los valores mostrados por el siguiente algoritmo, si la entrada de datos es 3 0.0 1.0 4.0 1.0 7.0 5.0 Algoritmo Longitud Var pX, pY, oX, oY, tramo: real i, cant: entero Inicio mostrar(“Ingrese las veces que desea procesar datos”) ingresar (cant) oX ← oY ← tramo ← Desde i← 1 hasta cant hacer mostrar(“Ingrese valores para pX y pY”) ingresar (pX, pY) tramo ← distancia(pX,pY,oX,oY) + tramo oX ← pX oY ← pY finDesde mostrar (“La longitud total es: ”, tramo) Fin Función distancia (E x1,y1,x2,y2: real): real (*Devuelve la distancia entre los puntos (x1,y1) y (x2,y2) *) Var dX, dY: real Inicio dX ← x2 – x1 dY ← y2 – y1 distancia ← rc(dX * dX + dY * dY) Fin 4- Diseña una función cantMayusculas que dada una cadena retorne la cantidad de letras mayúsculas que contiene. 5- Diseña una función llamada valorDígito que reciba un carácter y devuelva su valor numérico, en caso que el carácter recibido no corresponda a un número la función devolverá –1. Ejemplo: si c= ‘5’ retorna 5, pero si c = ‘a’ retorna –1. Nota: Recuerde que la representación interna de un carácter es diferente de la representación interna de un entero. Aunque visualmente los humanos veamos ‘5’ y 5 semejantes, son dos representaciones y dos tipos de datos bien diferentes para la máquina. 6- Diseña una función valorNumérico, que dada una cadena, la convierta en un número entero; en caso de no poder hacerlo: devuelva el número –1 (error); en caso de poder hacerlo: devuelva el número entero correspondiente (OK). (observación: no se considerarán números negativos, es decir que aceptará como correctas las cadenas que sólo contengan números, cualquier otro símbolo será tomado como incorrecto). 7- Desarrolla las funciones para : a) Determinar si un año es bisiesto. Un año es bisiesto si es múltiplo de 4 (ej.: 1984). Los años múltiplos de 100 no son bisiestos, salvo si ellos también son múltiplos de 400 (ej.: 2000 es bisiesto, 1800 no lo es). Ayuda: Nombre sugerido: esBisiesto, Parámetro: año, Valor que Devuelve: Verdadero o Falso. b) Determinar la cantidad de días de un mes dado. Nombre sugerido: diasMes, Parámetros: ¿?, Valor que devuelve: 28, 29, 30 ó 31 si es un mes correcto y 0 si no lo es. c) Retornar el nombre del mes o "mes incorrecto" si el valor recibido no corresponde a un número de mes válido. d) Determinar si dados 3 números representativos de: día-mes-año, corresponden a una fecha correcta. Nombre sugerido: esFechaCorrecta, Parámetros: ¿?, Valor/s que devuelve: ¿?. 8- Diseña una función que reciba un punto de coordenadas (x, y) y devuelva verdadero si el punto pertenece a la recta de la ecuación y = 3x + 2 o falso en caso contrario. Recordar que el punto pertenece a la recta si satisface la ecuación. Funciones Recursivas 1- En la siguiente frase: “Para entender la recursividad, antes necesitamos entender lo que es la recursividad” existe un pleonasmo recursivo (un pleonasmo es una expresión en la que aparecen uno o más términos redundantes). Explícalo con tus palabras. 2- Descubre el carácter recursivo de las siguientes situaciones y justifica por qué son necesarios los casos a los que llamamos “casos base” cuando describimos algoritmos recursivos. a) Un periodista le dice a su colega: “¿Te molestaría que escriba en mi columna acerca de lo que escribes tú en tu columna sobre lo que yo escribo?” b) Chuang Tzu hará unos veinticuatro siglos, soñó que era una mariposa y al despertar no sabía, si era un hombre que había soñado que era una mariposa o una mariposa que ahora soñaba ser un hombre que había soñado ser una mariposa. c) La metodología de resolución de problemas “divide y vencerás” que parte de un problema grande y lo divide en subproblemas, los que a su vez vuelve a dividir en problemas más pequeños. 3- Dada la siguiente función recursiva: Función recursiva (E inicio, limite: entero): entero Var retorno: entero Inicio si (inicio > limite) entonces retorno ← -1 sino si (inicio = limite) entonces retorno ← 1 sino retorno← inicio*recursiva(inicio+1,limite) finSi finSi recursiva ← retorno Fin a) Identifica el caso de parada, caso base o caso trivial de la función recursiva. b) Identifica el caso general de la función recursiva (explicar el paso de la recursividad). c) Define la función recursiva. d) ¿Qué resultado daría la llamada recursiva(14,10)? e) ¿Qué resultado daría la llamada recursiva(4,7)? 4- Dada la siguiente función: 0 si n=0 f(n)= f(n-1)+1/n si n > 0 a) Realiza la secuencia de llamadas para n=4 b) Desarrolla un subprograma recursivo que resuelva el problema. c) Comprueba que el caso genérico es equivalente, para n>0, con la siguiente expresión: f(n) = (1+ ½ + … + 1/n) = (1 + ½ + … + 1/n-1)+ 1/n 5- Define y desarrolla una solución algorítmica para una función que devuelva la cantidad de dígitos que tiene un número recibido por parámetro. Ejemplo: cantDigitos(12780) = 5. 6- Define la función y desarrolla un subalgoritmo recursivo que: calcule para un valor n >= 0 el elemento enésimo de la sucesión de Fibonacci. La sucesión de Fibonacci inicia con 1 y 1, y a partir de ahí cada elemento es la suma de los dos anteriores. Por ejemplo, los 10 primeros términos de la suceción son: 1,1,2,3,5,8,13,21 7- Dada la función: m si n=1 n si m=1 m+ mult (m,n-1) si n ≠1 y m≠1 mult(m,n) = a) b) c) d) Verifica que realiza la multiplicación entre números naturales Analiza qué sucede si se invoca con los pares de valores m=0, n=2 y con m=2, n=0 Completa la definición para los números NO negativos. Realiza el subalgoritmo correspondiente definiendo correctamente las precondiciones. 8- Dada la función recursiva esPalindromo que verifica si una cadena es un palíndromo o no, plantea la solución iterativa de la misma. Se llama palíndromo a una palabra, número o frase que se lee igual hacia adelante que hacia atrás, ( referencia: Wikipedia), por ejemplo Neuquen es un palíndromo. Función esPalindromo ( E pal: cadena): lógico Inicio si long(cad) > 1 entonces si cad[1] = cad[long(cad)] entonces esPalindromo ← esPalindromo (subcad (cad, 2, long(cad) – 1) sino esPalindromo ← falso finsi sino esPalindromo ← verdadero finsi Fin 9- Una cadena se dice que es un monte si su primera mitad es creciente, la segunda decreciente, y la cadena completa es un palíndromo. Modifica la función recursiva anterior, esPalindromo, de tal forma que el nuevo subalgoritmo monte verifique si una cadena recibida como parámetro es un monte.