Está en la página 1de 35

Buenos días!!

AGENDA de TRABAJO

Subalgoritmos

(si nos queda tiempo empezamos con…)


Ejercitación – Práctica 5
¿Qué vimos hasta ahora?
Algoritmos en pseudocódigo (pág. 35)
Análisis del problema (DATOS, METODOLOGÍA y RESULTADOS)
ACCIONES PRIMITIVAS (leer, escribir, asignar)

Programación estructurada (pág. 43)


Estructura de selección simple: SI-ENTONCES-SINO (pág. 46)
Estructura de selección múltiple: SEGÚN SEA (pág. 48)
Estructura de Iteración o repetición:
REPETIR PARA (pág. 49)
REPETIR MIENTRAS (pág. 50)
REPETIR HASTA (pág. 51)
Conversión entre estructuras de repetición
Anidamiento de estructuras de control

Aplicado con:
CONTADORES
ACUMULADORES
PROMEDIOS
PORCENTAJES
MÁXIMOS / MÍNIMOS (y sus posiciones)
BANDERAS
CORTE DE CONTROL
Codificación en lenguaje
Subalgoritmos

(Unidad 5 del libro de la Cátedra)

Programación modular
Subalgoritmos
Funciones
Subrutinas
Programación Modular
Programación Modular
(pág. 101)

Un problema complejo se resuelve mejor si se lo divide en


sub-problemas de menor complejidad.

Dado un problema,
se debe pensar en sub-problemas que constituyan módulos separados,
que luego se ensamblen,
para construir el algoritmo que resuelva el problema de origen.

Problema Sub-problema 1 Sub-problema 3

Sub-problema 2
Programación Modular
(pág. 101)

Características de los módulos:


•independiente uno del otro
•definido en sí mismo (entradas, acciones y resultados)

Ventajas de la modularidad:
•Probar los diferentes módulos en forma independiente
•Modificar los diferentes módulos sin afectar a los otros
•Diferentes diseñadores puedan trabajar simultáneamente en cada módulo
•Reuso: volver a usar soluciones ya conocidas y testeadas con anterioridad

Cada módulo (o rutina) es parte de un algoritmo general,


por este motivo se lo denomina subalgoritmo.
EJEMPLO SITIO WEB COMERCIAL

Cada vínculo en un sitio web:


- Accede a módulos específicos
- Reutilizables
- Independientes
- Escritos por diferentes equipos de programadores
Subalgoritmo
(pág. 102)

Un subalgoritmo define una tarea específica que puede ser reutilizada en distintos
contextos de resolución de problemas algorítmicos.

Algunos módulos son tan comunes que ya se incluyen en los lenguajes de


programación.
Se denominan funciones internas. Ej.: sqrt( ), cos( ), abs( ).

Se suministran en forma de biblioteca o paquetes de módulos reutilizables.


Por ejemplo, en C: stdio.h #include <stdio.h>

Otros módulos no comunes, serán desarrollados por el programador.


Son los subalgoritmos de tipo función y de tipo procedimiento o subrutina.
Ejemplo: validar datos (fechas, valor perteneciente a un rango, etc.), etc.
Subalgoritmo
(pág. 102)

Posibles estructuras equivalentes de diseño de algoritmos utilizando subalgoritmos:

Es lo mismo:
Pensar y escribir primero el algoritmo principal proponiendo los subalgoritmos, y
luego escribir cada uno de ellos
Que:
Pensar y escribir primero los subalgoritmos, y luego utilizarlos en el algoritmo
principal
Subalgoritmo

Al trabajar con subalgoritmos, tendremos que pensar en:


-Su declaración
-Su uso, llamado o invocación
Subalgoritmo de tipo función
(pág. 102/103)

Un subalgoritmo función es un subalgoritmo que recibiendo o no datos, devuelve


un único resultado.
Responde al concepto matemático de función de una o más variables.
Este tipo de subalgoritmo se implementa cuando la tarea a desarrollar devuelve un
único resultado. En general son cálculos.
Una función es un conjunto de acciones (una o varias) con un nombre, un tipo de
dato y un resultado único.

