HERRAMIENTAS PARA MEJORAR EL ESTILO DE
PROGRAMACIÓN EN C++
2. Funciones
A diferencia de los procedimientos, las
funciones después de ejecutar un conjunto de
Bruno López Takeyas
Instituto Tecnológico de Nuevo Laredo
Reforma Sur 2007, C.P. 88070, Nuevo Laredo, Tamps. México
http://www.itnuevolaredo.edu.mx/takeyas
E-mail:
[email protected]
Resumen: El presente documento tiene como
objetivo crear conciencia de
los programadores de
lenguaje C/C++ sobre el aprovechamiento de los recursos
que proporciona el lenguaje y el compilador para mejorar
el estilo de programación y facilitar la depuración y
corrección de
los programas. Para este efecto se
mencionan temas de suma importancia : Uso de subrutinas,
procedimientos, funciones, manejo de variables locales y
globales,
compilación
condicional y la forma de crear y usar encabezados
diseñados por el programador.
argumentos,
parámetros
Básicamente una Subrutina es un segmento de
código que se escribe sólo una vez pero puede
invocarse o ejecutarse muchas veces. Existen dos
tipos: Procedimientos y Funciones.
o
Subrutinas
? Procedimientos
? Funciones
1. Procedimientos
Son un tipo de subrutina que ejecuta un
conjunto de acciones sin devolver valor alguno como
resultado de dichas operaciones. Estos se identifican
por su declaración void().
P. ejem.
void Rutina(void);
void TAREA(void);
1
acciones devuelven sólo un valor del tipo usado en la
declaración de ésta por medio de return().
P. ejem.
int SUMA(void); // Devuelve un valor de
tipo entero
float CALCULA(void); // Devuelve un
valor de tipo real
3. Limitación de return()
La cláusula return() sólo devuelve un valor. Si
se desea que la función devuelva más de un valor
debe usarse otro mecanismo (uso de apuntadores).
4. Variables locales y
globales
Las variables que se declaran dentro de una
subrutina se llaman locales mientras que las variables
globales se conocen a través del programa entero y
se pueden usar en cualquier segmento de código
manteniendo su valor. Se pueden declarar variables
globales declarándolas fuera de cualquier función.
Cualquier función puede acceder a ellas sin tener en
cuenta en qué función esté dicha expresión.
5. Usando argumentos para
pasar datos a subrutinas
El mecanismo para enviar información a las
subrutinas es llamado argumento (algunos autores lo
conocen como parámetro) y son los datos que se
colocan entre paréntesis al invocarlas.
P. ejem.
*y+=5;
cout << "\n\n\n\r Valor modificado de y=" << *y;
return;
}
int PROCESO(int x, float y)
Fig. 1.- Paso de argumentos por referencia
1400
1401
1402
1403
1404
1405
Memoria RAM
3
1401
x
y
Fig. 2.- Apuntadores como receptores de direcciones
la Fig. 3 muestra una
típica de envío de argumentos por
El programa de
aplicación
referencia: el ordenamiento de un arreglo.
/*
Programa para ordenar un arreglo (pasandolo por
referencia)
Autor: M.C. Bruno Lopez Takeyas
2
7. Paso de argumentos por
referencia
Existen dos formas de pasar argumentos a una
subrutina: por valor y por referencia. Hasta este punto
sólo se ha analizado el envío de valores, pero
también se puede enviar la dirección de memoria de
una variable a una subrutina.
Todos los arreglos se pasan por
referencia a una subrutina
TIP
En el ejemplo de la Fig. 1 se muestra una
variable x de tipo entero, que se pasa por referencia
(se manda su dirección de memoria) a un
procedimiento llamado RUTINA, quien recibe dicha
dirección con una variable apuntador a un valor
entero (y). La variable y recibe la dirección donde se
aloja el valor de x y esto provoca que cuando se
modifica lo que apunta y (valor de x), indirectamente
se modifica el valor de x. Esto se refleja en memoria
como lo indica la Fig. 2.
Argumentos
Se pueden enviar varios argumentos a una
subrutina, sin embargo es necesario precisar que
deben estar declaradas las variables receptoras en el
orden
tipo de dato
apropiado.
indicado considerando el
6. Recibiendo un valor de
una función
Una vez que se
función es
necesario utilizar la variable capaz de recibir el valor
calculado por ésta, la cual debe ser del mismo tipo de
la función. P. Ejem.
invoca una
a=PROCESO(3, 5.25);
// un argumento (apuntador a
en el caso anterior, la variable “a” recibe el valor
calculado por la función “PROCESO”, quien acepta
los argumentos 3 y 5.25 respectivamente.
/*
Programa para el paso de argumentos por
referencia
Autor: M.C. Bruno Lopez Takeyas
*/
#include <conio.h>
#include <iostream.h>
void RUTINA(int *y); // Declaracion del
procedimiento RUTINA que acepta
un entero)
void main(void)
{
int x=3;
clrscr();
cout << "\n\r Antes de la rutina x=" << x;
RUTINA(&x); // Envio de la direccion de “x” como
argumento
cout << "\n\n\n\r Despues de la rutina x=" << x;
getch();
return;
}
void RUTINA(int *y)
{
cout << "\n\n\n\r Valor recibido por y=" << *y;
// arreglo
// de un arreglo
// para ordenarlo en
*/
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#define TOP 10 // Cantidad de elementos en el
arreglo
void SORTEADOR(int B[TOP]); // Declaracion del
que acepta el arreglo B
forma ascendente
void IMPRIME(int B[TOP]); // Procedimiento que
imprime los elementos
void main(void)
{
int A[TOP]={3,5,6,7,8,0,2,9,1,4}; // Declaracion
e inicializacion del
original
clrscr();
cout << "\n\rArreglo antes de sortearlo ...";
IMPRIME(A); // Imprime los elementos del arreglo
A antes de sortearlo
SORTEADOR(A); // Procedimiento para ordenar el
arreglo A en forma ascendente
cout << "\n\n\n\rArreglo despues de sortearlo
...";
IMPRIME(A); // Imprime los elementos del arreglo
A despues de sortearlo
getch();
return;
}
void IMPRIME(int B[TOP])
{
int i; // Variable local
printf("\n\r");
for(i=0;i<TOP;i++)
printf("%2d ",B[i]);
return;
}
void SORTEADOR(int B[TOP])
{
int i,j,aux; // Variables locales
for(i=0;i<TOP-1;i++)
for(j=i+1;j<TOP;j++)
if(B[i]>B[j])
{
elementos
}
return;
}
aux=B[i];
B[i]=B[j]; // Intercambio de
B[j]=aux;
Fig. 3.- Sorteador de un arreglo
3
8. Compilación condicional
#elif,
#else,
#endif,
Las directivas del preprocesador #if, #ifdef,
#ifndef,
compilarán
selectivamente varias porciones de un programa. La
idea general es que si la expresión después de #if,
#ifdef o #ifndef es cierta, entonces el código que
está entre una de las precedentes y un #endif se
compilará; de lo contrario se saltará. La directiva
#endif marca el final de un bloque #if. El #else se
puede usar con cualquiera de los anteriores de
manera similar a las sentencias else e if. El programa
de la Fig. 4 ilustra el us o de estas directivas.
// captura de los
// Si se omite esta
// de un segmento de
/*
Programa para mostrar la forma de compilar
condicionalmente un programa
Autor: M.C. Bruno Lopez Takeyas
*/
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#define CAPTURAR_ELEMENTOS // Bandera para
activar/desactivar la compilacion
codigo
definicion, se cancela la
elementos desde el teclado
#define TOP 10 // Cantidad de elementos en el
arreglo
void SORTEADOR(int B[TOP]); // Declaracion del
que acepta el arreglo B
forma ascendente
void IMPRIME(int B[TOP]); // Procedimiento que
imprime los elementos
void main(void)
{
#ifdef CAPTURAR_ELEMENTOS
int A[TOP];
int i;
#else if
int A[TOP]={3,5,6,7,8,0,2,9,1,4}; //
Declaracion e inicializacion del
original
#endif CAPTURAR_ELEMENTOS
clrscr();
#ifdef CAPTURAR_ELEMENTOS
for(i=0;i<TOP;i++)
{
// para ordenarlo en
// de un arreglo
// arreglo
printf("\n\rA[%d] ? ",i);
cin >> A[i];
}
#endif CAPTURAR_ELEMENTOS
cout << "\n\rArreglo antes de sortearlo ...";
IMPRIME(A); // Imprime los elementos del arreglo
A antes de sortearlo
SORTEADOR(A); // Procedimiento para ordenar el
arreglo A en forma ascendente
cout << "\n\n\n\rArreglo despues de sortearlo
...";
IMPRIME(A); // Imprime los elementos del arreglo
A despues de sortearlo
getch();
return;
}
void IMPRIME(int B[TOP])
{
int i; // Variable local
printf("\n\r");
for(i=0;i<TOP;i++)
printf("%2d ",B[i]);
return;
}
void SORTEADOR(int B[TOP])
{
int i,j,aux; // Variables locales
for(i=0;i<TOP-1;i++)
for(j=i+1;j<TOP;j++)
if(B[i]>B[j])
{
elementos
}
return;
}
aux=B[i];
B[i]=B[j]; // Intercambio de
B[j]=aux;
Fig. 4.- Compilación condicional
9. Encabezados creados por
el programador (archivos
*.h)
Los archivos de encabezados
(también
conocidos como archivos “include”) son de texto tal
como los que codifica el programador usando el editor
de programas de Turbo C++. Regularmente se
encuentran almacenados en el
subdirectorio
\INCLUDE. Es posible colocar estatutos en el listado
de programas que no son código de programación
sino mensajes para el compilador. Estos mensajes
llamados “directivas del compilador”,
informan al
compilador de definiciones de
frases. Ciertas
directivas del compilador se agrupan en l
Comentarios de: Herramientas para mejorar el estilo de programación en C++ (0)
No hay comentarios