Descomposición de problemas: funciones Subproblemas Funciones

Anuncio
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.
Descargar