3. Enciclopedia del Lenguaje
cFeo. Javier Ceballos Sierra
Profesor titular de la
Escuela Universitaria Politecnica
Universidad de Alcala de Henares (Madrid)
TAT ADDISON-WESLEY IBEROAMERICANA
29. Estructura de un programa gnifico. . . . . . . . . . . . . . . . . . . . . . . .. 727
Modos de video disponibles en tu ordenador. . . . . . . . . . . . . . .. 731
Color de fondo y color del texto. . . . . . . . . . . . . . . . . . . . . . . . . .. 735
Color de fondo y de primer plano. . . . . . . . . . . . . . . . . . . . . . . .. 737
Sistema de coordenadas 16gicas.. . . . . . . . . . . . . . . . . . . . . . . . . .. 740
Alternar entre paginas de video. . . . . . . . . . . . . . . . . . . . . . . . . . .. 745
Portada para Microsoft C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 756
Colorear figuras......................................... 759
Ventanas de texto..................... . . . . . . . . . . . . . . . . . .. 763
Funciones para animaci6n de figuras. . ...•.. 767
Animaci6n - pe10ta rodando. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 769
Choque de una pelota contra una barrera. . . . . . . . . . . . . . . . . .. 770
Bola de billar........................................... (72
Representaci6n de la funci6n radio = cos(2 * alfa). . . . . . . . . .. 776
Representaci6n de la funci6n Y=2*cos(X)A2-sin(5+X). . . . . . .. 777
Representaci6n grafica utilizando tres ventanas. . . . . . . . . . . . .. 780
Presentaciones graficas - diagramas de barras y sectores. . . . .. 789
Presentaciones graficas multiples.............. 791
Presentaciones graficas por puntos......................... 794
Demostraci6n de tipos de letras. . . . . . . . . . . . . . . . . . . . . . . . . . .. 800
30. Este es un libro que pretende cubrir dos objetivos: ser un manual para
aprender C y ser una guia para el usuario de C.
La forma en la que se ha estructurado ellibro ha sido precisamente,
pensando en ese primer objetivo. El libro se ha dividido en veinticuatro
capitulos que van presentando ellenguaje poco a poco, empezando por
10 mas sencillo, presentando cada tema a su tiempo, hasta llegar al final
donde se habra visto todo 10 referente a la programacion en C y utilidades,
sin apenas encontrar dificultades.
El segundo objetivo queda conseguido al incluir en este libro todo 10
que un usuario quiere saber respecto a C, esto es, explicacion y desarrollo
de todas las sentencias, estructuras, punteros, funciones, ficheros y direc-
trices para compilador. Se completa el estudio de C con un capitulo refe-
rente a estructuras dinamicas y otro de algoritmos de uso comun. Final-
mente se estudian tecnicas avanzadas que abordan la materia referente a
manejo de la memoria, compilacion yenlace, librerias, rutinas en lenguaje
ensamblador, utilidades como el depurador de C, servicios del DOS y del
BIOS, grcificos y una explicacion para el manejo del entorno de programa-
cion del paquete de Microsoft C.
Microsoft eversion 6, producto desarrollado por Microsoft, es un com-
pilador C desarrollado para los ordenadores personales IBM y compati-
31. 1. Introducci6n al lenguaje C
2. Elementos del lenguaje C
3. Comenzando con ellenguaje C
4. Sentencias de control
5. Tipos estructurados de datos
6. Punteros
7. Funciones
8. Funciones estandar de E/S
9. Funciones de E/S de bajo nivel
10. Funciones para la consola y puertos de entrada salida
11. El preprocesador de C
12. Estructuras dinamicas de datos
13. Algoritmos recursivos, de ordenaci6n y de busqueda
14. Manejo de la memoria
15. Compilar y enlazar
16. Librerias y utilidades del compilador
17. Rutinas en lenguaje ensamblador
18. Comunicaciones. Servicios del DOS y del BIOS
19. C y DOS
20. Control de procesos
21. Grcificos con C
22. Representaciones grcificas
23. Utilizaci6n del PWB
24. Instalaci6n de Microsoft C
A. Ficheros .h de C
B. C6digos de caracteres (ASCII)
C. Indice alfabetico
bles IBM. Este compilador ademas de correr bajo MSDOS y OS/2, inclu-
ye tambien soporte para Microsoft Windows.
Este libro posee varias caracteristicas dignas de resaltar. Es breve en
teoria y abundante en ejemplos, 10 que Ie hara aun mas facil: el aprendiza-
je para aquellas personas que quieren iniciarse en el tema, 0 la busqueda
y compresi6n de un tema puntual para aquellas otras personas entendidas
en programaci6n C. La metodologia utilizada en el desarrollo de los pro-
gramas es la descomposici6n arriba-abajo (top down). Es un libro facil de
entender.
La materia total que compone la Enciclopedia dellenguaje C, se ha
dividido en los siguientes capitulos y apendices:
32. Todo esto se ha documentado con alrededor de 175PROBLEMAS RE-
SUELTOS, utilizando la programaci6n estructurada, muchos de ellos vali-
dos como parte integrante en el desarrollo de aplicaciones.
He recibido ayuda de algunas personas durante la preparaci6n de este
libro, y por ello estoy francamente agradecido. En especial quiero expresar
mi agradecimiento a la firma Microsoft, por la ayuda material que me ha
prestado.
33. PARTE
1
Programaci6n con el Lenguaje C
• Introducci6n al Lenguaje C
• Elementos del Lenguaje C
• Comenzando con el Lenguaje C
• Sentencias de Control
• Tipos Estructurados de Datos
• Punteros
• Funciones
34. EI C es un lenguaje de programaci6n de prop6sito general. Sus principales
caracteristicas son:
- Programaci6n estructurada.
- Economia en las expresiones.
- Abundancia en operadores y tipos de datos.
Codificaci6n en alto y bajo nivel simultaneamente.
Reemplaza ventajosamente la programaci6n en ensamblador.
Utilizaci6n natural de las funciones primitivas del sistema.
No esta orientado a ningun area en especial.
Producci6n de c6digo objeto altamente optimizado.
- Facilidad de aprendizaje.
Ellenguaje C naci6 en los Laboratorios Bell de AT&Ty ha sido estre-
chamente asociado con el sistema operativo UNIX, ya que su desarrollo
se realiz6 en este sistema y debido a que tanto UNIX como el propio com-
pilador C y la casi totalidad de los programas y herramientas de UNIX,
fueron escritos en C. Su eficiencia y claridad han hecho que el lenguaje
ensamblador apenas haya sido utilizado en UNIX.
35. Este lenguaje esta inspirado en ellenguaje B escrito por Ken Thomp-
son en 1970con intenci6n de recodificar el UNIX, que en la fase de arran-
que estaba escrito en ensamblador, en vistas a su transportabilidad a otras
maquinas. B era un lenguaje evolucionado e independiente de la maquina,
inspirado en ellenguaje BCPL concebido por Martin Richard en 1967.
En 1972,Dennis Ritchie, toma el relevoy modifica ellenguaje B, crean-
do ellenguaje C y reescribiendo el UNIX en dicho lenguaje. La novedad
que proporcion6 ellenguaje C sobre el B fue el disefio de tipos y estructu-
ras de datos.
Los tipos basicos de datos eran char (caracter), int (entero),jloat (reales
en simple precisi6n) y double (reales en doble precisi6n). Posteriormente
se afiadieron los tipos short (enteros de longitud ~ longitud de un int),
long (enteros de longitud ~ longitud de un int), unsigned (enteros sin sig-
no) y enumeraciones. Los tipos estructurados basicos de C son las estruc-
turas, las uniones y los arrays. Estos permiten la definici6n y declaraci6n
de tipos derivados de mayor complejidad.
Las instrucciones de control de flujo de C son las habituales de la pro-
gramaci6n estructurada: if, for, while, switch-case, todas incluidas en su
predecesor BCPL.
C incluye tambien punteros y funciones. Los argumentos de las fun-
ciones se pasan por valor, esto es copiando su valor, 10 cual hace que no
se modifiquen los valores de los argumentos en la Hamada. Cuando se de-
sea modificar los argumentos en la Hamada, estos se pasan por referencia,
es decir, se pasan las direcciones de los argumentos. Por otra parte, cual-
quier funci6n puede ser Hamada recursivamente.
Una de las peculiaridades de C es su riqueza de operadores. Puede
decirse que practicamente dispone de un operador para cada una de las
posibles operaciones en c6digo maquina.
Hay toda una serie de operaciones que pueden hacerse con ellenguaje
C, que realmente no estan incluidas en el compilador propiamente dicho,
sino que las realiza un preprocesador justa antes de cada compilaci6n. Las
dos mas importantes son # define (directriz de sustituci6n simb6lica 0 de
definici6n) e # include (directriz de inclusi6n en e1 fichero fuente).
36. Finalmente, C, que ha sido pensado para ser altamente transportable
y para programar 10improgramable, igual que otros lenguajes tiene sus in-
convenientes. Carece de instrucciones de entrada/salida, de instrucciones
para manejo de cadenas de caracteres, con 10 que este trabajo queda para
la libreria de rutinas, con la consiguiente perdida de transportabilidad. La
excesivalibertad en la escritura de los programas puede llevar a errores en
la programaci6n que, por ser correctos sintacticamente no se detectan a
simple vista. Por otra parte las precedencias de los operadores convierten
a veces las expresiones en pequenos rompecabezas. A pesar de todo, C ha
demostrado ser un lenguaje extremadamente eficaz y expresivo.
Este lenguaje ha evolucionado paralelamente a UNIX, que a su vez
ha pasado por diversas versiones entre las que destaca la de Microsoft con
su XENIX para micros de 16 bits.
En este apartado se van a exponer los pasos a seguir en la realizaci6n de
un programa, por medio de un ejemplo. La siguiente figura, representa es-
tos pasos en el orden en el que hay que ejecutarlos.
El ejemplo de la figura indica que una vez editados los ficheros fuente
a.c y b.c, son compilados obteniendose los ficheros objeto a.obj y b.obj los
cuales son enlazados con el fichero c.obj, con la libreria d.lib y con las li-
brerias del sistema .lib dando lugar a un unico fichero ejecutable a.exe.
La orden correspondiente para compilar y enlazar los ficheros expuestos
en este ejemplo, es la siguiente:
Para ejecutar el fichero a.exe resultante, escribir el nombre de dicho
fichero (a), y pulsar Enter.
37. C
0
E a.c M a.obj
D P
I I
T
L
0
A
D
R b.c 0 b.obj
R
E
N
L
c.obj A a.exe
Z
A
D
0
d.lib R
Para editar un programa, primeramente llamaremos, para su ejecucion, al
programa editor 0 procesador de textos que vayamos a utilizar. Podemos
utilizar el procesador de textos suministrado con el compilador 0 nuestro
propio procesador (ver capitulo 23). El nombre del fichero para salvar el
programa en el disco, debe tener como extension .c.
El paso siguiente, es escribir el texto correspondiente al program a fuen-
te. Cada sentencia dellenguaje C finaliza con un punto y coma y cada li-
nea del programa la finalizamos pulsando la tecla Enter.
Como ejercicio para practicar 10 hasta ahora expuesto, escribir el si-
guiente ejemplo:
38. CAPITULO I: INTRODUCCION AL LENGUAJE C 43
# include <stdio.h >
# include <stdlib.h>
main( )
(
char *mensajel
char *mensaje2
char nombre[50];
HBienvenido a C':·
HTe alegrard el haberme conocido";
system(Hcls");
printft';,Cudl es tu nombre? ");
gets(nombre);
printj("n%s %sn%sn': mensajel, nombre, mensaje2);
J
Comentamos brevemente cada linea de este programa. No apurarse si al-
gunos de los terminos no quedan muy claros ya que todo ellos se venin
con detalle en capitulos posteriores.
Las dos primeras lineas incluyen las declaraciones necesarias para las
funciones que aparecen en el programa. Estas funciones son: system( ),
printf( ) y gets( ).
A continuaci6n se escribe la funci6n principal main( ). Las dos pri-
meras Hneas de esta, definen las cadenas de caracteres mensajel y mensaje2
y la siguiente linea define la cadena de caracteres nombre para contener
49 caracteres mas el caracter de "fin de cadena" que aftade C automati-
camente.
La funci6n printj( ) escribe el contenido de las variables especificadas
en la misma.
La funci6n gets( ) permite introducir datos a traves del teclado para
la variable especificada, en este caso nombre.
39. El programa editado esta ahora en la memoria. Para que este trabajo pue-
da tener contir.uidad, el programa escrito se debe grabar en el disco utili-
zando la orden correspondiente del editor.
El siguiente paso es compilar el programa, esto es, traducir el programa
fuente a lenguaje maquina para posteriormente enlazarlo con las librerias
de C y obtener as! un programa ejecutable. Estas operaciones, compilar
y enlazar, se efectuan mediante la orden c/.
Al compilar un programa, se nos pueden presentar errores de compi-
lacion, debidos a que el programa escrito no se adapta a la sintaxis y reglas
del compilador. Estos errores se iran corrigiendo hasta obtener una com-
pilacion sin errores.
Cada vez que se realiza el proceso de compilacion y enlace del programa
actual, C genera automaticamente sobre el disco un fichero con extension
.exe. Este fichero puede ser ejecutado directamente desde el DOS, sin el
soporte de C, escribiendo el nombre del fichero .exe despues del prompt
del DOS y pulsando Enter a continuacion.
Cuando se crea un fichero ejecutable, C utiliza primero el compilador
para compilar el programa fuente, dando lugar a un fichero intermedio co-
nocido como fichero objeto (.obj). A continuacion C utiliza el programa
Iink.exe para unir, en un unico fichero ejecutable, el modulo 0 los modulos
del programa compilados separadamente y las rutinas de las librerias del
compilador C que el programa necesite.
40. Al ejecutar el programa, pueden ocurrir errores durante la ejecucion.
Por ejemplo, puede darse una division par cero. Estos errores solamente
pueden ser detectados por C cuando se ejecuta el programa y senin notifi-
cados con el correspondiente mensaje de error.
Hay otro tipo de errores que no dan lugar a mensaje alguno. Por ejem-
plo: un programa que no termine nunca de ejecutarse, debido a que pre-
senta un lazo, donde no se llega a dar la condicion de terminacion. Para
detener la ejecucion se tienen que pulsar las teclas Ctrl +C.
Un programa una vez ejecutado puede dar lugar a una solucion incorrec-
ta. Este caso exige un analisis minucioso de como se desarrolla el progra-
ma en su ejecucion; esto es, hay que entrar en la fase de depuracion del
programa.
La forma mas sencilla y eficaz para realizar este proceso, es utilizar
un programa depurador. En el capitulo 16, se explica como utilizar el de-
purador Code View de Microsoft.
Vamos a preparar un programa formado par un solo modulo fuente, para
depurarlo. El primer paso sera editar el programa. Como ejemplo escribit
el siguiente programa, e1cual, imprime el valor y su cuadrado, de cada uno
de los elementos de una matriz numerica de 5 filas y 3 columnas, y cuenta
e imprime el numero de elementos que son pares.
#include <stdio.h>
#define FILAS 5
#define COLS 3
41. void display( iot n )
[
iot cuadrado;
cuadrado = n *n;
printj("el cuadrado de %2d es %3d n': n, cuadrado);
J
iot numero_par( iot x )
[
if (x % 2 = = 0)
retu rn (1);
else
return (0);
main( )
[
static iot a[FILAS][COLS] =
[1,2,3,4,5,6, 7,8,9,10,11,12,13,14,15 j;
iot fila, columna;
for (fila = 0; fila < FILAS; fila + +)
for (columna = 0; columna < COLS; columna + +)
[
display( aUila][columna] );
if ( numero~ar(aUila][columna]) )
numeros~ares+ +;
J
printj(" n nTotal numeros pares: %d n': numeros_pares);
j
Una vez editado salvamos el programa en el disco. Llamemosle por
ejemplo progOl02.c.
42. Fijandonos en la funci6n principal, main(), vemos que definimos una ma-
triz cuadrada cca': para a continuaci6n recorrerla elemento a elemento por
filas.
Esta funci6n principal llama a la funci6n display( ) que escribe el va-
lor del elemento objeto de analisis y su cuadrado, y llama tambien a la fun-
cion numero_par( ) que indica si el numero es 0 no par. En el caso de
que sea par incrementamos en una unidad el contador numeros_pares.
Una vez que se han analizado todos los elementos de la matriz, se es-
cribe el numero de valores pares encontrados.
Como siguiente paso, compilaremos el programa con las opciones IZi
y IOd.
La opcion IZi hace que se incluya en el fichero ejecutable resultante,
informacion necesaria para realizar la depuracion y la opcion IOd impide
la optimizacion, la cual puede dificultar la depuracion.
Cuando finaliza el proceso de compilacion y enlace, invocamos al depura-
dor (debug).
Las operaciones minimas que debe incluir un depurador son las si-
guientes:
43. Permite ver la sentencia del programa que es ejecutada. Code View
incluye las siguientes opciones:
Ejecutar una sentencia cada vez, incluidas funciones definidas
por el usuario. Esta modalidad se activa y se continua, pulsan-
do la tecla F8. Si no queremos que las funciones se ejecuten sen-
tencia a sentencia pero sf la funci6n principal main( ), utilizar
la tecla FIO.
Si pulsamos la tecla F5, la ejecuci6n continua hasta el final del
programa 0 hasta el primer punto de parada, si este existe.
Un punto de parada es una pausa que se hace en un lugar determi-
nado dentro del programa. Esto permite testear los valores de las
variables en ese instante. Colocar los puntos de parada donde se sos-
peche que esta el error.
Para poner 0 quitar una pausa, se coloca el cursor en ellugar don-
de va a tener lugar la pausa y se pulsa F9.
Las expresiones de seguimiento permiten observar los valores, de las
variables 0 de expresiones del programa, mientras este se ejecuta (6r-
denes Add Watch, Delete Watcha, ... ).
Ejecutar la orden Add Watch ... y escribir en el recuadro corres-
pondiente, fila. Realizar la misma operaci6n para incluir en la
ventana de seguimiento columna y aUilaJ[columnaj.
Continuar la ejecuci6n pulsando F8 0 FIO. Si se pulsa la tecla
F5, la ejecuci6n del programa continua hasta el final del pro-
grama 0 hasta un punto de parada si se encuentra.
44. El nombre de un fichero consta de dos partes: el nombre base que puede
tener hasta ocho caracteres y la extension que puede tener hasta tres carac-
teres y va separada del nombre base por un punto. C identifica las siguien-
tes extensiones con los ficheros que a continuaci6n se indican:
.obj fichero resultante de la compilaci6n de un fichero fuente.
No es ejecutable .
.mak fichero que contiene una lista de m6dulos y las acciones
que con ellos debe hacerse para construir el programa final.
Cuando se especifica el nombre de un fichero sin extensi6n, C asume
por defecto la extensi6n .obj.
45. Las palabras clave aparecenln en negra y deben escribirse exactamente como
aparecen.
EI texto que no aparece en negra, significa que ahi debe ponerse la
informacion indicada por ese texto.
Los puntos suspensivos "..." indican que pueden aparecer mas elementos
de la misma forma.
Cuando dos 0 mas opciones aparecen entre Haves "{ ]" separadas por
"I", se elige una, la necesaria dentro de la sentencia.
46. Estos caracteres son utilizados para formar las constantes, los identi-
ficadores y las palabras clave de C.
El compilador C trata las letras mayusculas y minusculas como carac-
teres diferentes. Por ejemplo los identificadores Pi y PI son diferentes.
Espacio en blanco, tabulador horizontal (HT), tabulador vertical (VT), avan-
ce de pagina (FF), y nueva linea (LF 0 CR + LF) son caracteres denomina-
dos espacios en blanco, porque la labor que desempefian es la misma que
la del espacio en blanco, esto es, actuar como separadores entre los ele-
mentos de un programa. Los espacios en blanco en exceso son ignorados
por el compilador, 10 cual nos permite escribir programas mas legibles.
EI caracler Ctr! +Z bajo DOS, (equivalente a Ctrl +0 bajo UNIX) es
tratado POl' el compiIador como un indicador de fin de fichero (End Of File).
47. Los caracteres tambien pueden ser representados por secuencias de escape.
Una secuencia de escape esta formada por el caracter seguido de una
letra 0 de una combinaci6n de digitos. Son utilizadas para acciones como
nueva linea, tabular y para representar caracteres no imprimibles.
n
t
v
b
r
f
a
'
Nueva linea
Tab horizontal
Tab vertical (s610 para impresora)
Backspace (retroceso)
Retorno de carro
Alimentaci6n de pagina (s610 para impresora)
Bell (alerta, pitido)
Comilla simple
Comilla doble
Backslash (barra invertida)
Canicter ASCII. Representaci6n octal
Caracter ASCII. Representaci6n hexadecimal
ddd
xdd
48. Hay varios tipos fundamentales de datos. Los ficheros de cabecera Iimits.h
y f1oat.h especifican los valores maximo y minima para cad a tipo. Los po-
demos clasificar en:
Tipos enteros: char, short, int, long y enum.
Tipos reales: float, double y long double.
Otros: void.
Cada tipo entero puede ser calificado por las palabras clave signed 0
unsigned, 10 que da lugar a tener disponibles los siguientes tipos extras:
signed char, unsigned char
signed short, unsigned short
signed int, unsigned int
signed long, unsigned long
Un entero calificado signed es un entero con signo, esto es, un ntlme-
ro entero positivo 0 negativo. Un numero entero calificado unsigned es un
numero entero sin signo, el cual es manipulado como un numero entero
positivo.
Si los calificadores signed y unsigned se utilizan sin un tipo especffi-
co, se asume el tipo into Por este motivo, las siguientes declaraciones son
equivalentes:
signed x;
signed int X;
unsigned y;
unsigned int y;
El tipo char es utilizado para almacenar un valor entero en el rango -128
a 127, correspondiente a un caracter del c6digo ASCII. Solamente los va-
lores 0 a 127 son equivalentes a un caracter.
49. De forma similar el tipo unsigned char puede almacenar valores en
el rango de 0 a 255, valores correspondientes a los numeros ordinales de
10s 256 caracteres ASCII.
Este ejemplo declara una variable car de tipo char, capaz de contener
un canicter cuyo c6digo ASCII se correspondeni con un valor entero entre
o y 127. Otros ejemplos son:
char a = 'z';
signed char b = Ox07;
unsigned char c = 32;
De forma similar el tipo unsigned short puede almacenar valores en
el rango de 0 a 65535 (0 a 2EI6-1).
Este ejemplo declara i y j, como variables enteras con posibilidad de
tDmar vaDres entre -'3216'il y '1'2161. Otros ejempos son:
short int a = -500;
signed short b = 1990;
unsigned short int c = OxfOOO;
50. Un entero es para C un numero sin punta decimal. El rango de valores de-
pende de la maquina. Igualmente ocurre con el tipo unsigned into Para una
maquina con un procesador de 16 bits el rango de valores es de:
-32768 a 32767 (-2EI5 a 2EI5-1) para el tipo into
o a 65535 ( 0 a 2EI6-1) para el tipo unsigmld.
El uso de enteros produce un c6digo compacta y rapido. Para una ma-
quina de 16 bits este tipo es equivalente al tipo short y solamente oc4pa
2 bytes de memoria. En general:
Este ejemplo declara las variables n y x de tipo entero. Otros ejemplos
son:
int a = 2000;
signed int b = -30;
unsigned int c = Oxf003;
Este tipo de numeros es id6neo para aplicaciones de gesti6n. Al igual que
los enteros, son numeros sin punta decimal comprendidos en el rango de:
-2147483648 a 2147483647 (-2E31 a 2E31-1) para el tipo long.
o a 4294967295 (0 a 2E32-1) para el tipo unsigned long.
51. Este ejemplo declara las variables n y m de tipo entero, pudiendo to-
mar valores entre -2147483648 y 2147483647. Otros ejemplos son:
long a = -IL;
signed long b = 125;
unsigned long int c = Oxlj00230j;
La declaraci6n de un tipo enumerado es simplemente una lista de valores
que pueden ser tornados por una variable de ese tipo. Los valores del tipo
enumerado se representanin con identificadores, que senin las constantes
del nuevo tipo.
tunes,
martes,
miercotes,
jueves,
viernes,
sabado,
domingo
hoy;
52. Este ejemplo declara las variables hoy y ayer del tipo enumerado
dia----semana. Estas variables pueden tomar cualquier valor de los especi-
ficados, lunes ... domingo. El valor ordinal de lunes es O. Los elementos
que aparecen enumerados en la lista son considerados como constantes
enteras.
Crear una enumeraci6n es definir un nuevo tipo de datos, denominado tipo
enumerado y declarar una variable de este tipo. La sintaxis es la siguiente:
enum tipo_enumerado
!
Despues de definir un tipo enumerado, podemos declarar una 0 m,b
variables de ese tipo, de la forma:
};
enum colores color;
Este ejemplo declara una variable color del tipo enumerado colores,
la cual puede tomar cualquier valor de los especificados en la lista.
53. Cada identificador, de la lista de constantes enteras en una enumera-
ci6n, tiene asociado un valor. Por defecto, el primer identificador tiene aso-
ciado el valor 0, el siguiente el valor 1, y as! sucesivamente.
A cualquier identificador de la lista, se Ie puede asignar un valor ini-
cial por medio de una expresi6n con stante. Los identificadores sucesivos
tomanln valores correlativos a partir de este.
azul, amarillo, raja, verde
color;
Este ejemplo define un tipo enumerado Hamado colores y declara una
variable color de ese tipo. Los valores asociados a los identificadores son
los siguientes: azul = 0, amarillo =1, raja =2, verde = 0, blanco = 1
Y negro = 2.
3. Desafortunadamente, no es posible leer 0 escribir directamente un
valor de un tipo enumerado.
Estos numeros son los mas recurridos en un lenguaje de programaci6n. Un
real en simple precision es un numero que puede tener un punta decimal
y que puede estar comprendido en el rango de:
54. -3.402823E + 38 a -1.175494E-38 para numeros negativos
1.175494E-38 a 3.402823E+38 para numeros positivos
Un numero real en simple precision no tiene mas de 7 digitos signifi-
cativos.
Este ejemplo declara la variable x de tipo real en simple precision. Otros
ejemplos son:
float a = 3.14159;
float b = 2.2e-5;
Un numero real en doble precision es un numero que puede tener un punta
decimal y puede estar comprendido en el range de:
-1.79769E+308 a -2.22507E-308 para numeros negativos
2.22507E-308 a 1.79769E+308 para numeros positivos
Un numero real en doble precision tiene hasta 16 digitos significati-
vos. Esto da lugar a calculos mas exactos que en simple precision.
Este ejemplo declara la variable x de tipo real en doble precision. Otro~
ejemplos son:
double a = 3.1415926;
double b = 2.2e-8;
55. -1.189731£+4932 a -3.362103E-4932 para numeros negativos
3362103E-4932 a 1.189731£+4932 para numeros positivos
Un numero real en doble precision formato largo no tiene mas de 19
digitos significativos. Esto da lugar a calculos mas precisos que en doblc
precision.
long double X;
long double y = 3.17e+425;
El tipo void se utiliza para dec1arar funciones que no retornan un valor
o para dec1arar un puntero a un tipo no especificado. Si void aparece entre
parentesis a continuacion del nombre de una funcion, no es interpretado
como un tipo. En este caso indica que la funcion no acepta argumentos.
double jx(void);
void jy(void);
void *P;
Este ejemplo dec1ara la funcion denominada jx, como una funcion
sin argumentos que devue1ve un valor de tipo real de doble precision; la
funcionjy, como una fundon sin argumentos que no devuelve valor algu-
no; y un puntero P a un objeto de un tipo no espedficado.
Los tipos derivados son construidos a partir de los tipos fundamentales.
Algunos de ellos son los siguientes:
56. Un puntero es una direcci6n de memoria que indica d6nde se localiza un
objeto de un tipo especificado. Para definir una variable de tipo puntero
se utiliza el operador de indirecci6n *.
int *p,'
char *plineas[40j,'
Este ejemplo declara un puntero p a un valor entero; y un array de
punteros plineas (plineas[Oj a plineas[39J) a valores de tipo char.
Una estructura es una variable que representa 10 que normalmente cono-
cemos como registro, esto es, un conjunto de uno 0 mas campos de igual
o diferentes tipos.
float a, b;
complejo;
struct persona
{
char nombre[20j;
char apellidos[40j;
long dni;
Este ejemplo declara las variables complejo y reg, como estructuras
o registros. La variable complejo comprende los campos a y b de tipo real;
57. y la variable reg comprende los campos nombre y ape/lidos que son cade-
nas de caracteres y el campo dni de tipo long.
Una union tiene la misma forma de definici6n que una estructura. Las unio-
nes, a diferencia de las estructuras, representan registros variables. Esto cjuiert:
decir que una variable de este tipo, puede alternar entre varios tip os.
Un array es un conjunto de objetos, todos del mismo tipo, que ocupan po-
siciones sucesivas en memoria. Para definir un array se utiliza el operador
[ ] despues del nombre del array.
Este ejemplo declara un array !ista de 40 elementos (!ista[O]a !ista[39J)
para almacenar valores enteros.
Una funci6n es un subprograma C, el cual toma argumentos de unos tipos
dados y retorna un valor de un tipo especificado. Para declarar una fun-
ci6n se utiliza el operador ( ) despues del nombre de la funci6n.
Permite declarar nuevos nombres de tipos de datos; esto es, sin6nimos de
otms tipos ya sean fundamentales 0 derivados, los cuales pueden ser utili-
zados mas tarde para declarar variables de esos tipos.
58. typedef int ENTERO;
typedef int (*PFlj( );
typedef struct persona REG;
Este ejemplo propone el tipo ENTERO como sin6nimo de int; el tipo
PFI como un puntero a una funci6n que devuelve un valor entero; y el tipo
REG como sin6nimo de struct persona.
ENTERO n;
PFI p;
REG per;
declaran n como una variable de tipo entero, p como un puntero a una
funci6n que devuelve un valor entero y per como una estructura 0 registro
de tipo persona.
Las declaraciones typedej permiten parametrizar un programa para
evitar problemas de portabilidad. Utilizando typedej con los tipos que pue-
den depender de la instalaci6n, cuando se lleve el programa a otra instala-
ci6n s610 se tendnin que cambiar estas declaraciones.
Una constante es un valor que, una vez fijado por el compilador, no cam-
bia durante la ejecuci6n del programa. Una constante en C puede ser un
mimero, un canicter 0 una cadena de caracteres.
59. En general, si la constante es positiva, el signa + es opcional y si es
negativa, lleva el signo -. El tipo de una constante entera viene determina-
do por su valor. Tambien se puede indicar explicitamente el tipo de una
constante entera, afiadiendo los sufijos L, U, 0 UL (mayusculas 0 minus-
culas). Si el sufijo es L, su tipo es long cuando el valor puede ser represen-
tado en este tipo, si no es unsigned long. Si el sufijo es U, su tipo es unsig-
ned int cuando el valor puede ser representado en este tipo, si no es unsigned
long. Si el sufijo es UL, su tipo es unsigned long.
1522U
1000L
325UL
constante entera de tipo unsigned int
constante entera de tipo long
constante entera de tipo unsigned long
Una constante decimal puede tener uno 0 mas digitos, 0 a 9, de los
cuales el primera de ellos es distinto de cero.
4326
432600
constante entera de tipo int
constante entera de tipo long
Una constante octal puede tener lomas digitos, 0 a 7, precedidos por
o (cera). Su valor esta comprendido en el rango:
Oa077777
0100000 a 0177777
0200000 a 017777777777
020000000000 a 037777777777
para constantes tipo int
para constantes tipo unsigned int
para constantes tipo long
para constantes tipo unsigned long
Una constante hexadecimal puede tener lomas caracteres, 0 a 9 y
A a F, precedidos por Ox 0 OX (cero mas x). Su valor esta comprendido
en el rango:
60. OxOa Ox7FFF
Ox8000 a OxFFFF
OxlOOOOa Ox7FFFFFFF
Ox80000000 a OxFFFFFFFF
para constantes tipo int
para constantes tipo unsigned int
para constantes tipo long
para constantes tipo unsigned long
256
0400
OxJOO
-0400
-OxJOO
especifica el nO 256 en decimal
especifica el n° 256 en octal
especifica el nO 256 en hexadecimal
especifica el nO -256 en octal
especifica el nO -256 en hexadecimal
Una constante real esta formada por una parte entera, seguida por un punto
decimal, y una parte fraccionaria. Tambien se permite la notaci6n cientffi-
ca, en cuyo caso se afiade al valor una e 0 E, seguida por un exponente
positivo 0 negativo.
donde dfgitos representa cero 0 mas digitos del 0 al 9 y E 0 e es el simbolo
de exponente de la base 10 que puede ser positivo 0 negativo (2E-5 =
2 x J(f5). Si la constante real es positiva no es necesario especificar el sig-
no y si es negativa lleva el signa menos (-).
-17.24
17.244283
.008e3
27E-3
Una constante real tiene siempre tipo double, a no ser que se afiada
a la misma una f 0 F, en cuyo caso sera de tipo float, 0 una I 0 L para
indicar que es de tipo long double.
61. Este tipo de constantes esta formado por un unico caracter encerrado en-
tre comillas simples. Una secuencia de escape es considerada como un uni-
co canicter.
espacio en blanco
letra minuscula x
nueva linea
canicter ASCII Ese
' n'
, x1B'
Una constante de caracteres es una cadena de caracteres encerrados entre
comillas dobles.
"Esto es una eonstante de earaeteres"
"3.1415926 "
"Paseo Pereda 10, Santander"
En el ejemplo siguiente el car<icter n fuerza a que la cadena "0 pul-
sar Enter" se escriba en una nueva linea.
Cuando una cadena de caracteres es demasiado larga puede utilizarse
el canicter " " como canicter de continuaci6n.
62. HEsta cadena de caracteres es dema
siado larga."
Dos 0 mas cadenas separadas por un espacio en blanco sedan conca-
tenadas en una sola cadena.
printf(HPrimera cadena,"
H segunda cadena ");
Los caracteres de una cadena de caracteres son almacenados en locali-
zaciones sucesivasde memoria. Cada cadena de caracteres es finalizada auto-
m<iticamente por el caracter nulo representado por la secuencia de escape
o.
El tipo de una cadena de caracteres es el tipo array donde cada ele-
mento es de tipo char (char [ J) y la clase de almacenamiento es static. El
numero de elementos de un array, necesarios para almacenar una cadena
de caracteres, es igual al numero de caracteres de la cadena, mas uno para
el caracter nulo de terminaci6n.
Los identificadores son nombres dados a constantes, variables, tipos, fun-
ciones y etiquetas de un programa. La sintaxis para formar un identifica-
dor es la siguiente:
63. 10 cual indica que un identificador consta de uno 0 mas caracteres (letras,
digitos y el caracter de subrayado) y que el primer canicter debe ser una
tetra 0 el cardcter de subrayado.
Las letras pueden ser mayusculas 0 minusculas y se consideran como
caracteres diferentes; esto es, los identificadores Suma, suma y SUMA son
diferentes.
Los identificadores pueden tener cualquier numero de caracteres pero
solamente los 31 caracteres primeros, son significativos. Esto quiere decir
que un identificador es distinto de otro cuando difieren al menos en uno
de los 31 primeros caracteres.
suma
Catcuto~umeros~rimos
_ordenar
ab123
Las palabras clave son identificadores predefinidos que tienen un signifi-
cado especial para el compilador C. Un identificador definido por el usua-
rio, no puede tener el mismo nombre que una palabra clave.
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
Ademas de las palabras clave anteriores, el compilador C de Micro-
soft tiene tambi(~n las siguientes:
64. _asm
_based
_cdecl
_emit
_export
~ar
~astcall
~ortran
----huge
~nterrupt
~oadds
_near
_pascal
-3averegs
_segment
-3egname
-3elf
Un comentario es una secuencia de caracteres utilizada para explicar el co-
digo fuente. Microsoft C soporta comentarios estilo C y estilo C++.
Un comentario estilo C es una secuencia de caracteres cualesquiera en-
cerrados entre los simbolos 1* y *1. Estos comentarios pueden ocupar mas
de una linea, pero no pueden anidarse. Por ejemplo:
1* Este es un comentario
* que ocupa varias
* !ineas.
*1
Un comentario estilo C+ + comienza con los caracteres II y termina
al final de la linea. Estos comentarios no pueden ocupar mas de una linea.
Por ejemplo:
Un comentario puede aparecer en cualquier lugar donde se permita
aparecer un espacio en blanco. El compilador trata un comentario como
a un espacio en blanco.
El valor de una variable, a diferencia de las constantes, puede cambiar a
10 largo de la ejecucion de un programa.
65. La sintaxis correspondiente a la declaraci6n de una variable es la si-
guiente:
c1ase representa una de las cuatro clases siguientes: auto, register, sta-
tic, 0 extern. La clase de una variable determina si esta tiene ca-
racter global (static 0 extern) 0 local (auto 0 register).
Una variable declarada fuera de todo bloque (conjunto de sentencias
encerradas entre ( }) es, por defecto, global y es accesible en el resto del
archivo fuente en el que esta declarada. Por el contrario, una variable de-
clarada dentro de un bloque, es por defecto local y es accesible solamente
dentro de este.
Cada variable de un programa, debe declararse antes de ser utilizada.
La declaraci6n consiste en enunciar el nombre de la variable y asociarle
un tipo. El tipo determina los valores que puede tomar la variable asi como
las operaciones que con ella pueden realizarse.
iot suma, incremento;
char car, linea/80];
char car = ( 0'; / * car igual al cardcter nulo */
iot c = 1; / * inicializar c a 1*/
66. Ala declaraci6n de un objeto, se puede anteponer el calificador eonst, con
el fin de hacer que dicho objeto sea, en lugar de una variable, una constante.
const int k = 12;
const int v[ j = [1, 2, 3, 4j;
A un objeto declarado como una constante no se Ie puede asignar un
valor. Por ello, al declararlo debe ser inicializado. Si k ha sido declarado
como constante, las siguientes sentencias darian lugar a un error:
k = 100;
k+ +;
/ * error */
/ * error */
Una declaraci6n de un puntero precedida por eonst, hace que el obje-
to apuntado sea una constante, no sucediendo 10 mismo con el puntero.
const char *pe = "abed";
pe[Oj = 'z'; / * error */
pe = "efg"; / * eorreeto */
Si 10 que se pretende es declarar un puntero como una con stante, pro-
cederemos asi:
char *const pe = "abed";
pe[Oj = 'z'; / * eorreeto */
pe = "efg";' / * error */
Para hacer que tanto el puntero como el objeto apuntado sean cons-
tantes, procederemos como se indica a continuaci6n:
const char *const pe = "abed";
pe[Oj = 'z'; h error */
pe = "efg"; / * error */