A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 1
DIRECTIVAS PREPROCESADOR
El preprocesador del C++ permite sustituir Macros, realizar compilaciones condicionales e incluir archivos, todo ello antes que empiece la compilacin del programa.
C++ reconoce los siguientes comandos.
#define, #include, #if, #ifdef, #ifndef, #endif, #else, #elif.
Directiva #include
Permite incluir un archivo (sustituir el contenido del archivo) en el programa.
Este comando se utiliza para incluir archivos con los prototipos de las funciones de librera o con mdulos de programacin y prototipos de funciones de usuario.
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 2
DIRECTIVAS PREPROCESADOR
El archivo suelen tener extensin h, o puede incluirse cualquier tipo de archivo texto.
El archivo puedes estar encerrado con doble comilla ( ) o .
#include Nombre Archivo
#include
: La bsqueda del archivo se centra en el directorio estndar de los archivos incluidos.
: Se busca el archivo en el directorio actual, y posteriormente en el directorios estndar de libreras.
Ejemplo
#include tools.h
#include
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 3
DIRECTIVAS PREPROCESADOR Directiva #define
Permite establecer una macro en el cdigo fuente del programa.
La sintaxis es la siguiente
#define NombreIdentificador
#define NOMBRE
#define NOMBRE(parametros) Texto a Introducir con parmetros.
Antes de comenzar la compilacin, el preprocesador analiza el programa y cada vez que encuentra el identificador NOMBRE lo sustituye por el texto que se especifica.
Ejemplo
#define E 2.718281828459
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 4
DIRECTIVAS PREPROCESADOR
#define E 2.718281828459
int main()
{ double a;
a=(1.0 + 1.0/E)*(1.0 -2.0/E)
..
}
Al sustituir la macro en el programa queda as:
int main()
{ double a;
a=(1.0 + 1.0/2.718281828459)*(1.0 -2.0/2.718281828459)
..
}
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 5
DIRECTIVAS PREPROCESADOR
#include
#define FARENHEIT(c) 9./5*c+32
#define KELVIN(c) 273.15+c
using namespace std;
// programa principal
int main()
{ int c;
coutc;
cout
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 6
DIRECTIVAS PREPROCESADOR
Directiva de Compilacin Condicional
#if . #else . #endif
Se compila si la condicin es verdadero, caso contrario el preprocesador los elimina del archivo fuente y el compilador nunca los visualiza.
#if . #elife . #endif
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 7
DIRECTIVAS PREPROCESADOR Directiva de Compilacion Condicional
#ifdef . #else . #endif
Si NOMBRE esta definida, produce verdadero en caso contrario produce falso.
#ifndef . #else . #endif
Prueba si NOMBRE no esta definido, si es verdadero procesa las sentencias incluidas.
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 8
DIRECTIVAS PREPROCESADOR
#include //Programa con extension cpp
#include "tools.h // Archivo de Cabecera int main()
{ float r,h;
if(Datos(r,h))
{ cout
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 9
DIRECTIVAS PREPROCESADOR
//Archivo de cabecera con extensin h (tools.h)
#define PI 3.141596
#define AreaCir(r) PI*r*r
#define AreaCil(r,h) 2*(AreaCir(r)+PI*r*h)
#define AreaRec(r,h) r*h
using namespace std;
bool Datos( float &r,float &h)
{
coutr;
couth;
return ((r>0)&&(h>0)) ? true:false;
}
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 10
DIRECTIVAS PREPROCESADOR
// Dado 3 numeros se pide determinar el mayor
#include
#define MAYOR(n,m) ((n>m) ? n:m)
#define MAYORTRES(n,m,p) ((MAYOR(n,m)>p)? MAYOR(n,m):p)
using namespace std;
int main()
{ int r,s,t;
coutr>>s>>t;
cout
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 11
DIRECTIVAS PREPROCESADOR #include
#include "embrujo.h"
//programa de aplicacin de macros sustitucin
using namespace std;
int main()
{ int i, n, sd;
VALIDAPOSITIVO(n,"Ingresa entero positivo");
ASIGNA( sd , 0 ); ASIGNA( i , 1 );
MIENTRAS(ESMENORIGUAL(i,n/2))
{ if(ESDIVISOR(n,i))
ASIGNA(sd,sd + i );
ASIGNA(i,i + 1 );
}
if(ESIGUAL(sd,n))
ESCRIBIR("Es perfecto");
else
ESCRIBIR("No es perfecto");
CAMBIARLINEA; system("PAUSE") ;
}
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 12
DIRECTIVAS PREPROCESADOR
// Debe almacenar en el archivo embrujo.h
#ifndef EMBRUJO_H
#define EMBRUJO_H
#define ASIGNA(a, b) a = b
#define VALIDAPOSITIVO(n, str) do{ coutn; }while(n
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 13
DIRECTIVAS PREPROCESADOR /* Programa que muestra los digitos de un numero entero, calcula la suma y lo muestra
utilizando macros */
#include
#include "digitos.h"
using namespace std;
int main()
{ int a,d,s=0;
ESCRIBIR("Ingrese un numero:"); LEER(a);
ESCRIBIR("Los Digitos son:");
MIENTRAS(a)
INICIO
DIGITO(a,d);
OUT(d);
ACUMULAR(s,d);
CAMBIAR(a);
FIN
CAMBIARLINEA;
ESCRIBIR("La Suma es:");
OUT(s);CAMBIARLINEA;
PAUSA;
}
A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 14
DIRECTIVAS PREPROCESADOR
#ifndef H_DIGITOS
#define H_DIGITOS
#define LEER(a) cin>>a
#define ESCRIBIR(s) cout