Sie sind auf Seite 1von 19

Programacin I, Conferencia 2

Programacin I
Tema I: Introduccin a la Programacin.
Conferencia 2 Funciones, variables y clases de almacenamiento
Sumario:
1. Prototipo y llamado a funciones
2. Declaracin de una funcin. Parmetros y argumentos.
3. Funciones en lnea.
4. Variables y Clases de Almacenamiento
5. Directivas de Procesamiento
Objetivos de la clase:
1. Conocer la estructura y utilizacin de una funcin en C++
2. Aprender a construir funciones en C++
3. Que el estudiante conozca las directivas del procesador, la necesidad de
su uso y realice sus propias aplicaciones.
Bibliografa:
-

M. M. DEITEL, P. J. DEITEL Como programar en C/C++. 2/ED. Prentice-Hall.


Hispanoamericana, SA, Mxico, 1995 (Libro de texto).

Teach Yourself C++ in 21 Days, Second Edition. Formato electrnico.


ELECTROWEB

KERHIGHAN, BRIAN W.; RITCHIE, DENNIS M. The C Programming Language. New


Jersey. 1978. pp. 1-9.

Funciones
Se dijo que un programa en C/C++ est compuesto por mdulos llamados
funciones. Los programas se escriben combinando nuevas funciones realizadas
por el programador con funciones preempacadas, disponibles en la biblioteca
estndar de C++. La biblioteca estndar de C++ contiene una amplia coleccin de
funciones para llevar a cabo clculos matemticos comunes, manipulacin con
cadenas, manipulacin con caracteres, entrada/salida y muchas otras operaciones
tiles. Esto facilita la tarea del programador, porque estas funciones proporcionan
muchas de las capacidades que los programadores requieren

Centro de Bioingeniera

1 de 19

Programacin I, Conferencia 2
Ventajas.

Ahorro en espacio ocupado por el cdigo


Permiten la modularidad
Permiten la reutilizacin del software.

Cada funcin debe limitarse a ejecutar una tarea sencilla y bien definida
Ejemplos de funciones conocidas

main(), getch(), tolower().


Veamos un ejemplo que utiliza una funcin cuadrado, para calcular el cuadrado
de los enteros del 1 al 10.
/* Cuadrado*/
/* demuestra una funcin simple*/
#include<iostream.h>
int cuadrado(int); /* declaracin de la funcin (prototipo)*/
void main()
{
int x;
for(x=1; x<=10; x++)
cout << cuadrado(x) << endl; /* Llamado a la funcin cuadrado */
} /* main*/
/* definicin de la funcin*/
int cuadrado(int y) /* declaracin */
{
Cuerpo de la funcin
return y * y;
}

Cuando el usuario define sus propias funciones hay 3 aspectos fundamentales


que se deben cumplir:
Definicin de la funcin
Prototipo de la funcin
Llamado o invocacin de la funcin
Sintaxis para definir una funcin

Tipo de dato nombre de la funcin (lista de parmetros)


que devuelve
la funcin
{
cuerpo de la funcin
}

Centro de Bioingeniera

2 de 19

Programacin I, Conferencia 2

El tipo de dato que devuelve la funcin puede ser cualquiera de los tipos de
datos estndar de C. Este es el tipo al que pertenece el valor regresado por la
funcin. El tipo de dato void es una constante que se utiliza cuando la funcin no
devuelve valor alguno. Cuando no se especifica el tipo de dato el compilador
supondr que el resultado devuelto es de tipo int
El nombre de la funcin es cualquier identificador vlido. Este debe expresar de
forma clara la tarea que realiza la funcin. Cuando no podemos elegir un nombre
conciso que exprese lo que hace la funcin, es probable que la misma este
tratando de ejecutar diversas tareas a la vez. En tal caso se recomienda dividir la
funcin en varias ms pequeas.
La lista de parmetros puede existir o no en la funcin (los parntesis si deben
estar siempre presentes). De existir, consiste en una lista separada por comas que
contiene las declaraciones de los parmetros recibidos por la funcin al ser
llamada.
Cada parmetro debe tener de forma explcita el tipo a que pertenece. Si un tipo
no es especificado el compilador lo tomar como int.
Los parntesis vacos o con void escrito dentro de ellos indican que la funcin no
tiene parmetros.
Las declaraciones, unidas a las sentencias, que se encuentran dentro de las llaves
de apertura y cierre en la funcin, conforman el cuerpo de la funcin.
En el cuerpo de la funcin pueden ser definidas variables de la funcin. Lo que NO
SE PERMITE es definir una funcin dentro de otra.
La funcin retornar el control al punto desde el cual fue invocada si:
1. Encuentra la llave de cierre del cuerpo de la funcin
2. Al encontrar y ejecutar la sentencia return.
Expuesto de esta manera la funcin retornar el control al lugar de donde fue
llamada pero ella no devolver valor alguno. Si queremos que la funcin devuelva
algn valor entonces la sentencia return debe ir acompaada de una expresin. El
valor que resulte de evaluar la misma ser devuelto al lugar de la llamada.(es un
nico valor)
Prototipo de la funcin

