Los datos del mundo real, normalmente no est�n formados por variables escalares de tipos los tipos b�sicos. Por ejemplo, nos puede interesar saber cu�ntos m�dulos en C hemos escrito cada semana, a lo largo del a�o. O tambi�n nos interesa tener los datos de cada planeta del Sistema Solar, masa, posici�n, velocidad y aceleraci�n, para un programa de simulaci�n de la ley de gravitaci�n de Newton. Para resolver el primer caso, C nos permite declarar una variable que sea de tipo vector. Para el segundo, podemos definir un registro para cada elemento.
Un vector es una porci�n de memoria que es utilizada para almacenar un grupo de elementos del mismo tipo Un vector se declara: tipo nombre [tama�o];. Por ejemplo, int modulo[52];. Aqu� modulo es un vector de 52 elementos enteros.
main() { int f, modulo[52]; for ( f = 0; f< 52; f++ ) modulo[f] = 0; ... }
Cada elemento de un vector es accedido mediante un n�mero de �ndice y se comporta como una variable del tipo base del vector. Los elementos de un vector son accedidos por �ndices que van desde 0 hasta N-1 para un vector de N elementos. Los elementos de un vector pueden ser inicializados en la misma declaraci�n:
char vocal[5] = {'a', 'e', 'i', 'o', 'u' };
float n_Bode[5] = { 0.4, 0.7, 1, 1.6, 2.8 };
Tambi�n podemos definir vectores multidimensionales. C no impone ninguna limitaci�n al n�mero de dimensiones de un vector. Existe, en cambio, la limitaci�n del tama�o de memoria que podamos utilizar en nuestro ordenador. Por ejemplo, para la declaraci�n de un vector multidimensional podemos escribir:
int video[25][80][2];
El tama�o de la variable video es proporcional al tama�o del tipo int y al tama�o de cada dimensi�n. Existe un operador C que nos permite obtener el tama�o de un tipo o de una variable. Este es sizeof() y nos proporciona el tama�o en bytes.
if ( sizeof(video) == 80 * 25 * 2 * sizeof(int) ) printf("OK!\n"); else printf("Algo no funciona.\n");
Un tipo vector muy utilizado es la cadena de caracteres (string). Si queremos asignar espacio para un string podemos hacer:
char nombre[60], direccion[80];
Es un vector C pero con la particularidad de que el propio lenguaje utiliza un car�cter especial como marca de final de string. As� en un vector de caracteres de tama�o N podremos almacenar una cadena de N-1 caracteres, cuyo �ltimo car�cter estar� en la posici�n N-2 y la marca de final de string en la N-1. Veamos un ejemplo:
char servei[6] = "SCI";
La posici�n 0 contiene el car�cter 'S'; la 1 el 'C'; la 2 el 'I'; la 3 el '\0', marca de final de string. El resto de componentes no est�n definidas. En la inicializaci�n de strings no se debe indicar el final; ya lo hace el compilador. Para la manipulaci�n de cadenas de caracteres ANSI proporciona el fichero string.h que contiene las declaraciones de un conjunto de funciones proporcionadas con la librer�a del compilador.
Un registro agrupa distintos tipos de datos en una misma estructura. Los registros son definidos de la forma:
struct nombre{ lista de declaraciones };
Los campos de cada registro pueden ser tipos b�sicos u otros registros. Por ejemplo:
struct planeta { struct 3D r, v, a; double masa; char nom[10]; }; struct 3D { double x,y,z; };
Los campos de cada registro son accesibles mediante el nombre del registro seguido de punto y el nombre del campo, como por ejemplo venus.r.x = 1.0;. Cada campo se comporta como lo hace su tipo b�sico. C no proporciona mecanismos de inicializaci�n, ni copia de registros, por lo que debe ser el programador el que los implemente.
A veces los datos se ajustan a series ordenadas en las cuales un elemento sigue, o precede, a otro. Un caso t�pico son los d�as de la semana. Si se desea realizar iteraciones con los d�as de la semana una forma es, por ejemplo, asignar un n�mero a cada d�a con #define. C proporciona un mecanismo compacto para realizar esto; son las enumeraciones. Una enumeraci�n toma la forma: enum nombre { lista de elementos };. Veamos un ejemplo:
void planning ( void ) { enum diasemana {lunes, martes, miercoles, jueves, viernes, sabado, domingo }; int dia; for ( dia = lunes; dia <= viernes; dia++ ) trabajar(dia); if ( dia == sabado ) salir(); }
A cada elemento de la enumeraci�n se le asigna un valor consecutivo, comenzando por 0. Si se desea que el valor asignado sea distinto se puede hacer de la siguiente forma:
enum puntos { t_6_25 = 3, t_zona = 2, t_libre = 1 };
Muchas veces es conveniente renombrar tipos de datos para que la escritura del programa se nos haga m�s sencilla y la lectura tambi�n. Esto se puede conseguir con la palabra typedef. Con ella damos un nombre a cierto tipo, o combinaci�n de ellos.
typedef struct planeta PLANETA; PLANETA mercurio, venus, tierra, marte;
Al igual que podemos inicializar las variables de tipos b�sicos en la misma declaraci�n, tambi�n lo podemos hacer con los registros. Los valores de cada campo de un registro van separados por comas y encerrados entre llaves.
PLANETA mercurio = {{ 0.350, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, 100,"Mercurio" };