Sintaxis de la declaración de una función:


Función <nombre de la función>(<lista de parámetros>): <Tipo de resultado>
o
<Tipo de resultado> Función <nombre de la función>(<lista de parámetros>)
<declaración de variables>
Inicio
cuerpo <acciones>
devolver (<constante, variable o expresión>)
finfunción
Subalgoritmo de tipo función
(pág. 103)

Nombre de función: identificador válido.


Lista de parámetros: contiene las variables que pasan información necesaria para
que la función ejecute el conjunto de acciones.
Cada variable de la lista debe tener una declaración de tipo dentro del paréntesis.
Puede que no haya lista de parámetros, en dicho caso se escribe el paréntesis vacío.
Tipo de resultado: indica el tipo de dato de la información que devuelve la función.
Declaración de variables: en este lugar se deben declarar aquellas variables que se
usarán en la función, salvo las que ya están declaradas en la lista de parámetros.
Estas variables se llaman locales pues su alcance se restringe a la función. Cuando se
abandona la función, dichas variables no pueden ser accedidas.
Cuerpo de la función: es el conjunto de acciones a realizar por la función.
Retornar el resultado: el único resultado que devuelve la función, que puede ser un
valor constante, o una variable o una expresión válida.
Debe colocarse entre paréntesis al lado de la acción devolver.
Cuando se ejecuta esta acción se devuelve el control del programa al lugar desde
donde se ha llamado a la función.
Veamos la siguiente situación problemática

Calcular la potencia n (entero) de un número x xn

1- Interpretar el enunciado

2- Hacer el Análisis del problema


Dato/s: base (x) y exponente (n)
Resultado/s: potencia (y)
Metodología:

Si existe un operador para calcular la potencia:


y = x ** n
O

Si existe una función interna de biblioteca para calcular la potencia:


y = pot(x, n)
Xn
Si existe un operador para calcular la potencia: y = x ** n

3- Escribir el algoritmo

Algoritmo POTENCIA
Variables
real x, y
entero n
Inicio
escribir("Ingrese la base y el exponente")
leer(x, n)
y  x ** n
escribir("El resultado de la potencia es: ", y)
Fin.
Xn
Si existe una función interna de biblioteca para calcular la potencia: y = pot(x, n)

3- Escribir el algoritmo

Algoritmo POTENCIA
Variables
real x, y
entero n
Inicio
escribir("Ingrese la base y el exponente")
leer(x, n)
y  pot(x,n)
escribir("El resultado de la potencia es: ", y)
Fin.
Pero supongamos ahora, que trabajamos con un lenguaje que no posee
la potencia implementada ni como operador ni como función interna.

Calcular la potencia n (entero) de un número x xn

1- Interpretar el enunciado

2- Hacer el Análisis del problema


Dato/s: base (x) y exponente (n)
Resultado/s: potencia (y)
Metodología:
Obtener la potencia por multiplicaciones sucesivas, o sea, multiplicando la base por
si misma, tantas veces como lo indique el exponente. Si el exponente fuera negativo,
el resultado será el valor inverso a la multiplicación obtenida.

Ejemplos:
23 2-3
y=2x2x2=8 y=2x2x2=8
y = 1/8 = 0,125
xn

3- Escribir el algoritmo

Algoritmo POTENCIA
Variables
real x, y
entero n, i
Inicio
escribir("Ingrese la base y el exponente")
leer(x, n)
y1
repetir para i  1, abs(n)
yy*x
finpara
si (n < 0) entonces
y 1/y
fin si
escribir("El resultado de la potencia es: ", y)
Fin.
Resolvamos nuestra situación problemática
encarándola de otra manera…

I ON
PEN AC
MO SAM AM R
DU IEN R
G LA
LA TO O U
R PR OD
M
xn

3- Escribir el algoritmo

