Está en la página 1de 10

Subprogramas

Cuando las situaciones problemticas a resolver se tornan complejas, surge la necesidad de


aplicar algn tipo de metodologa que permita descomponer el problema en varios problemas
(subproblemas) ms fciles de resolver.
Problema
Subproblema
Subproblema !
Subproblema "
#dems, si estos subproblemas siguen siendo complejos, puede ser conveniente, volver a
subdividirlos en subproblemas ms sencillos. #s pues, el subproblema se puede subdividir
en otros subproblemas$
Subproblema .
Subproblema .!
Subproblema ."
Subproblema .%
& as, continuar subdividiendo, en caso de que fuese necesario. Por ejemplo, el subproblema
., podra descomponerse en nuevos fragmentos o m'dulos, ms simples$
Subproblema ..
Subproblema ..!
# este m(todo de descomposici'n modular o modulari)aci'n, se le denomina m(todo por
refinamiento sucesivo. *e este modo, cada subproblema se convierte en un m'dulo,
idealmente, independiente de los dems.
Cada subproblema, m'dulo se resolver a trav(s de un algoritmo o subalgoritmo.
+uego, para resolver el problema original, se tendr un algoritmo principal que invocar a los
subalgoritmos.
,tras ventajas que se obtienen al trabajar con este m(todo, son$
- Se logra ma.or entendimiento de los algoritmos
- +a detecci'n . correcci'n de errores es ms simple, pues generalmente no es necesario
revisar todo el algoritmo, s'lo basta con revisar el m'dulo que presenta el error
- +os subalgoritmos se especiali)an en resolver un determinado problema sin importarles
c'mo funcionan los dems m'dulos
- Permite la reutili)aci'n del subalgoritmo las veces que sea necesario
- Posibilita que varias personas trabajen en paralelo en la resoluci'n de un problema
complejo
/eremos que e0isten dos tipos de subalgoritmos$
- funciones
- procedimientos o subrutinas
1anto los procedimientos o subrutinas como las funciones son unidades dise2adas para
ejecutar una tarea especfica.
3esumidamente podemos decir que las funciones, normalmente, devuelven un s'lo valor al
algoritmo principal que las referencia (algoritmo que invoca a la funci'n). +os procedimientos o
subrutinas pueden devolver cero, uno o varios valores. 4n el caso de no devolver valor alguno,
reali)a alguna tarea del tipo operaci'n de entrada .5o salida.
1
# un procedimiento o subrutina no se le puede asignar valor, . por consiguiente ningn tipo de
dato est asociado con el nombre del procedimiento o subrutina.
6na funci'n se referencia utili)ando su nombre en una e0presi'n, mientras que un
procedimiento o subrutina se referencia por su llamada o invocaci'n al mismo.
1) Funciones
+as funciones tienen su origen ligado al concepto matemtico de funci'n de una o ms
variables. #lgunos ejemplos .a conocidos de este tipo de subalgoritmos son las llamadas
funciones internas (resto, abs, log, etc.).
Pero tambi(n, es posible crear nuevas funciones, segn las necesidades.
+as funciones pueden usarse en e0presiones algortmicas como si se tratara de variables.
,tros ejemplos de funciones matemticas$
f(0) 7 0
!
8 90 :
g(0,.) 7 0
"
8 ;.
<(0,.,)) 7 "0 8 !. - )
*onde x, y, z son los parmetros formales o ficticios, es decir, aquellos que permiten
e0presar la le. o =forma> de la funci'n.
+as funciones pueden tener uno o ms parmetros formales (datos) pero siempre devuelven un
nico resultado.
+as funciones se evalan utili)ando parmetros actuales o reales, es decir, los valores con
los cuales se quiere evaluar la funci'n$
f(2)
g(-1,5)
<(2,0,7)
6na funci'n es un objeto que tiene un nombre . un tipo de dato, . devuelve un valor nico. 4l
tipo de dato est asociado al valor que retorna la funci'n cuando se evala para un conjunto de
valores de sus argumentos.
Para poder trabajar con una funci'n, veremos que es necesario primero definirla, . una ve)
definida, luego reci(n podr usarse, invocndola.
Definicin de una funcin
6na funci'n se define indicando$
1ipo de dato ?uncion nombre (lista de parmetros formales)
declaraci'n de variables
@nicio
acciones
nombre valor de la funci'n 55devolver valor de la funci'n
?in funcion
- 1ipo de dato$ indica el tipo de dato que devuelve la funci'n
- +ista de parmetros formales$ contiene las variables que pasan alguna informaci'n necesaria
para que la funci'n ejecute el conjunto de acciones.
- *eclaraci'n de variables$ se deben declarar los parmetros formales . tambi(n aquellas
variables que se usarn en la funci'n. # este tipo de variables, se las denomina variables
locales.
- Cuerpo de la funci'n$ constitu.e el conjunto de acciones a reali)ar por la funci'n.
- 3etornar el resultado$ el nico resultado que devuelve la funci'n debe asignarse a una
variable cu.o nombre coincide con el nombre de la funci'n. ,tra forma utili)ada en algunos
2
lenguajes es escribir una variable o e0presi'n entre par(ntesis al lado de la palabra clave
deoler o retornar. Cuando se ejecuta esta acci'n se retorna el control de ejecuci'n al lugar
donde se <a invocado la funci'n.
Invocacin de una funcin
6na funci'n puede ser invocada, llamada, de la siguiente manera$
nombreAfunci'n (lista de parmetros actuales)
+a lista de parmetros actuales debe corresponder en tipo, orden . cantidad, con la lista de
parmetros formales definidos en la funci'n. Como .a <emos mencionado, sirve para pasar
informaci'n a la funci'n desde la unidad de programa que se la invoca.
40isten distintas formas de invocar a una funci'n$
- *esde una asignaci'n$
variable nombreAfunci'n (lista de parmetros actuales)
variable !B"8nombreAfunci'n (lista de parmetros actuales)
- *esde un escribir$
escribir (=AAAAAAAAAAAA>, nombreAfunci'n (lista de parmetros actuales))
- *esde una condici'n$
si (variable C nombreAfunci'n (lista de parmetros actuales)) entonces
D
finAsi
mientras (variable EC nombreAfunci'n (lista de parmetros actuales))
D
finAmientras
6na llamada a la funci'n implica los siguientes pasos$
- # cada parmetro formal se le asigna el valor real de su correspondiente parmetro actual.
- Se ejecuta el cuerpo de acciones de la funci'n.
- Se devuelve el valor resultante de la funci'n, al punto de llamada.
/eamos un par de ejemplos, contemplando tanto la definici'n como la invocaci'n.
a) Supongamos que queremos definir la funci'n f(0) 7 0
!
8 90 : , . luego evaluar la misma
para un valor cualquiera de F.
Como primer paso definimos la funci'n$
real funcion ?(F)
real F
@nicio
? F B F 8 9 B F : 55devolver F B F 8 9 B F :
?in funcion
Como segundo paso, invocamos a la funci'n desde el algoritmo principal$
#lgoritmo 4G4HP+,A#
real I 55?
@nicio
escribir (J@ngresar un valor numericoK)
leer (I)
escribir (J4l resultado es$ J, ?(I))
?in
3
b) Supongamos que nuestro pseudoc'digo no dispone de un operador que permite <acer una
potencia. +uego, vamos a definir una funci'n, que permita calcular 0
n
, siendo n, un nmero
entero. & luego, queremos que desde un algoritmo principal, se solicite un par de valores para
calcular la potencia.
Como primer paso definimos la funci'n$
real funcion P,14LC@# (F, L)
entero F, L, @
real &
@nicio
&
para @ , abs(L)
& & B F
finApara
si (L E M) entonces
& 5 &
finAsi
P,14LC@# & 55devolver &
?in funcion
Como segundo paso, invocamos a la funci'n desde el algoritmo principal$
#lgoritmo 4G4HP+,AN
entero N#S4, 4FP
real 34S 55P,14LC@#
@nicio
escribir (J@ngresar el valor de la baseK)
leer (N#S4)
escribir (J@ngresar el valor del e0ponenteK)
leer (4FP)
34S P,14LC@#(N#S4, 4FP)
escribir (J4l resultado es$ J, 34S)
?in
2) Subrutinas o procedimientos
6n procedimiento o subrutina est compuesto por un grupo de sentencias a las que se le
asigna un nombre (identificador) . constitu.e una unidad de programa. +a tarea asignada al
procedimiento se ejecutar siempre que se encuentre el identificador en el conjunto de
sentencias que definen el algoritmo.
6n procedimiento o subrutina es un subalgoritmo que toma ninguno, uno o ms valores
llamados argumentos de entrada, con los cuales ejecuta tareas especficas . devuelve
ninguno, uno o varios resultados al algoritmo principal en los correspondientes argumentos de
salida.
6n procedimiento o subrutina tiene una construcci'n similar a los algoritmos.
4
Definicin de una subrutina o procedimiento
+a definici'n de un procedimiento no indica a la computadora que ejecute las instrucciones
dadas, sino que indica a la computadora cules son estas instrucciones . d'nde estn
locali)adas cuando sea necesario ejecutarlas.
Procedimiento nombre
declaraci'n de variables
@nicio
acciones
?in
Procedimiento nombre(lista de parmetros formales)
declaraci'n de variables
@nicio
acciones
?in
+a lista de parmetros formales del procedimiento sirve para pasar informaci'n al
procedimiento .5o devolver informaci'n del procedimiento a la unidad de programa que lo
invoca.
Invocacin de una subrutina o procedimiento
+os procedimientos se llaman desde un algoritmo o desde otro procedimiento, directamente por
su nombre . eventualmente, con la lista de los parmetros actuales, si es que los e0ige su
definici'n. 4n algunos lenguajes se le antepone al nombre del procedimiento, la palabra
reservada llamar.
6na llamada a un procedimiento implica los siguientes pasos$
- # cada parmetro formal se le asigna el valor real de su correspondiente parmetro actual.
- Se ejecuta el cuerpo de acciones del procedimiento.
- Se regresa a la instrucci'n siguiente al punto de llamada.
Transferencia de informacin a/desde procedimientos: parmetros
6n parmetro sirve para pasar informaci'n (valores a variables) desde un algoritmo principal a
un procedimiento (o entre dos procedimientos).
- Procedimientos sin parmetros$ no e0iste comunicaci'n entre el algoritmo principal . los
procedimientos (o entre dos procedimientos).
- Procedimientos con parmetros$ e0iste comunicaci'n entre el algoritmo principal . los
procedimientos (o entre dos procedimientos).
+os parmetros pueden ser de entrada, de salida o de entrada5salida.
+os parmetros de entrada determinan sus valores en el algoritmo principal (llamador).
+os parmetros de salida determinan sus valores en el procedimiento . se devuelven al
algoritmo principal (llamador) para su proceso.
+os parmetros de entrada5salida determinan sus valores en el algoritmo principal (llamador), .
a su ve), son modificados en el procedimiento . se devuelven al algoritmo principal (llamador)
para su proceso.
Lormalmente, se suele indicar en la lista de parmetros formales, de qu( clase son cada uno,
anteponi(ndole a los parmetros, las letras 4$, S$ o 45S$, segn corresponda.
+os parmetros actuales pueden ser constantes, variables, e0presiones, valores de funciones o
en un caso ms complejo, nombres de funciones o procedimientos. 4n cambio, los parmetros
formales s'lo pueden ser variables.
Parmetros por valor o por referencia
5
4l pasaje de valores puede ser por valor o por referencia.
- Paso por valor$ los valores iniciales se proporcionan copiando los valores correspondientes en
la lista de parmetros actuales.
- Paso por referencia$ se produce el paso de la direcci'n del parmetro actual. 4n realidad, se
pasa la posici'n de memoria. 6na variable pasada por referencia puede ser modificada dentro
del subalgoritmo . producir un efecto en el algoritmo de llamada.
#lgoritmo P#S#G4
entero #, N
@nicio
# M
N M
escribir (#,N)
C#HN@#(#,N)
escribir (#,N)
?in
Procedimiento C#HN@# (4$ F, S$ &)
entero F, &
@nicio
escribir (F, &)
F
&
escribir (F, &)
?in procedimiento
OPu( pasa en la memoriaQ
Antes de invocar al procedimiento: A=0 B=0
#l comen)ar el procedimiento$ #7M N7&7M F7M
#l finali)ar el procedimiento$ #7M N7&7 F7
Al volver al algoritmo principal: A=0 B=1
+as variables que usa un subalgoritmo residen en memoria 3#H, . con ellas trabaja el
procesador en la ejecuci'n del subalgoritmo.
Cuando se llama a un subalgoritmo, el procesador le dispone de un sector de memoria distinto
al del algoritmo llamador. Por ello el subalgoritmo tiene su propio segmento de memoria para
colocar los parmetros formales . toda otra variable que necesite.
+as celdas de memoria del subalgoritmo pueden ser pensadas como espacios temporales de
escritura, puesto que, cuando el procesador deja el subalgoritmo, estas celdas de memoria se
liberan . sus contenidos se pierden.
OPu( pasa cuando en el algoritmo e0isten variables cu.os nombres coinciden con algunas del
subalgoritmoQ
+a respuesta es simple$ no e0iste problema. 4sto se debe a que estn en lugares de memoria
distintos, en distintos mbitos.
Por esta ra)'n los nombres de los parmetros formales . actuales pueden ser distintos o no.
Variables locales y globales
+as variables pueden clasificarse segn su utili)aci'n en$
- variables locales$ son aquellas que estn declaradas dentro del algoritmo o subalgoritmo, .
son propias al mbito de la declaraci'n, en el sentido que cada una es distinta de otra variable
declarada con el mismo nombre en cualquier parte del algoritmo principal u otros
subalgoritmos.
6
- variables globales$ son aquellas que estn declaradas en el algoritmo o subalgoritmo . son
accesibles para los subalgoritmos que de (l dependen.
+a ventaja principal de utili)ar variables locales reside en el <ec<o de que permite independi)ar
al subalgoritmo del algoritmo principal, la comunicaci'n entre el subalgoritmo . el algoritmo
principal se reali)a a trav(s de la lista de parmetros. +a utili)aci'n efectiva del subalgoritmo
s'lo requiere que el programador cono)ca el orden . el significado de cada parmetro a fin de
construir la lista de parmetros actuales cuando se <ace uso del subalgoritmo (funci'n o
procedimiento).
+as variables globales tienen la ventaja de compartir la informaci'n de diferentes subalgoritmos
sin ninguna menci'n en la lista de parmetros del subalgoritmo.
Variables defnidas
en:
Accesibles
desde:
A A,B,C,D,E,F,G
B B,C
C C
D D,E,F,G
E E,F,G
F F
G G
# continuaci'n veremos una situaci'n problemtica resuelta de ! formas$
- en un nico algoritmo
- usando subalgoritmos
6n video club posee !9 cadetes para el reparto de sus alquileres. Cada cadete posee un legajo
que lo identifica (valor entre . !9). Por otro lado, cada cadete cobra una comisi'n sobre las
entregas que reali)a, acorde a un porcentaje que cada uno posee . que se aplica sobre el total
de los importes de las entregas que reali)a.
Cuando un cadete regresa de su entrega, informa su nmero de legajo . el importe del alquiler
entregado.
4stos datos se ingresan de manera desordenada . no se sabe cuntas entregas se reali)an en
el da. Se debe proponer un fin de datos.
7
A
B
C
D
E
F
G
Se solicita reali)ar un algoritmo en pseudoc'digo que$
a) @ngrese los porcentajes de los !9 cadetes.
b) @ngrese la informaci'n de todas las entregas. Se deber validar que los datos ingresados
sean correctos$ legajo segn los valores indicados e importe positivo. Si no son vlidos,
se volvern a solicitar <asta que sean vlidos.
c) 4mita un listado ordenado por legajo en forma descendente, con la cantidad total de
viajes de cada cadete$
+egajo Cantidad /iajes
.. ...
.. ...
d) @nforme a la gerencia, al final del da$
- 4l legajo del cadete que reali)' la ma.or cantidad de entregas.
- +a recaudaci'n total de la jornada.
- Cunto corresponde abonarle a cada cadete que reali)' entregas (no considerar
los que no reali)aron entregas), segn su porcentaje de comisi'n.
+egajo Porcentaje 1otal importes Comisi'n
.. ... D.. D
.. ... D.. D
!n un "nico algoritmo#
#lgoritmo /@*4,
entero @, +4RH, +4R, C#L1S!9T
real @HP,314, 34C#6*, P,3CS!9T, @HPS!9T
caracter 34SP
@nicio
para @ , !9
escribir(=@ngrese U comision cadete >, @)
leer(P,3CS@T)
C#L1S@T M
@HPS@T M
finApara
34C#6* M
repetir
repetir
escribir (=@ngrese legajo (valor entre . !9)>)
leer (+4R)
<asta (+4R C7 . +4R E7 !9)
repetir
escribir (=@ngrese importe de la entrega>)
leer (@HP,314)
<asta (@HP,314 C M)
34C#6* 34C#6* 8 @HP,314
C#L1S+4RT C#L1S+4RT 8
@HPS+4RT @HPS+4RT 8 @HP,314
escribir (=@ngresa otra entregaQ (S5L)>)
leer (34SP)
<asta (34SP 7 JLK)
escribir(=+egajo Cantidad /iajes>)
para @ !9, , -
escribir(@, C#L1S@T)
finApara
8
+4RH
para @ !, !9
si (C#L1S@T C C#L1S+4RH) entonces
+4RH @
finAsi
finApara
escribir(=4l cadete de legajo$ =, +4RH, = reali)o la ma.or cantidad de entregas$ =,
C#L1S+4RH)
escribir(=+egajo Porcentaje 1otal importes Comisi'n>)
para @ , !9
si (C#L1S@T C M) entonces
escribir(@, P,3CS@T, @HPS@T, @HPS@TBP,3CS@T5MM)
finAsi
finApara
?in
$sando subalgoritmos#
#lgoritmo /@*4,
entero +4RH, C#L1S!9T
real 34C#6*, P,3CS!9T, @HPS!9T
@nicio
C#3R#A@L@C@#+(P,3C,C#L1,@HP)
34C#6* M
C#3R#A/4L1#S(34C#6*,C#L1,@HP)
+@S1#(C#L1)
+4RH H#&,3(C#L1)
escribir(=4l cadete de legajo$ =, +4RH, = reali)o la ma.or cantidad de entregas$ =,
C#L1S+4RHT)
escribir(=+a recaudaci'n total de la jornada es$ =, 34C#6*)
+@S1#!(P,3C, @HP, C#L1)
?in
Procedimiento C#3R#A@L@C@#+(45S$ P,3, C#L, @HP)
real P,3S!9T
entero @, C#LS!9T, @HPS!9T
@nicio
para @ , !9
escribir(=@ngrese U comision cadete >, @)
leer(P,3S@T)
C#LS@T M
@HPS@T M
finApara
?in procedimiento
Procedimiento C#3R#A/4L1#S(45S$ 34C, C#L1, @HP)
real @HP,314, @HPS!9T, 34C
entero +4R, C#L1S!9T
caracter 34SP
@nicio
repetir
9
repetir
escribir (=@ngrese legajo (valor entre . !9)>)
leer (+4R)
<asta (+4R C7 . +4R E7 !9)
repetir
escribir (=@ngrese importe de la entrega>)
leer (@HP,314)
<asta (@HP,314 C M)
34C 34C 8 @HP,314
C#L1S+4RT C#L1S+4RT 8
@HPS+4RT @HPS+4RT 8 @HP,314
escribir (=@ngresa otra entregaQ (S5L)>)
leer (34SP)
<asta (34SP 7 JLK)
?in procedimiento
Procedimiento +@S1#(4$ C#L1)
real C#L1S!9T
entero @
@nicio
escribir(=+egajo Cantidad /iajes>)
para @ !9, , -
escribir(@, C#L1S@T)
finApara
?in procedimiento
entero ?uncion H#&,3(C#L1)
entero C#L1S!9T, @, H#&, +4R
@nicio
+4R
para @ !, !9
si (C#L1S@T C C#L1S+4RT) entonces
+4R @
finAsi
finApara
H#&,3 +4RH
?in funcion
Procedimiento +@S1#!(4$ P,3C, @HP, C#L1)
real P,3CS!9T, @HPS!9T
entero C#L1S!9T, @
@nicio
escribir(=+egajo Porcentaje 1otal importes Comisi'n>)
para @ , !9
si (C#L1S@T C M) entonces
escribir(@, P,3CS@T, @HPS@T, @HPS@TBP,3CS@T5MM)
finAsi
finApara
?in procedimiento
10

También podría gustarte