Esta es una de las caractersticas ms importantes del ANSI C. El prototipo de la


funcin le indica al compilador el tipo de dato que devuelve la funcin, el nmero
de parmetros que la funcin espera recibir, los tipos de dichos parmetros y el
orden en el cual se esperan los mismos. El compilador utiliza el prototipo de las
funciones para verificar las llamadas de funcin
Versiones anteriores de C no utilizaban este tipo de verificacin, por lo que era
posible llamar de forma incorrecta a las funciones, sin que el compilador se diera
cuenta de los errores. Estas llamadas podan resultar errores fatales en tiempo de
ejecucin o en errores no fatales que causaban sutiles errores lgicos, difciles de
Centro de Bioingeniera

3 de 19

Programacin I, Conferencia 2
detectar. Los prototipos de funciones que proporciona el ANSI C, corrigen esa
deficiencia.
Se debe incluir un prototipo por cada funcin que se haya definido en
programa. El prototipo debe coincidir exactamente con la declaracin de
definicin de la funcin con la excepcin, en el caso de los parmetros, que
hace falta declarar las variables (el compilador las ignora) con el tipo de c/u
ellas es suficiente.

su
la
no
de

Cuando el prototipo de una funcin no coincide con su declaracin, se genera un


error.
En C++ los prototipos de las funciones son requeridos para todas las funciones a
menos que esta sea definida antes de su llamado. En este caso la declaracin
(encabezado) de la funcin acta como prototipo de la funcin.
Los programas en C++ no se compilaran a menos que exista un prototipo para cada
funcin o que estas hayan sido definidas antes de su utilizacin.
Llamar o invocar una funcin

Una funcin puede ser invocada desde cualquier lugar donde se admita una
expresin o como una sentencia independiente en el programa. Esto se hace de la
siguiente forma:
Nombre de la funcin (lista de argumentos)

Cuando se invoca una funcin no se incluye el valor que ella devuelve, solo su
nombre. Debe estar escrito exactamente igual como se escribi en la definicin de
la funcin (recuerde que el C es sensible a las maysculas y minsculas).
La lista de argumento se corresponde con los valores actuales con los cuales se
quiere sea ejecutada la funcin.
Por cada parmetro formal de la declaracin de la funcin debe existir un
argumento en la sentencia de llamado. Estos deben coincidir en cantidad, tipo y
orden. Los argumentos pueden ser una constante, una variable, una expresin e
inclusive el llamado a otra funcin. En caso de que sean una variable solo se
escribira esta sin anteponer el tipo.
Cmo se realiza la conexin entre la llamada y la funcin para que esta se
ejecute con los valores que se desean?.
Pasndole argumentos a las funciones

Retomando el ejemplo anterior, en la sentencia:

cout << cuadrado(x) << endl;

Centro de Bioingeniera

int cuadrado(int y)
{ return y * y; }

4 de 19

Programacin I, Conferencia 2
Se invoca la funcin cuadrado y se pasa el valor de la variable x como argumento.
Este valor lo recibe la variable y en la funcin y trabaja con el para despus poder
retornar el resultado
La transferencia de parmetros a las funciones se puede realizar de dos formas:
Por valor
Por referencia
Cuando los argumentos se pasan en llamada por valor se efecta una copia (en
memoria) del valor del argumento y estos son transferidos a la funcin. De esta
manera se garantiza que cualquier variacin que exista a estos valores en la
funcin no alterara los valores originales pues se esta operando sobre la copia.
Por eso se dice que en la llamada por valor la transferencia de argumentos a
parmetros de la funcin es de forma unidireccional
Aunque hacerlo no es incorrecto, no se recomienda utilizar los mismos nombres
para argumentos pasados a la funcin y parmetros correspondientes de la
definicin de funcin. Esto crea ambigedad en el programa.
En la llamada por referencia el tratamiento es diferente. Este tema lo veremos con
ms detalle posteriormente.
Veamos el ejemplo de la Conferencia anterior de calcular la resistencia
equivalente en un circuito con 3 resistencias en serie :
inicio

// Clculo de resistencia equivalente


#include<iostream.h>

