Está en la página 1de 5

USO DE SUBRUTINAS, TRANSMISIN DE

PARMETROS Y COMPILACIN CONDICIONAL EN


C++

Bruno Lpez Takeyas


Instituto Tecnolgico de Nuevo Laredo
Reforma Sur 2007, C.P. 88250, Nuevo Laredo, Tamps. Mxico
http://www.itnuevolaredo.edu.mx/takeyas
E-mail: takeyas@itnuevolaredo.edu.mx

Bsicamente una Subrutina es un segmento de float CALCULA(void); // Devuelve un


cdigo que se escribe slo una vez pero puede valor de tipo real
invocarse o ejecutarse muchas veces. Existen dos
tipos: Procedimientos y Funciones.

3. Limitacin de return()
? Procedimientos
La clusula return() slo devuelve un valor. Si
Subrutinas se desea que la funcin devuelva ms de un valor
? Funciones debe usarse otro mecanismo.

4. Variables locales y
globales
1. Procedimientos
Las variables que se declaran dentro de una
Son un tipo de subrutina que ejecuta un subrutina se llaman locales mientras que las variables
conjunto de acciones sin devolver valor alguno como globales se conocen a travs del programa entero y
resultado de dichas operaciones. Estos se identifican se pueden usar en cualquier segmento de cdigo
por su declaracin void(). manteniendo su valor. Se pueden declarar variables
globales declarndolas fuera de cualquier funcin.
P. ejem. Cualquier funcin puede acceder a ellas sin tener en
void Rutina(void); cuenta en qu funcin est dicha expresin.
void TAREA(void);

2. Funciones 5. Usando argumentos para


pasar datos a subrutinas
A diferencia de los procedimientos, las
funciones despus de ejecutar un conjunto de El mecanismo para enviar informacin a las
acciones devuelven slo un valor del tipo usado en la subrutinas es llamado argumento (algunos autores lo
declaracin de sta por medio de return(). conocen como parmetro) y son los datos que se
colocan entre parntesis al invocarlas.
P. ejem. P. ejem.
int SUMA(void); // Devuelve un valor de
tipo entero int PROCESO(int x, float y)
Argumentos
1
Se pueden enviar varios argumentos a una
subrutina, sin embargo es necesario precisar que
7. Paso de argumentos por
deben estar declaradas las variables receptoras en el referencia
orden indicado considerando el tipo de dato
apropiado. Existen dos formas de pasar argumentos a una
subrutina: por valor y por referencia. Hasta este punto
slo se ha analizado el envo de valores, pero
tambin se puede enviar la direccin de memoria de
6. Recibiendo un valor de una variable a una subrutina.

una funcin
Una vez que se invoca una funcin es
necesario utilizar la variable capaz de recibir el valor TIP
calculado por sta, la cual debe ser del mismo tipo de
la funcin. P. Ejem.
Todos los arreglos se pasan por
a=PROCESO(3, 5.25); referencia a una subrutina
en el caso anterior, la variable a recibe el valor
calculado por la funcin PROCESO, quien acepta
los argumentos 3 y 5.25 respectivamente. En el ejemplo de la Fig. 1 se muestra una
variable x de tipo entero, que se pasa por referencia
/*
Programa para el paso de argumentos por (se manda su direccin de memoria) a un
referencia procedimiento llamado RUTINA, quien recibe dicha
direccin con una variable apuntador a un valor
Instructor: M.C. Bruno Lopez Takeyas entero (y). La variable y recibe la direccin donde se
*/
aloja el valor de x y esto provoca que cuando se
#include <conio.h> modifica lo que apunta y (valor de x), indirectamente
#include <iostream.h> se modifica el valor de x. Esto se refleja en memoria
void RUTINA(int *y); // Declaracion del
como lo indica la Fig. 2.
procedimiento RUTINA que acepta
// un argumento Memoria RAM
(apuntador a un entero)

void main(void) 1400


{ 1401 3 x
int x=3; 1402
clrscr(); 1403
cout << "\n\r Antes de la rutina x=" << x; 1404
1405 1401 y
RUTINA(&x); // Envio de la direccion de x
como argumento
Fig. 2.- Apuntadores como receptores de direcciones
cout << "\n\n\n\r Despues de la rutina x=" <<
x;
El programa de la Fig. 3 muestra una
getch();
return; aplicacin tpica de envo de argumentos por
} referencia: el ordenamiento de un arreglo.
void RUTINA(int *y)
{
cout << "\n\n\n\r Valor recibido por y=" <<
*y;
*y+=5;
cout << "\n\n\n\r Valor modificado de y=" <<
*y;
return;
} 2
for(i=0;i<TOP;i++)
printf("%2d ",B[i]);
/* return;
Programa para ordenar un arreglo }
(pasandolo por referencia)
void SORTEADOR(int B[TOP])
Instructor: M.C. Bruno Lopez Takeyas {
*/ int i,j,aux; // Variables locales

#include <conio.h> for(i=0;i<TOP-1;i++)


#include <stdio.h> for(j=i+1;j<TOP;j++)
#include <iostream.h> if(B[i]>B[j])
{
#define TOP 10 // Cantidad de elementos aux=B[i];
en el arreglo B[i]=B[j]; // Intercambio de
elementos
void SORTEADOR(int B[TOP]); // B[j]=aux;
Declaracion del que acepta el arreglo B }
// para ordenarlo return;
en forma ascendente }

void IMPRIME(int B[TOP]); //


Procedimiento que imprime los elementos Fig. 3.- Sorteador de un arreglo
// de un arreglo

