Anda di halaman 1dari 31

Subprogramas

Algoritmos y Estructuras de Datos

Company

LOGO

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 frase

Contar
vocales
Calcular
frecuencia
Mostrar
frecuencia

Parmetros y argumentos
Resultado
esperado

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 <- "a";


mi_frecuencia <- 2;
mostrar_frecuencia(mi_vocal, mi_frecuencia);

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
frecuencia
Proceso principal
//Declarar variables
mi_vocal <- "a";
mi_frecuencia <- 100;
mi_frase <- "Somos libres, seamoslo siempre";
calcular_frecuencia(mi_vocal, mi_frase, mi_frecuencia);
mostrar_frecuencia(mi_vocal, mi_frecuencia);
FinProceso

Subproceso calcular_frecuencia(vocal, frase, frecuencia)


Definir resultado como Entero;
//Almacenar el nmero de caracteres en resultado
frecuencia <- resultado;
FinSubProceso

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
frecuencia
Subproceso calcular_frecuencia(vocal, frase, frecuencia por Referencia)
Definir total_caracteres, contador_caracteres, resultado como Entero;
Definir caracter_actual como Caracter;
total_caracteres <- Longitud(frase);

resultado <- 0;
Para contador_caracteres <- 0 Hasta total_caracteres - 1 Hacer
caracter_actual <- SubCadena(frase, contador_caracteres, contador_caracteres);
Si caracter_actual = vocal Entonces
resultado <- resultado + 1;
FinSi
FinPara
frecuencia <- resultado;

FinSubProceso

Funciones
Un Subprograma
cuyo nombre
puede generar
un valor

Podemos usar el
nombre de la
funcin en una
expresin

Como

Donde

Longitud(x)
SubCadena(x)

X <- Longitud(a);
La variable X toma
el valor de 1

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 <- calcular_frecuencia(vocal,


frase)
Definir frecuencia como Entero;
//Almaceno el resultado en frecuencia
FinFuncion

Mdulo: Calcular
frecuencia
Proceso principal
Definir mi_vocal como Caracter;
Definir mi_frecuencia como Entero;
Definir mi_frase como Cadena;
mi_vocal <- "e";

mi_frase <- "Somos libres, seamoslo siempre";


mi_frecuencia <- calcular_frecuencia(mi_vocal, mi_frase);
mostrar_frecuencia(mi_vocal, mi_frecuencia);
FinProceso

Funcion frecuencia <- calcular_frecuencia(vocal, frase)


Definir frecuencia como Entero;
Definir resultado como Entero;
//Almanceno la frecuencia en resultado
frecuencia <- resultado;
FinFuncion

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] <- "aA";
//Hacer lo mismo para el resto de vocales
Para contador <- 0 Hasta 4 Hacer
frecuencia <- 0;
patron_actual <- patrones_por_vocal[contador];
Para contador_interno <- 0 Hasta Longitud(patron_actual) Hacer
//Invocamos a calcular_frecuencia y acumulamos en frecuencia
FinPara

mostrar_frecuencia(SubCadena(patron_actual,0, 0), frecuencia);


FinPara
FinSubProceso

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 <- 4;
Escribir "La suma de los primeros ", mi_limite, " numeros es ", Sumar(mi_limite);
FinProceso

Funcion resultado <- Sumar(limite)


Definir resultado como Entero;
Si limite = 1 Entonces
resultado <- 1;
Sino

resultado <- Sumar(limite - 1) + limite;


FinSi
FinFuncion

Flujo de ejecucin
Si la ejecucin est aqu

limite

resultado

Inicio de la primera invocacin a


Sumar

Indefinido

Inicio de la segunda invocacin a


Sumar

Indefinido

Inicio de la tercera invocacin a


Sumar

Indefinido

Inicio de la cuarta invocacin a


Sumar

Indefinido

Fin de la cuarta invocacin a Sumar

Fin de la tercera invocacin a Sumar

Fin de la segunda invocacin a


Sumar

Fin de la primera invocacin a


Sumar

10

Un problema
Elaborar un algoritmo principal que lea un valor de X
(0<X< 1) y utilic una funcin coseno que reciba como
parmetro dicho valor y calcule el coseno de X, el cual
debe devolver al programa principal. Con el mismo valor
de X utilizar la funcin exponencial que calcule lo propio
y devuelva al programa principal, hasta que la
diferencia entre dos valores sea menor que 0.001.

Utilizar las siguientes formulas:


Coseno X = 1

2
2!

4
4!

Exponencial X = 1 + +

6
6!

2
2!

3
3!

4
4!

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_factorial(un_numero)
Definir resultado como Entero;
Si un_numero = 1 Entonces
resultado <- 1;

Sino
resultado <- un_numero *
calcular_factorial(un_numero - 1);
FinSi
FinFuncion

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!

= 1 + + X^(n-1)/(n-1)!

= Exp(X -1) + X^(n-1)/(n1)!

Exp(x,n)

Funcin Exponencial
Funcion resultado <- calcular_exponencial(un_numero, numero_terminos)

Definir resultado, ultimo_termino

como Real;

Definir exponente como Entero;


Si numero_terminos = 1 Entonces
resultado <- 1;
Sino
exponente <- numero_terminos - 1;
ultimo_termino <- un_numero ^ exponente / calcular_factorial(exponente);
resultado <- ultimo_termino + calcular_exponencial(un_numero,
numero_terminos - 1);

FinSi
FinFuncion

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 <- calcular_coseno(un_numero, numero_terminos)
Definir resultado, ultimo_termino como Real;
Definir signo, exponente como Entero;
Si numero_terminos = 1 Entonces
resultado <- 1;
Sino
exponente <- 2 * (numero_terminos - 1);

signo <- (-1) ^ (numero_terminos - 1);


ultimo_termino <- signo * un_numero ^ exponente / calcular_factorial(exponente);
resultado <- ultimo_termino + calcular_coseno(un_numero, numero_terminos - 1);
FinSi
FinFuncion

Anda mungkin juga menyukai