Leer
R1, R2, R3

RequivR1+R2+R3

// prototipo de la funcin
float Requiv(float, float, float);
void main( )
{
float R1, R2, R3;
cout << Teclee 3 valores de resitencia R1, R2, R3;
cin >> R1 >> R2 >> R3 ;
cout << La ressitencia equivalente es <<
Requiv(R1, R2, R3) << endl ;

Visualizar
sum

}
// Declaracin de la funcin
Parar

float Requiv(float val1, float val2, float val3)


{ return val1 + val2 + val3;}

Los valores de resistencia R1, R2 y R3 son ledos en la funcin main(). Despus


sus valores son transferidos a los parmetros val1, val2, y val3 respectivamente
de la funcin Requiv. La funcin se ejecuta y retorna el resultado al lugar de
donde fue invocada.
Centro de Bioingeniera

5 de 19

Programacin I, Conferencia 2
Al terminar de ejecutar la funcin, el compilador regresa al lugar donde fue
invocada la funcin y el resultado se visualiza en pantalla a travs de la sentencia
cout.
Funciones en lnea
Las llamadas a funcin indican sobrecarga en tiempo de ejecucin. Cada vez que
se realiza la llamada a una funcin, el compilador busca el cuerpo de la funcin y
ejecuta esta con los valores que se le indican. C++ implementa las llamadas
funciones en lnea que ayudan a disminuir la sobrecarga por llamadas a funcin. El
calificador inline colocado en el encabezado de la funcin antes del tipo (que
regresa la funcin) aconsejaal compilador que genere una copia n situ , para
evitar una llamada a la funcin. El efecto que esto produce es que se inserta una
copia del cuerpo de la funcin en el lugar del llamado
El calificador inline solo debe ser utilizado para funciones pequeas de uso frecuente
Cualquier modificacin a una funcin inline requiere que sean recompilados todos
los clientes de dicha funcin. Una funcin inline puede reducir tiempo de
ejecucin, pero puede aumentar tambin el tamao del programa
Retomando el ejemplo que vimos al inicio de la Conferencia de calcular el
cuadrado de un valor entero, vamos a plantearlo ahora pero aplicando el concepto
de funcin en lnea:
/* Cuadrado*/
#include<iostream.h>
inline int cuadrado(int y) { return y * y; } /* declaracin de la funcin (prototipo)*/
void main()
{
int x;
for(x=1; x<=10; x++)
cout << cuadrado(x) << endl; /* Llamado a la funcin cuadrado */
} /* main*/

Homonimia de funciones
En otros lenguajes, incluyendo el C declarar dos funciones con el mismo nombre
es un error. C++ permite que varias funciones sean declaradas con el mismo
nombre, siempre que el conjunto de parmetros que acompaan a esta funcin
sean diferentes(al menos en los tipos). Esta capacidad se llama homonimia de
funciones. Cuando una funcin homnima es llamada, el compilador C++
selecciona automticamente la funcin correcta comprobando el nmero, tipo,
orden y argumentos de la llamada con las funciones del mismo nombre.
La homonimia en funciones se utiliza para crear funciones del mismo nombre que
ejecutan tareas similares sobre tipos de datos diferentes. Esto puede hacer los programas
ms legibles y comprensibles.
Centro de Bioingeniera

6 de 19

Programacin I, Conferencia 2
Utilizando el mismo ejemplo del clculo del cuadrado de un valor, podemos
transformarlo para que el programa pueda calcularlo tanto para un entero como
para un valor real. Eso se resuelve con funciones homnimas:
/* Cuadrado*/
#include<iostream.h>
inline int cuadrado(int y) { return y * y; } /* declaracin de la funcin (prototipo)*/
inline float cuadrado(float y) { return y * y; } /* declaracin de la funcin (prototipo)*/
void main()
{
int x; float z;
cout << Entre un valor entero: ; cin >> x;
// Llamado a la funcin cuadrado para un entero
cout << Su cuadrado es: << cuadrado(x) << endl;
cout << Entre un valor real: ; cin >> z;
// Llamado a la funcin cuadrado para un real
cout << Su cuadrado es: << cuadrado(z) << endl;
} /* main*/

En el llamado de una funcin los argumentos utilizados pueden tener el mismo


