Subprogramas en C
Una vez que tengamos un programa que resuelva un problema concreto debemos ser capaces de usarlo tantas veces como queramos sin tener que reescribirlo. #include ... // Programa principal int main (int argc, char **argv ! ... " // Subprogramas ... // #unciones $ procedimientos
%&P'()*+),- .os subprogramas s/lo se e0ecutan cuando son invocados desde el programa principal o desde otros subprogramas.
Para crear un subprograma, lo primero que tenemos que hacer es escribir su cabecera (prototipo , que inclu$e el nombre del subprograma $ su lista de par1metros2loat sqrt (2loat 3 4 *dem1s de la cabecera, tendremos que escribir el cuerpo de la 2unci/n... // Calculamos la ra5z cuadrada ... // 6alor devuelto por la 2unci/n return ... Una vez que hemos completado la implementaci/n del subprograma, podemos usarlo cuando lo necesitemosa 7 sqrt(8.9 b 7 :*sqrt(a;delta c 7 < / sqrt(b 3 7 (=b ; sqrt(b*b=8*a*c /(:*a
Parmetros formales y parmetros actuales ,0emploc 7 sqrt(:.>>;sqrt(8*b />8.<:
Paso de parmetros por valor:
,l subprograma traba0a sobre una copia del valor del par1metro actual-
Paso de parmetros por referencia:
)odos los cambios que hagamos dentro del subprograma para modi2icar un par1metro pasado por re2erencia se re2le0ar1n en el par1metro actual correspondiente.
PASO POR VALOR vs. PASO POR REFEREN !A
+')* ,n *+S% C s/lo e3iste el paso de par1metros por valor. ,l paso de par1metros por re2erencia lo simulamos utilizando punteros.
Funciones:
Una 2unci/n es un subprograma que devuelve, de 2orma e3pl5cita, un valor-
tipo nom"re #parmetros formales$ ! // ?eclaraciones locales ... // Sentencias e0ecutables ... // 6alor devuelto return ...@ "
E%emplo: Pro&rama modular para sumar dos n'meros
int suma (int a, int b ! return a;b@ " int main ( ! int 3,$,s@ print2(A,scriba : nBmeros enterosC @ scan2(ADd DdE, F3, F$ @ s 7 suma(3,$ @ print2(A.a suma es DdC, s @ return 9@ "
Procedimientos:
* di2erencia de las 2unciones, no devuelven ningBn valor-
void nom"re #parmetros formales$ ! // ?eclaraciones locales ... // Sentencias e0ecutables ... "
E%emplo: Visuali(ar un mensa%e en pantalla )eclaraci*n: void mostrar+ensa%e#c,ar -mensa%e$. /so: mostrar+ensa%e#0+ensa%e informativo1$. !mplementaci*n: void mostrar+ensa%e #c,ar -mensa%e$ 2 printf#0+iPro&rama v3.45n1$. printf#06s5n17 mensa%e$. 8
En
s*lo e9iste el paso de parmetros por valor: void sub (int 3, int $ ! 3 7 3;$@ " int main ( ! int z,t@ z7G@ t7<9@ print2(CDd DdHnC,z,t sub(z,t @ print2(CDd DdHnC,z,t sub(z,8 @ print2(CDd DdHnC,z,t sub(z,:*t;:9 @ print2(CDd DdHnC,z,t sub(>,:9 @ print2(CDd DdHnC,z,t " // Paso de par1metros por valor
@ // G <9 @ // G <9 @ // G <9 @ // G <9 @ // G <9
,l paso de atributos por re2erencia se puede simular si utilizamos punteros (pasamos como par1metros las direcciones en memoria de las variables que queremos modi2icar dentro del subprograma void sub (int *3, int $ // Paso de par1metros por re2erencia ! *3 7 (*3 ; $@ " int main ( ! int z,t@ z7G@ t7<9@ print2(CDd DdHnC,z,t @ // G <9 sub(Fz,t @ print2(CDd DdHnC,z,t @ // <G <9 sub(Fz,8 @ print2(CDd DdHnC,z,t @ // <I <9 sub(Fz,:*t;:9 @ print2(CDd DdHnC,z,t @ // GI <9 sub(F>,:9 @ // ,(('( sub(F(z;>: ,:9 @ // ,(('( "
Jmbito de las variables
#include [Link] int a,b@ void &iSub< (int 3, int *$ ! int h 7 3*8@ *$ 7 h ; 3 ; > ; a@ " void &iSub: (int 3 ! int b 7 :*3@ a 7 b ; >@ " int main ( ! a7>@ b78@ &iSub<(a,Fb @ print2(ADd DdE,a,b @ &iSub:(>: @ print2(ADd DdE,a,b @ "
Salida del programa> :< MN :<
+o se aconse0a el uso de variables globales. Si un subprograma requiere utilizar un dato e3terno, dicho dato ha de pas1rsele como par1metro al subprograma (para que el subprograma conserve su AindependenciaE