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