nombre que los parmetros utilizados en la definicin de la misma. Quiere esto
decir que me estoy refiriendo a los mismos identificadores (variables).?
Variables y Clases de Almacenamiento
Hasta ahora los identificadores que habamos utilizado como nombre de variables
tenan como atributo: nombre, tipo y valor. Ahora con el uso de funciones hemos
ampliado esos atributos a clase de almacenamiento, duracin y alcance.
La clase de almacenamiento de una variable determina cul de las partes del
programa puede accesarla y cunto tiempo dura su existencia. Existen cuatro
clases de almacenamiento: automticas, externas, estticas y registro.
La duracin de almacenamiento es el perodo durante el cual dicho identificador
existe en memoria. Algunos identificadores tienen una existencia breve, otros son
creados y destruidos en forma repetida y otros existen durante toda la ejecucin
de un programa.
El alcance determina en que lugar del programa se puede hacer referencia a un
identificador. Algunos pueden ser referenciados a todo lo largo del programa y
otros solo en determinadas partes de l. El alcance de un identificador es el
dominio en que est declarado. Cualquier identificador se puede utilizar en
cualquier parte del bloque en que est declarado.
Variables automticas (Automatic)

Hasta ahora todas las variables que hemos usado han sido definidas dentro de la
funcin en que se usan. O sea, la definicin ocurre dentro de las llaves que
delimitan el cuerpo de la funcin: Las variables pueden definirse dentro de main()

Centro de Bioingeniera

7 de 19

Programacin I, Conferencia 2
o de otras funciones; el efecto es el mismo, dado que main() es una funcin. A
estas variables se les llama automticas. Realmente la palabra reservada auto,
puede usarse para definir una variable automtica:
void func()
{
auto int n; /* es lo mismo que int n*/
auto float f; /* es lo mismo que float f*/
/* otras sentencias*/
}

pero raramente se usa porque est implcita cuando las variables se definen
dentro de una funcin. Veamos ahora dos importantes caractersticas de las
variables automticas: tiempo de vida y visibilidad.
Tiempo de vida (Lifetime)

Una variable automtica no se crea hasta que la funcin en la cual se define sea
llamada. (Ms exactamente, podemos decir que las variables definidas dentro de
cualquier bloque de cdigo no son creadas hasta que dicho cdigo se ejecute).
En el ejemplo anterior, las variables n y f no existen hasta que no se llame a la
funcin func(). Esto es, no existe ningn lugar en memoria que almacene sus
valores, estn indefinidas.
Cuando se transfiere el control a func(), las variables se crean y se reserva un
espacio en memoria para ellas. Mas adelante, cuando se salga de func() y el
control retorne al programa que la llam, las variables se destruyen y sus valores
se pierden.
El periodo de tiempo entre la creacin y la destruccin de una variable es llamado
su tiempo de vida ( o duracin). El tiempo de vida de una variable automtica
coincide con el tiempo de ejecucin de la funcin o bloque en la cual est definida.
La razn de limitar el tiempo de vida de las variables es ahorrar memoria. Si una
funcin no se est ejecutando, las variables que esta usa no se necesitan.
Eliminarlas libera memoria que puede ser utilizada por otras funciones.
Visibilidad o Alcance

La visibilidad de una variable describe donde esta puede ser accesada dentro del
programa. Tambin se denomina alcance. El alcance de una variable, como ya se
haba visto, es la parte del programa donde la variable es visible. Las variables
automticas solo son visibles, o sea solo pueden ser accesadas, dentro de la
funcin donde se definieron.
Suponga que tenemos dos funciones en un programa:
void func1()
{
int var1; /* variables automticas*/
float var2;
var1 = 10; /* OK*/

Centro de Bioingeniera

8 de 19

Programacin I, Conferencia 2
var2 = 11; /* OK*/
var3 = 12; /* ilegal: no es visible en func1()*/
}
void func2()
{
int var3; /* variable automtica*/
var1 = 20; /* ilegal*/
var2 = 21; /* ilegal*/
var3 = 22; /* ok*/
}

La variable var3 es invisible en la funcin func1(), y las variables var1 y var2 son
invisibles en func2(). Limitar la visibilidad de las variables ayuda a organizar y
modularizar el programa. Evita que las variables de una funcin sean
accidentalmente alteradas por otras funciones, dado que estas no pueden verlas.
Esto es muy importante en la Programacin Estructurada y tambin en la
Programacin Orientada a Objetos. En el caso de las variables automticas, el
tiempo de vida y el alcance coinciden, ambos se reducen a la funcin o bloque
donde se define la variable. En otras clases de almacenamiento, sin embargo, el
tiempo de vida y la visibilidad no son lo mismo.
Inicializacin

Cuando se crea una variable automtica, el compilador no trata de inicializarla.


Por tanto al inicio tendr un valor arbitrario, que puede ser 0 o cualquier otro. Si
se desea inicializarla, debe hacerlo explcitamente:
int n = 33;

