Está en la página 1de 33

Tema 4

Subprogramas

Maximiliano Paredes Velasco 1


Objetivo

• Exponer las principales ventajas de la


descomposición de programas en
subprogramas

• Presentar la correcta construcción de


programas y de subprogramas

Maximiliano Paredes Velasco 2


4.1 Estructura de
subprogramas
• Problemas:
código fuente repetido
falta de estructuración del código fuente

• Solución: subprogramas
 un subprograma soluciona una parte del
problema inicial (facilita la estructuración)
pueden ser utilizados desde distintos puntos de
un programa (evitan la repetición de código)
Maximiliano Paredes Velasco 3
4.1 Estructura de
subprogramas

• Hay 2 tipos de subprogramas:

procedimientos: instrucciones definidas por el


programador

funciones: expresiones definidas por el


programador

Maximiliano Paredes Velasco 4


Ejemplo 4.1

Dibujar el patrón
––
|
|
––
|
|
––

Maximiliano Paredes Velasco 5


Ejemplo 4.1: EseNOModular
PROGRAM EseNOModular (output);

{ Programa que permite dibujar una ESE,


sin utilizar subprogramas

1.- Se dibuja la horizontal


2.- “ “ vertical al margen
izquierdo
3.- Se dibuja la horizontal
4.- “ “ vertical al margen
derecho
5.- Se dibuja la horizontal de abajo
NOTA: No necesita entradas }
Maximiliano Paredes Velasco 6
Análisis del ejemplo

• Funciones
devuelven exactamente un valor. Dicho valor se
determina, asignándolo al “nombre” de la función
las llamadas se tratan como expresiones (de igual
manera que si estuvieran predefinidas en Pascal)

t:=TanDeGrados(a) (función definida por el programador)


n:= abs(a) (función predefinida en Pascal)

Maximiliano Paredes Velasco 7


Análisis del ejemplo

• Parámetros:
permiten pasar información a la función (o en
general, al subprograma)

el tipo (y el número) de argumentos en la


llamada han de coincidir con el tipo (y el
número) de los parámetros de la declaración de
la función (o del subprograma)

Maximiliano Paredes Velasco 8


Estructura sintáctica:

• Procedimientos

void <idenproc> ([tipo [&] idenPara, ...], ...){


[declaraciones ]

parámetros
[Cuerpo de instrucciones]
}

void imprimeEsteNumero (int num){


printf(“%i”, num);
}
Maximiliano Paredes Velasco 9
Estructura sintáctica:
• Funciones

