Sei sulla pagina 1di 14

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 Kstdio.hL 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

Potrebbero piacerti anche