para que tome un valor dado. Las variables automticas tambin se conocen
como locales.
Variables externas (External)

Mientras que las variables automticas se definen dentro de las funciones,


las externas se definen fuera de todas las funciones. A estas variables tambin
se les llama globales, dado que son conocidas por todas las funciones del
programa(que aparecen despus de la definicin de las mismas) En el siguiente
programa, EXTERN.CPP, las tres funciones tienen acceso a una variable externa.
/* extern.cpp*/
int exint = 99; /* variable externa*/
void tomaint(); /* declaraciones de las funciones*/
void poneint();
void main()
{
while ( exint != 0 ) /* main accesa a exint*/

Centro de Bioingeniera

9 de 19

Programacin I, Conferencia 2
{
/* entrar 0 termina el programa*/
tomaint();
poneint();
} /* while*/
} /* main()*/
void tomaint() /* tomaint() accesa a exint*/
{
cin << exint;
}
void poneint() /* poneint() accesa a exint*/
{
cout >> exint;
}

La funcin tomaint() lee nmeros de teclado, y poneint() los imprime en


pantalla. El efecto es que cada nmero se escribe dos veces en el display. Lo
significativo es que la variable exint no esta definida en ninguna de las
funciones; sino al inicio del fichero, antes de la primera funcin. Todas las
funciones que estn a continuacin de la definicin de exint pueden accesarla
( en este caso main(), poneint() y tomaint() ). Por tanto, la visibilidad de exint es
el fichero completo.
Tiempo de Vida y Visibilidad

Las variables externas existen mientras dure el programa. O sea, se les asigna un
espacio de memoria al crearlas y su existencia contina hasta que termine la
ejecucin del programa. Ellas son visibles dentro del fichero donde se definen, a
partir del punto en que se definen. Si en el programa EXTERN.CPP, exint se
hubiera definido entre main() y tomaint(), esta solo seria visible en tomaint() y
poneint().
Inicializacin

Si una variable externa es inicializada por el programa, as


int exint = 99; /* variable externa*/

esta inicializacin solo tiene lugar cuando se carga el fichero por primera vez,
pero no despus. Si una variable externa no se inicializa explcitamente por el
programa, por ejemplo:
int exvar;

entonces esta se inicializa automticamente con 0 cuando se crea. (A diferencia


de las variables automticas, que no son inicializadas automticamente y
contienen un valor aleatorio basura o garbage cuando son creadas).
La utilizacin de variables globales puede producir efectos colaterales no deseados
cuando, por ejemplo, una funcin que no requiere de acceso a la variable la modifica
accidental o intencionalmente. En general el uso de las variables globales debera ser
evitado excepto en ciertas situaciones donde los requerimientos para el rendimiento lo
exijan.de Bioingeniera
Centro
10 de 19

Programacin I, Conferencia 2

Variables estticas(Static)

El especificador de almacenamiento static se utiliza con variables locales cuando


se quiere conservar el ltimo valor que toman estas entre las sucesivas llamadas a
la funcin Es decir, cuando una variable local es declarada como esttica, al
terminar la funcin el ltimo valor que ella alcanzo dentro de la funcin se
mantiene. Si despus se vuelve a ejecutar la funcin las variables locales
declaradas como estticas conservarn aun el valor que tomaron en la ltima
ejecucin de la funcin
Tiempo de Vida y Visibilidad

Una variable static acta parecido a una variable local pero tiene el tiempo de vida
de una variable external.
Inicializacin

Todas las variables numricas static se inicializan a cero si no son inicializadas de


forma explicita por el programador
Variables registros(register)

Los datos de un programa en lenguaje de mquina para realizar clculos y otros


procesos normalmente se cargan en registros.
El especificador de almacenamiento register puede ser colocado ante el nombre
de una variable automtica para sugerirle al compilador que conserve la variable
en uno de los registros de alta velocidad del hardware. Esto se hace par casos
muy especficos y con conocimiento de causa de lo que se esta haciendo.
Generalmente las declaraciones register son innecesarias. Los compiladores
optimizadores de hoy son capaces de reconocer variables de uso frecuente y
determinar cuando es prudente utilizar este tipo de almacenamiento
Las variables locales tienen mayor jerarqua en el bloque donde fueron definidas que
una variable global de igual nombre
Ejercicio demostrativo de clases de almacenamiento y alcance de las
variables.
#include<iostream.h>
void a(); /* prototipo */
void b(); /* prototipo */
void c(); /* prototipo */
int x = 1; /* variable global */
void main()

Centro de Bioingeniera

11 de 19