Algoritmo POTENCIA
Variables
real x, y
entero n, i
Inicio
escribir("Ingrese la base y el exponente")
leer(x, n)
y1
repetir para i  1, abs(n) Todas estas
yy*x acciones las
finpara haremos formar
si (n < 0) entonces parte de un
y 1/y SUBPROGRAMA
fin si
escribir("El resultado de la potencia es: ", y)
Fin.
Subalgoritmo de tipo función - Ejemplo 1
(pág. 103)

Definir la función y=xn, donde el exponente n es de tipo entero.


(Suponemos que trabajamos con un lenguaje que no posee la potencia
implementada ni como operador ni como función interna.)

1- Interpretar el enunciado

2- Hacer el Análisis del problema


Dato/s: base (x) y exponente (n)
Resultado/s: potencia (y)
Metodología:
Obtener la potencia por multiplicaciones sucesivas, o sea, multiplicando la base por
si misma, tantas veces como lo indique el exponente. Si el exponente fuera negativo,
el resultado será el valor inverso a la multiplicación obtenida.

Ejemplos:
23 2-3
y=2x2x2=8 y=2x2x2=8
y = 1/8 = 0,125
Subalgoritmo de tipo función - Ejemplo 1
(pág. 103)

3- Escribir el algoritmo (algoritmo principal y subalgoritmo/s)

Subalgoritmo

real Función potencia (real x, entero n) o Función potencia (x: real, n: entero): real
Variables
entero i
real y
Inicio
y1 Características de los módulos:
repetir para i  1, abs(n) •independiente uno del otro
yy*x •definido en sí mismo (entradas,
finpara acciones y resultados)
si (n < 0) entonces
y 1/y
fin si
devolver (y)
finfunción
Subalgoritmo de tipo función
(pág. 104)

Sintaxis del uso, llamado o invocación de una función:


Se la puede invocar, como parte de una expresión, desde una asignación, desde una salida
de datos o desde una condición (si, mientras, hasta que).
En el caso de la asignación, el valor calculado que devuelve la función a través de su
nombre, debe ser recibido en un contenedor válido respecto de su tipo de dato.
Se debe respetar la cantidad, el tipo de dato y el orden de los valores que se pasarán como
argumentos al invocar a la función, ya que debe existir una coherencia con los parámetros
definidos en la misma, para poder recibir dichos datos.
Los argumentos o parámetros actuales o reales, pueden ser valores constantes, variables,
expresiones o funciones.
Ejemplos:
leer(a)
escribir(potencia(2,3)) si (potencia(3,a)>20) entonces x2
….. p  potencia(potencia(2,2),x)
finsi

w  potencia(2,a*4+1) / 40
Usando en el algoritmo principal los mismos nombres de variables
que en el subalgoritmo

Algoritmo principal (desde donde se invoca al subalgoritmo)

Algoritmo EJEMPLO1
Variables
real x, y
entero n
Inicio
escribir("Ingrese la base y el exponente")
leer(x, n)
y  potencia(x, n)
escribir("El resultado de la potencia es: ", y)
Fin.

Otra forma de invocar a la función:


escribir("El resultado de la potencia es: ", potencia(x, n))

Hacer la prueba del algoritmo (traza o prueba de escritorio)


Usando en el algoritmo principal nombres distintos de variables a los del subalgoritmo
(alternativa recomendada, pues conceptualmente son distintas variables)

Algoritmo principal (desde donde se invoca al subalgoritmo)

Algoritmo EJEMPLO1
Variables
real base, pot
entero exp
Inicio
escribir("Ingrese la base y el exponente")
leer(base, exp)
pot  potencia(base, exp)
escribir("El resultado de la potencia es: ", pot)
Fin.

Otra forma de invocar a la función:


escribir("El resultado de la potencia es: ", potencia(base, exp))

Hacer la prueba del algoritmo (traza o prueba de escritorio)


Subalgoritmo de tipo función - Ejemplo 1

4- Escribir el programa

//EJEMPLO 1 de subprograma tipo función


#include <stdio.h>

float potencia(float x, int n)


