Company
LOGO
Subprogramas
Algoritmos y Estructuras de Datos
Agenda
1. Programacin Modular
2. Procedimientos
3. Funciones
4. Recursividad
Parmetros
Ya hemos hablado de Mdulos antes.
Los Mdulos de un programa no tienen
acceso a las variables de otros
mdulos.
Sin embargo, necesitamos
intercambiar datos entre mdulos.
El intercambio de datos entre mdulos se realiza a travs
de parmetros.
Un Problema
Disee un algoritmo que nos muestre la frecuencia de aparicin de cada una de
las vocales presentes en una frase
ingresada por el usuario.
Omitir maysculas y tildes por ahora.
La frase debe enviarse como parmetro
Mdulos propuestos
Mdulo Principal
Leer fraseContar vocales
Calcular frecuencia
Mostrar frecuencia
Parmetros y argumentos
Resultadoesperado
La vocal a se utiliz 2 veces
Definiendo el mdulo
SubProceso mostrar_frecuencia(vocal, frecuencia)
Escribir "La vocal ", vocal, " se utiliz ", frecuencia, " veces";
FinSubProceso
Invocando al mdulo
mi_vocal
Parmetros y argumentos
Nombres de variables
No es necesario que los nombres de variables de los argumentos y parmetros coincidan.
Invocar un subprograma
Los valores de los argumentos son asignados a los parmetros correspondientes.
Basados en el orden de aparicin.
Por eso Tener cuidado en pasar los valores en el orden correcto.
Parmetros y argumentos
mostrar_frecuencia
(mi_vocal, mi_frecuencia);
mostrar_frecuencia
(mi_frecuencia, mi_vocal);
Para qu usar mdulos
Los podemos usar mltiples veces.
Son fciles de disear y construir.
Nos asla de los detalles externos al
mdulo.
Las pruebas a nivel de mdulo son importantes en el mantenimiento de Software grande.
Parmetros por Valor
Definicin Los cambios en el Subprograma no afectan a la variable en el mdulo que lo invoca.
Slo envan datos al subprograma
Mecanismo El subprograma slo recibe una copia de la variable.
Se reserva un espacio en memoria para esta copia.
Sintaxis Subproceso calcular_frecuencia(vocal, frase, frecuencia)
Mdulo: Calcular
frecuenciaProceso principal
//Declarar variables
mi_vocal
Parmetros por Referencia
Definicin Los cambios en su valor afectan al valor de los argumentos en el mdulo que invoca.
Slo envan y reciben datos del subprograma
Mecanismo El subprograma tiene acceso a la ubicacin del argumento en memoria.
Todo cambio se ve reflejado en la variable original.
Sintaxis Subproceso calcular_frecuencia(vocal, frase, frecuencia por Referencia)
Mdulo: Calcular
frecuenciaSubproceso calcular_frecuencia(vocal, frase, frecuencia por Referencia)
Definir total_caracteres, contador_caracteres, resultado como Entero;
Definir caracter_actual como Caracter;
total_caracteres
Funciones
Un Subprograma cuyo nombre
puede generar un valor
Podemos usar el nombre de la
funcin en una expresin
Como
Longitud(x) SubCadena(x)
Donde
X
Funciones incorporadas
Definicin Funciones ya provedas por los Lenguajes de Programacin.
El cdigo fuente de estas funcione est en mdulos externos, y a disposicin de los programadores.
En PSeInt RC(X) Raz cuadrada
TRUNC(X) Parte entera
AZAR(X) Entero aleatorio
ABS(X) Valor absoluto
EXP(X) Funcin exponencial
Funciones definidas por el
Usuario
Definicin Funciones creadas por el Programador.
Debe incluir el tipo de dato devuelto por la funcin
Sintaxis Funcion frecuencia
Mdulo: Calcular
frecuenciaProceso principal
Definir mi_vocal como Caracter;
Definir mi_frecuencia como Entero;
Definir mi_frase como Cadena;
mi_vocal
El Problema
Mdulo Principal
Invoca al mdulo Leer frase y el enva la frase al mdulo Contar Vocales.
Mdulo Leer Frase
Almacena la frase ingresada por el usuario en una variable.
Mdulo Calcular Frecuencia
Retorna el nmero de apariciones de una letra en una frase.
Mdulo Mostrar Frecuencia
Muestra en pantalla el nmero de apariciones de una vocal.
Mdulo Contar Vocales
Verifico el nmero de veces que aparece la vocal en minsculas.
Verifico el nmero de veces que aparece la vocal en maysculas.
Verifico el nmero de veces que aparece la vocal en minsculas con tilde.
Verifico el nmero de veces que aparece la vocal en maysculas con tilde.
Sumo las apariciones y muestro el resultado.
La solucin
Proceso principal
Definir mi_frase como Cadena;
leer_frase(mi_frase); //Este parmetro es por referencia
contar_vocales(mi_frase);
FinProceso
SubProceso contar_vocales(frase)
Dimension patrones_por_vocal[5];
Definir patrones_por_vocal como Cadena;
patrones_por_vocal[0]
Recursividad
Un subprograma recursivo es uno
que se invoca a s mismo.
En un tiempo, haba lenguajes
que no soportaban recursividad.
Proveen soluciones eficientes para
problemas especficos.
Por ejemplo, calcular la suma de
los primeros N enteros.
Un ejemplo
Proceso principal
Definir mi_limite como Entero;
mi_limite
Flujo de ejecucin
Si la ejecucin est aqu limite resultado
Inicio de la primera invocacin a Sumar
4 Indefinido
Inicio de la segunda invocacin a Sumar
3 Indefinido
Inicio de la tercera invocacin a Sumar
2 Indefinido
Inicio de la cuarta invocacin a Sumar
1 Indefinido
Fin de la cuarta invocacin a Sumar 1 1
Fin de la tercera invocacin a Sumar 2 3
Fin de la segunda invocacin a Sumar
3 6
Fin de la primera invocacin a Sumar
4 10
Un problema
Elaborar un algoritmo principal que lea un valor de X (0
Plan de Accin
Obtenemos un nmero del usuario que cumpla las reglas de validacin.
Necesitamos una funcin de clculo de factorial tanto para el clculo del Coseno y el Exponencial
Calculamos el Coseno y el Exponencial
Verificamos si su diferencia cumple las condiciones de trmino del programa.
Calcular Factorial
Fact(1) = 1
Fact(2) = 1 * 2 = Fact(1) * 2
Fact(3) = 1 * 2 * 3 = Fact(2) * 3
Fact(x) = 1 * 2 * X = Fact(X -1) * X
Funcin Factorial
Funcion resultado
Calcular Exponencial
Exp(x,1) = 1
Exp(x,2) = 1 + X = Exp(x,1) + X
Exp(x,3) = 1 + X + X^2/2! = Exp(x,2) + X^2/2!
Exp(x,4) = 1 + X + X^2/2! + X^3/3! = Exp(x,3) + X^3/3!
Exp(x,n) = 1 + + X^(n-1)/(n-1)! = Exp(X -1) + X^(n-1)/(n-1)!
Funcin Exponencial
Funcion resultado
Calcular Coseno
Cos(x,1) = 1
Cos(x,2) = 1 - X^2/2! = Cos(x,1) - X^2/2!
Cos(x,3) = 1 - X^2/2! + X^4/4! = Cos(x,2) + X^4/4!
Cos(x,4) = 1 - X^2/2! + X^4/4! -X^6/6!
= Cos(x,3) - X^6/6!
Cos(x,n) = 1 + + ? = Cos(X -1) + ?
Funcin Coseno
Funcion resultado