tipo <idenfunc> ([tipo [&] idenPara,...){


[declaraciones ]

[Cuerpo de instrucciones ] parámetros


return valorTipo;
} int sumna (int n1, int n2){
tipo de la función return n1+n2;
}
Nota: las funciones no devuelven arrays

Maximiliano Paredes Velasco 10


Estructura sintáctica:
declaraciones

• Declaraciones y definiciones
Idénticas que las del programa:
tipos
constantes
Propios del subprograma. Sólo
variables
desde él se accede a ellos
procedimientos
funciones
Estas definiciones + parámetros constituyen los
elementos locales del subprograma
Maximiliano Paredes Velasco 11
Estructura sintáctica:
cuerpo

• Cuerpo de Instrucciones
secuencia de instrucciones

implementa el algoritmo que resuelve el problema


para el que se definió el subprograma

las instrucciones del cuerpo se ejecutan con cada


llamada al subprograma

Maximiliano Paredes Velasco 12


Estructura sintáctica de
las llamadas

• Procedimientos:
igual que las instrucciones predefinidas
Identificador ( Expresión )
de proc.
,

• Funciones:
igual que las funciones predefinidas

Maximiliano Paredes Velasco 13


Semántica: llamada a
procedimiento
#include …
declaraciones
void P(parámetros){
declaraciones
instrucciones
(2)
}
int main(){ (1)
… (3)

P();

} Maximiliano Paredes Velasco 14
Semántica: llamada a
función

declaraciones
int F (int p){
int t;
t=25+p;
….. (2)
return expresión;
} (1)
int main(){ (3)

iden=F(34);
… üiden ha de ser de un tipo compatible con tipoF
} Maximiliano Paredes Velasco 15
4.2 Subprogramas con
parámetros

• Parámetros formales (“ficticios”)


se utilizan sólo a efectos de definición en el
encabezamiento del subprograma
son datos genéricos que no almacenan valores de
verdad

Maximiliano Paredes Velasco 16


Sentencia return

• Sintaxis return expresion;


• Sirve para devolver el valor de la función
• Provoca la finalización inmediata
Esté en el punto que esté
El resto de instrucciones no se ejecutan
• Se puede colocar en cualquier sitio y puede
haber varias
• En los procedimientos puedo usar return; para
finalizar (sin ningún valor
Maximiliano al lado)
Paredes Velasco 17
Sentencia return
• Ejemplo
int maximo (int x, int y){
if(x>=y){
return x;
}else{
return y;
}
Maximiliano Paredes Velasco 18
4.2 Subprogramas con
parámetros

• Parámetros reales (“actuales”)


se utilizan en la llamada al subprograma
variables (o expresiones) que determinan los
valores concretos con los que se ejecuta el
subprograma

t= TanDeGrados(a);

Maximiliano Paredes Velasco 19


Subprogramas con
parámetros

• Formas de intercambiar información entre


el programa principal y el subprograma
parámetros de entrada (al subprograma)

parámetros de salida “

parámetros de entrada/salida “

Maximiliano Paredes Velasco 20


Subprogramas con
parámetros

• ¿Cómo se especifica si un parámetro es de


entrada?

• Parámetros por valor:


Utilización: Parámetros de entrada
Sintaxis: se usan por defecto
Ejemplo:
float TanDeGrados(float valor)
Maximiliano Paredes Velasco 21
Mecanismo de paso de
parámetros por valor
• Semántica:
se calcula el valor de los parámetros reales en la
llamada (evaluando las expresiones correspondientes)
una copia de dicho valor se asigna a los parámetros
formales del subprograma
el subprograma opera sobre esta copia
al finalizar el subprograma se pierde su estado de
cómputo local, y cualquier cambio hecho en el
parámetro formal NO quedará reflejado en el
parámetro real
Maximiliano Paredes Velasco 22
Mecanismo de paso de
parámetros por valor

• Restricciones:
los parámetros reales pueden ser expresiones
parámetros formales y reales han de ser del
mismo tipo

Maximiliano Paredes Velasco 23


Subprogramas con
parámetros
• ¿Cómo se especifica si un parámetro es de
salida?

• Parámetros por referencia:


Utilización:Parámetros de entrada/salida
Sintaxis: Se antepone & a los parámetros
formales en el encabezamiento y se devuelve void
Ejemplo:
void LeePunto( float &x, float y)
Maximiliano Paredes Velasco 24
Mecanismo de paso por
referencia

• Semántica:
los parámetros reales sustituyen directamente a
los parámetros formales (es decir: los parámetros
formales son sinónimos de los parámetros reales)
el subprograma va modificando dichos
parámetros
aunque al finalizar el subprograma se pierde su
estado de cómputo local, cualquier cambio hecho
en el parámetro formal SI quedará reflejado en el
parámetro real Maximiliano Paredes Velasco 25
Mecanismo de paso por
referencia

• Restricciones:
sólo se permiten variables como parámetros
reales
parámetros formales y reales han de ser de tipos
idénticos

Maximiliano Paredes Velasco 26


4.3 Vigencia y Ámbito

• Aspectos

Estructura de bloques
Vigencia de objetos
Ámbito de identificadores
Efectos laterales

Maximiliano Paredes Velasco 27


ALCANCE DE LAS
VARIABLES
• Variables globales:
se declaran en el bloque del programa principal
(entre el #include y las definiciones de
subprogramas)
p.e.: numero, numInvertido
• Variables locales de un subprograma:
se declaran en el bloque del mismo subprograma
(entre las cabecera y sus instrucciones)
p.e.: aux es variable local de darVuelta

Maximiliano Paredes Velasco 28


Ámbito
• Ambito (o visibilidad) de un identificador:
los bloques en los que se puede acceder a un
objeto
el ámbito de un identificador es el bloque del
subprograma en el que está definido, incluyendo
todos los bloques interiores a él
EXCEPCIÓN: que en los bloques interiores halla
un identificador idéntico que lo oculte
NOTA: en C+- no permite declaraciones de
bloques subprogramas anidadas
Maximiliano Paredes Velasco 29
Efectos Laterales

• Efectos laterales (o secundarios):


Cuando un subprograma influye directamente al
estado de cómputo de otros (es decir, sin que
estos efectos sean producidos por el paso de
parámetros)
Ejemplo:
void incrementarContador(){
{Modifica la variable no local “contador”}
contador = contador+1
} {incrementarContador}

Maximiliano Paredes Velasco 30


Efectos Laterales

• Efectos laterales:
los efectos laterales se producen al asignar
valores a variables globales o no-locales a un
subprograma
aunque dichas asignaciones son sintácticamente
correctas, no se deben usar porque:
disminuyen la reusabilidad del subprograma
dificultan la depuración y verificación del
programa

Maximiliano Paredes Velasco 31


Efectos laterales
• Redefinición de elementos
Se pueden repetir identificadores en bloques
internos
No afectan a las variables más externas (no son
las del bloque interno)
En el bloque interno se referencia la más cercana
• Doble referencia:
La misma variable se accede por dos nombre (el
suyo y por un parámetro)
Maximiliano Paredes Velasco 32
Ejemplo doble referencia
int global;
void cuadrado(int & dato){
global=5;
dato=dato*dato;
}
global=3;
Cuadrado(global)

La salida es 25 y no 9 como lo esperado


Maximiliano Paredes Velasco

También podría gustarte