void main(void) 8. Compilacin condicional


{
int A[TOP]={3,5,6,7,8,0,2,9,1,4}; // Las directivas del preprocesador #if, #ifdef,
Declaracion e inicializacion del #ifndef, #else, #elif, #endif, compilarn
// arreglo selectivamente varias porciones de un programa. La
original idea general es que si la expresin despus de #if,
#ifdef o #ifndef es cierta, entonces el cdigo que
clrscr();
est entre una de las precedentes y un #endif se
compilar; de lo contrario se saltar. La directiva
cout << "\n\rArreglo antes de sortearlo
#endif marca el final de un bloque #if. El #else se
..."; puede usar con cualquiera de los anteriores de
IMPRIME(A); // Imprime los elementos
manera similar a las sentencias else e if. El programa
del arreglo A antes de sortearlo
de la Fig. 4 ilustra el us o de estas directivas.
SORTEADOR(A); // Procedimiento para
ordenar el arreglo A en forma ascendente /*
Programa para mostrar la forma de
cout << "\n\n\n\rArreglo despues de compilar condicionalmente un programa
sortearlo ...";
IMPRIME(A); // Imprime los elementos Instructor: M.C. Bruno Lopez Takeyas
del arreglo A despues de sortearlo */
getch();
return; #include <conio.h>
} #include <stdio.h>
#include <iostream.h>
void IMPRIME(int B[TOP])
{ #define CAPTURAR_ELEMENTOS // Bandera
int i; // Variable local para activar/desactivar la compilacion
// de un segmento
printf("\n\r"); de codigo
3
// Si se omite int i; // Variable local
esta definicion, se cancela la
// captura de los
elementos desde el teclado printf("\n\r");
for(i=0;i<TOP;i++)
#define TOP 10 // Cantidad de elementos printf("%2d ",B[i]);
en el arreglo return;
}
void SORTEADOR(int B[TOP]); //
Declaracion del que acepta el arreglo B void SORTEADOR(int B[TOP])
// para ordenarlo {
en forma ascendente int i,j,aux; // Variables locales

void IMPRIME(int B[TOP]); // for(i=0;i<TOP-1;i++)


Procedimiento que imprime los elementos for(j=i+1;j<TOP;j++)
// de un arreglo if(B[i]>B[j])
{
void main(void) aux=B[i];
{ B[i]=B[j]; // Intercambio de
#ifdef CAPTURAR_ELEMENTOS elementos
int A[TOP]; B[j]=aux;
int i; }
#else if return;
int A[TOP]={3,5,6,7,8,0,2,9,1,4}; // }
Declaracion e inicializacion del
// arreglo
original Fig. 4.- Compilacin condicional
#endif CAPTURAR_ELEMENTOS

clrscr();

#ifdef CAPTURAR_ELEMENTOS 9. Encabezados creados por


for(i=0;i<TOP;i++)
{ el programador (archivos
printf("\n\rA[%d] ? ",i);
cin >> A[i];
*.h)
}
Los archivos de encabezados (tambin
#endif CAPTURAR_ELEMENTOS
conocidos como archivos include) son de texto tal
como los que codifica el programador usando el editor
cout << "\n\rArreglo antes de sortearlo
de programas de Turbo C++. Regularmente se
...";
encuentran almacenados en el subdirectorio
IMPRIME(A); // Imprime los elementos
\INCLUDE. Es posible colocar estatutos en el listado
del arreglo A antes de sortearlo
de programas que no son cdigo de programacin
sino mensajes para el compilador. Estos mensajes
SORTEADOR(A); // Procedimiento para
ordenar el arreglo A en forma ascendente llamados directivas del compilador, informan al
compilador de definiciones de frases. Ciertas
cout << "\n\n\n\rArreglo despues de directivas del compilador se agrupan en los archivos
sortearlo ..."; de encabezados y pueden ser includas en el cdigo
IMPRIME(A); // Imprime los elementos fuente de los programas antes de compilarse. Sin
del arreglo A despues de sortearlo embargo, el programador puede disear segmentos
getch(); de cdigo (regularmente con subrutinas) que utiliza
return; repetidamente en sus programas, es entonces
} cuando surge la necesidad de crear archivos de
encabezados que slo incluye en sus programas
void IMPRIME(int B[TOP]) cada vez que los necesita, basta con codificar las
{ rutinas y grabarlas en un archivo con extensin h. La

4
Fig. 5 muestra un ejemplo de la forma de incluir estos
encabezados creados por el usuario.

#include c:\\tarea\\CAPTURA.h

Fig. 5.- Encabezados creados por el programador.

10. Bibliografa

? Barkakati Nabajyoti. The Waite Groups.


Turbo C Bible. Howard W. Sams &
Company. Estados Unidos. 1990.

? Garca Badell, J. Javier. "Turbo C.


Programacin en manejo de archivos".
Macrobit.

? Deitel y Deitel. C++ Cmo programar.


Segunda edicin. Pearson-Prentice Hall. Estados
Unidos. 1999.

? Lafore, Robert. The Waite Groups.


Turbo C. Programming for the PC.
Revised Edition. Howard W. Sams &
Company. Estados Unidos. 1990.

? Schildt, Herbert. Turbo C.


Programacin avanzada. Segunda
edicin, McGraw Hill. Estados Unidos.
1990.

? Staugaard, Andrew. Tcnicas


estructuradas y orientadas a objetos.
Una introduccin utilizando C++ .
Segunda edicin. Prentice Hall. Estados
Unidos. 1998.

También podría gustarte