{
//Variables
int i;
float y;
//Inicio
y=1;
for (i=1; i<=abs(n); i++)
y*=x; //y=y*x ;

if (n < 0)
y=1/y ;

return y;
}
Subalgoritmo de tipo función - Ejemplo 1

main()
{
//Variables
float base, pot;
int exp;

//Inicio
printf("Ingrese la base y el exponente ");
scanf("%f%d",&base,&exp);
pot=potencia(base, exp);
printf("El resultado de la potencia es: %f", pot);
}
Aclaración

En C escribiremos siempre en el siguiente orden:


1)los subprogramas
2)el programa principal
//EJEMPLO 1 de subprograma tipo función
#include <stdio.h>

float potencia(float x, int n)


{
.
.
}

main()
{
.
.
}
Subalgoritmo de tipo función - Ejemplo 1

Algoritmo principal Subalgoritmo

Algoritmo EJEMPLO1 real Función potencia( real x, entero n )


Variables x  base Variables
parámetros
real base, pot n  exp entero i
entero exp real y
Inicio Inicio
escribir("Ingrese la base y el exponente") y1
leer(base, exp) repetir para i  1, abs(n)
argumentos yy*x
pot  potencia( base, exp ) finpara
si (n < 0) entonces
escribir("El resultado de la potencia es: ", pot) y 1/y
Fin. fin si
devolver (y)
finfunción

Correspondencia entre argumentos y parámetros


Se debe respetar la cantidad, el tipo de dato y el orden de los valores que se pasarán
como argumentos al invocar a la función, ya que debe existir una coherencia con los
parámetros definidos en la misma, para poder recibir dichos datos.
Subalgoritmo de tipo función - Ejemplo 1

Algoritmo principal Subalgoritmo

Algoritmo EJEMPLO1 0 real Función potencia( real x, entero n )


Variables x  base Variables
parámetros
real base, pot n  exp entero i
entero exp real y
Inicio Inicio
escribir("Ingrese la base y el exponente") 1 y1
2
1 leer(base, exp) 2 repetir para i  1, abs(n)
argumentos yy*x
3
2 pot  potencia( base, exp ) finpara
si (n < 0) entonces
escribir("El resultado de la potencia es: ", pot) y 1/y RAM
Fin. fin si x n y i
4 devolver (y)
20 2 3
finfunción
1 1
RAM
2, 3 2 1
base exp pot
1 2 3 2, 3 4 2

2 8 4 2, 3 8 3
Subalgoritmo de tipo función

Retornar el resultado: el único resultado que devuelve la función, puede ser


una variable (ya lo vimos) o un valor constante o una expresión válida.

real Función pi()


Variables

Inicio
devolver (3.1415)
finfunción

real Función cmsAmetros(entero valor)


Variables

Inicio
devolver (valor/100.)
finfunción
¿Dudas/preguntas?
Ejercitación - Práctica 5

3. FACTORIAL: subalgoritmo que calcula y retorna el factorial de un


número entero positivo n mayor o igual a cero, que recibe como
parámetro.
Nota: FACTORIAL(n) se lo escribe matemáticamente como n!.

Resolver, guiándose por el ejemplo de la potencia.


Ejercitación - Práctica 5 – Ej. 3
1- Interpretar el enunciado

2- Hacer el Análisis del problema


Dato/s: número (n) entero positivo o mayor igual a 0

Resultado/s: factorial (f) del número


Metodología:
N!
Ejemplo: 4!
4x3x2x1

1x2x3x4

Generar valores desde 1 hasta n, e ir acumulando la multiplicación


de los mismos, para obtener el factorial.
Ejercitación - Práctica 5 – Ej. 3

3- Escribir el algoritmo (subalgoritmo/s)

Subalgoritmo

entero Función FACTORIAL(entero n)


Variables
entero f, i
Inicio
f <-- 1
//repetir para i <-- n, 1, -1
repetir para i <-- 1, n
f <-- f * i
finpara
devolver (f)
finfunción

También podría gustarte