Programacin I, Conferencia 2
{
int x = 5; /* variable local a main */
cout << " x local a main " << x << endl;
{
int x = 7;
cout << " x local al nuevo bloque dentro de main " << x << endl;
}
cout << " x fuera del bloque definido en main " << x << endl;
a(); /* define x como automtica local */
b(); /* define x como esttica local */
c(); /* utiliza la declaracin de x global */
a(); /* reinicializa la variable local x */
b(); /* la variable x esttica local retiene su valor previo */
c(); /* la x global tambin retiene su valor */
cout << " x local a main " << x << endl;
}
void a()
{
int x = 25; /* Se inicializa cada vez que se llama a la funcin */
cout << " x local se inicializa en el valor " << x << endl;
++x;
cout << " x local abandona la funcin con el valor " << x << endl;
}
void b()
{
static int x = 50; /* se inicializa la 1ra vez que se llama la funcin */
cout << " x local esttica comienza con el valor " << x << endl;
++x;
cout << " x local esttica abandona la funcin con el valor " << x << endl;
}
void c()
{
cout << " x global entra con el valor " << x << endl;
x+=10;
cout << " x global abandona la funcin con el valor << x << endl;

}
La respuesta que se obtiene en pantalla es:
x local a main 5
x local al nuevo bloque dentro de main 7
x fuera del bloque definido en main 5
x local se inicializa en el valor 25
x local abandona la funcin con el valor 26
x local esttica comienza con el valor 50
Centro de Bioingeniera

12 de 19

Programacin I, Conferencia 2
x local esttica abandona la funcin con el valor 51
x global entra con el valor 1
x global abandona la funcin con el valor 11
x local se inicializa en el valor 25
x local abandona la funcin con el valor 26
x local esttica comienza con el valor 51
x local esttica abandona la funcin con el valor 52
x global entra con el valor 11
x global abandona la funcin con el valor 21
x local a main 5
Si se quisiera acceder a una variable global en un bloque donde hay definida una
variable local del mismo nombre se puede lograr a travs del operador de
resolucin de alcance unario (::). En el ejemplo anterior, si se quisiera que la
variable que se referencia en la funcin a( ) fuese la variable global ( x=1), se
pondra el operador antecediendo a la variable x que aparece en dicha funcin
Directivas de Procesamiento
Las directivas al procesador forman lo que puede considerarse casi un lenguaje
dentro del lenguaje C. Esta es una posibilidad que no existe en muchos otros
lenguajes de alto nivel.
Para comprender las directivas al procesador, veamos que hace un compilador
cuando escribimos una lnea de cdigo:
num = 44;
se le pide al compilador que traduzca este cdigo a instrucciones a lenguaje de
mquina, las cuales pueden ejecutarse por el procesador de la computadora. Por
tanto la mayor parte del listado est compuesto por instrucciones al procesador.
Por otro lado, las directivas al procesador son instrucciones al compilador. En
lugar de traducirse a lenguaje de mquina, ellas son directamente operadas por el
procesador antes de que comience el proceso de compilado, de ah el nombre de
preprocesador.
Las sentencias normales de programa son instrucciones al procesador, las directivas al
procesador son instrucciones al compilador.
Examinaremos dos directivas al procesador ms comunes: #define y #include
Las directivas siempre comienzan con un signo #. Pueden colocarse en cualquier
parte del programa, pero se usan ms frecuentemente al inicio de un fichero,
antes de main(), o antes del inicio de funciones particulares.
La directiva #define
En la conferencia anterior se vio cmo se poda definir una variable constante a
travs del calificador const, existe otra forma y es a traves de la directiva define

Centro de Bioingeniera

13 de 19

Programacin I, Conferencia 2
El uso ms simple para la directiva define, es asignar nombres (como PI) a
constantes (como 3.14159). Por ejemplo: En un programa donde se calcule el
promedio de un alumno con respecto a las asignaturas que tiene en un curso
podramos definir la variable cantidad de asignaturas con un valor constante.
Claro esto podra variar si se le cambia el valor a la variable en cualquier lugar del
programa.
Sin embargo si lo hacemos utilizando las directivas del procesador con la directiva
#define:
Un espacio separa el
identificador del texto

#define ASIGNATURAS 6
directiva
al
preprocesador

frase a
buscar

frase que
reemplaza
la anterior

Al ejecutarse el programa, el procesador primero busca todas las lneas del


programa que comienzan con el signo #. Cuando encuentra la directiva #define,
recorre todo el programa y en cada lugar que encuentra ASIGNATURAS la
reemplaza por la frase 6.
Esto es un proceso mecnico: simplemente sustituir un grupo de caracteres
"asignatura "por otro "6".
Por convencin el identificador se escribe en maysculas. Esto facilita su
bsqueda en el programa, para ver cules partes sern alteradas por directivas
#define.
Por qu usar #define?
Tal vez Ud. se pregunte que hemos ganado al sustituir ASIGNATURAS por 6 en
nuestro programa.
Hemos hecho el programa ms fcil de leer.
Supongamos que la constante 6 aparezca muchas veces en el programa, qu
suceder si en lugar de 6 quisiramos hallar el promedio por 5 asignaturas?. De
no usar el #define, habra que cambiar manualmente, cada ocurrencia de 6 por el
nmero 5. De lo contrario, solo necesitaramos cambiar este valor en la sentencia
#define. Este cambio se operar automticamente en todas las ocurrencias de
ASIGNATURAS justo antes de comenzar la compilacin.
Por qu no usar variables?
Hay al menos tres razones para no usar variables en este caso:

Centro de Bioingeniera

14 de 19

Programacin I, Conferencia 2
1. Es ineficiente, dado que el compilador puede generar un cdigo ms rpido y
compacto para las constantes que para las variables.
2. Usar una variable para lo que realmente es constante hace el programa ms
difcil de comprender.
3. Siempre existe el peligro de que una variable sea inadvertidamente alterada
durante la ejecucin del programa, o sea que no es tan constante como Ud.
pensaba.
En otras palabras, el uso de #define puede producir programas ms eficientes y
fciles de entender. Es extensivamente usada por los programadores de C.
Como se haba dicho anteriormente el C++ incluye el uso de const para declarar
constantes. Una prctica comn de programacin en C++ es incluir las variables
const en archivos de cabeceras (.h, que puede ser utilizado por varios archivos
fuentes.
La ventaja de utilizar variables const a constantes simblicas #define es que las
variables const son visibles con un depurador , no as las otras
La directiva #define es realmente mucho mas potente que lo que hemos visto
hasta ahora. Esta potencia adicional viene de la posibilidad de #define de usar
argumentos.
#include<iostream.h>
#define ERROR cout <<"\nError\n";
void main()
{
int entrada=680;
if (entrada>640) ERROR; }

En este ejemplo se demuestra que #define puede usarse, no solo para las
constantes, sino para sustituir cualquier frase. Supongamos que su programa
necesita imprimir el mensaje "Error" en varias partes del programa. Ud. usa la
directiva:
#define ERROR printf ( "\n Error. \n" )

y en el programa podramos tener la siguiente sentencia:


if ( entrada > 640 ) ERROR

que antes de compilar se expandira a:


if ( entrada > 640 ) cout << "\n Error \n";

La moraleja es que un identificador definido por #define puede ser usado como
una sentencia C.

Ver ejemplo de #define con argumento en el libro de texto


La directiva #include

Centro de Bioingeniera

15 de 19

Programacin I, Conferencia 2
La directiva #include provoca que un fichero fuente sea incluido dentro de otro.
He aqu un ejemplo de por qu Ud. querra hacer algo as.
Suponga que Ud. escribe varios programas que utilizan las siguientes definiciones:
#define PI 3.14159
#define AREA_CIRCULO (radio) (PI*radio*radio)
#define AREA_RECTANGULO (ancho, alto) (ancho*alto)

No es muy agradable tener que copiar una y otra vez para cada uno de los
programas, esa serie de definiciones. En su lugar, Ud. solo necesita escribir esas
lneas y salvarlas en un fichero que nombraremos "areas.h"
La extensin .h es comnmente usada para ficheros que agrupan sentencias que
deben estar al inicio del programa.
De esa manera, en c/u de los programas donde necesitemos usar las definiciones
anteriores, solo ser necesario poner
#include "areas.h"
Al inicio del programa todas las sentencias que contiene areas.h sern aadidas a
su programa como si hubieran sido escritos directamente en l.
Existen dos formas de #include
#include < > Se usa para los ficheros .h que vienen con el compilador.
#include " " Se usa para los .h que hace el programador.
Ejemplo del uso de el fichero "areas.h"
/*Ejemplop donde se utiliza "reas.h"*/
#include<iostream.h>
#include "areas.h"
void main()
{
int r, a1, a2;
cout << "Para calcular el rea del circulo, teclee su radio ";
cin >>r;
cout << "\nEl rea del circulo es ", << (float)AREA_CIRCULO(r));
cout << "Para calcular el rea del rectngulo, teclee su alto y ancho ";
cin >>a1 >> a2;
cout << "\nEl rea del rectngulo es %f\n"<< (float)AREA_RECTANGULO(a1,
a2));
Centro de Bioingeniera

16 de 19

Programacin I, Conferencia 2
}
TAREA
1- ? Es -1 true o false ?
2- - La funcin cin que lee la entrada del teclado, debe ser capaz de convertir una
serie de dgitos en un nmero. Escriba un programa que haga lo mismo. Debe
permitrsele al usuario teclear hasta 6 dgitos, y despus imprimir el nmero
resultante de tipo long. Los dgitos deben ser ledos individualmente, como
caracteres, con getche(). La construccin del nmero requiere multiplicar el
valor por 10 y aadir el nuevo dgito.
Sugerencia: Reste 48 o '0' para ir del ASCII al dgito numrico.
He aqu una interaccin:
Entre un nmero: 123456
El nmero es: 123456
3.- El argumento de una funcin es:
a) una variable de la funcin que recibe un valor del programa que la llam
b) una forma en que las funciones se resisten a aceptar los valores del programa
que las llam
c) un valor enviado a la funcin por el programa que la llam
d) un valor devuelto por la funcin al programa que la llam
4.- Elevar un nmero n a una potencia p es lo mismo que multiplicar n por s
mismo p veces. Escriba una funcin llamada potencia() que tome un valor
double para n y un int para p, y retorne el resultado en un valor de tipo double.
Escriba una funcin main() que le pida al usuario los valores de n y p.
5.- Verdadero o Falso: Ud. puede retornar tantos valores como desee de una
funcin, usando la sentencia return();
6.- Es esta una definicin correcta de la funcin abs()?
abs(num)
int num;
esto debe ir despus de la llave
{
if (num < 0)
num=-num;
return(num);
}
7.-. Una variable externa se define:
a) Solo en main()
b) En la 1ra funcin que la usa
c) En cualquier funcin que la usa
e) fuera de cualquier funcin (*)
8.-Qu es una directiva al procesador?
a) Un mensaje del compilador al programador.
b) Un mensaje del enlazador al compilador
Centro de Bioingeniera

17 de 19

Programacin I, Conferencia 2
c) Un mensaje del programador al compilador.(*)
d) Un mensaje del programador al p.
9.- Un fichero encabezamiento es:
a) Un fichero que debe preceder a todos los ficheros fuentes
b) Un fichero fuente(*)
c) Un fichero que puede ser incluido con #include en otros ficheros fuentes (*)
d) Un fichero fuente que contiene varias definiciones y macros (*)
1. Diga qu imprimir el siguiente fragmento si a = 10, b = c = 20
if (a == b)
if (b == c)
cout << "a, b y c son iguales";
else
cout << "a y b son diferentes";

RESPUESTAS

1- -1 es true, 0 es false
2./* ejer3_3.cpp*/
// crea un nmero a partir de dgitos ASCII
#include<stdio.h>
#include<conio.h>
void main()
{
char ch = 'a'; /* asegurar que no sea '\r'*/
unsigned long total = 0; /* contendr el nmero*/
printf( "\nEntre un nmero: " );
while ( (ch =_ getche()) != '\r' ) /* irse cuando se oprima RETORNO*/
total = total*10 + (ch-'0');
printf( "\nEl nmero es: " , total);
} /* main()*/

3.- c)
4.-/* ejer4_4.cpp
double potencia( float n, int p);
void main()
{
double nmero, respuesta;
int pot;
cout <<"\nEntre el nmero: ";
cin >> numero;
cout << "Entre la potencia: ";
cin >> pot;
respuesta = potencia(nmero,pot);
cout << "La respuesta es: " << respuesta;

Centro de Bioingeniera

18 de 19

Programacin I, Conferencia 2
} /* main()*/
double potencia(double n, int p)
{
double result = 1.0;
for (int j=0; j<p; j++ ) // multiplicar por n p veces
result *= n;
return result;
} /* potencia()*/

2. ?Qu es una directiva al procesador?


a) Un mensaje del compilador al programador.
b) Un mensaje del enlazador al compilador
c) Un mensaje del programador al compilador.(*)
d) Un mensaje del programador al p.
3.- Un fichero encabezamiento es:
a) Un fichero que debe preceder a todos los ficheros fuentes
b) Un fichero fuente(*)
c) Un fichero que puede ser incluido con #include en otros ficheros fuentes (*)
d) Un fichero fuente que contiene varias definiciones y macros (*)
3. Diga qu imprimir el siguiente fragmento si a = 10, b = c = 20
if (a == b)
if (b == c)
cout << "a, b y c son iguales";
else
cout << "a y b son diferentes";

Centro de Bioingeniera

19 de 19

Das könnte Ihnen auch gefallen