Programacion de matrices

PROGRAMACIÓN DE MATRICES
Una matriz (array ó vector) es una zona de almacenamiento contiguo, que contiene una serie de elementos del mismo tipo, los elementos de la matriz [1]. Desde el punto de vista lógico podemos considerarlas como un conjunto de elementos ordenados en fila. Así pues, en principio todas las matrices son de una dimensión, la dimensión principal, pero veremos que loselementos de esta fila pueden ser a su vez matrices (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de matrices multi-dimensionales, aunque las más fáciles de «ver» o imaginar son las de dos y tres dimensiones.
La declaración de matrices sigue la siguiente sintaxis:
tipoX etiqueta []
{draw:frame} tipoX es el tipo de los elementos que serán almacenados en lamatriz. Puede ser cualquier type-id válido a excepción de void y de funciones (no pueden existir matrices de funciones, pero sí de punteros-a-función).
{draw:frame} etiqueta es el identificador
{draw:frame} : una expresión cuyo resultado debe ser una constante entera positiva n distinta de cero, que es el número de elementos de la matriz. Los elementos están numerados desde 0 hasta n-1.
Nota:no confundir el valor n con el hecho de que los elementos estén numerados de 0 a n-1. Por ejemplo, el elemento a[9] es el último de la matriz definida como: int a[10];. Esta «extraña» ocurrencia es herencia del C clásico y una costumbre muy extendida en la informática (empezar a contar por el cero); aunque se habitúa uno a ella rápidamente, la verdad es que resulta un poco extraña al principio .{text:bookmark-start} Ejemplos {text:bookmark-end} :
int a[10]; // declara una matriz de 10 elementos enteros
char ch[10] // ídem de 10 elementos char
char* p[10] // ídem de 10 elementos puntero-a-carácter
struct St mst[10] // ídem de 10 elementos estructuras tipo St
Observe en esta última sentencia, que los elementos no tienen porqué ser necesariamente tipos simples (preconstruidosen el lenguaje). También pueden ser tipos abstractos. Incluso su declaración puede realizarse en la misma sentencia que declara la matriz. Por ejemplo:
struc St {
int orden;
char plato;
char descripc;
} mst[10];
Esta sentencia declara una matriz mst de 10 estructuras tipo St; ambas se declaran en la misma sentencia.
La exigencia de que el resultado de sea un valor constante, es dela mayor trascendencia para entender las limitaciones de las matrices C++. Significa que el tamaño de la matriz debe ser conocida en tiempo de compilación. Por ejemplo, no es posible algo como:
unsigned int size;

char matriz[size]; // Error!!
en su lugar debe hacerse:
const unsigned int size = 10;

char matriz[size]; // Ok.
pero entonces es preferible establecerdirectamente:
char matriz[10]; // Ok.
o mejor aún:
define ASIZE 10

char matriz[ASIZE]; // Ok.
En general, cuando se necesitan matrices que cambien de tamaño en «runtime», suele recurrirse a crearlas en el montón mediante el operador new[]que sí permite definir su tamaño en función de una variable. Por ejemplo:
unsigned int size;

char* mptr = new char[size]; // Ok.
Eneste caso las matrices no son referenciadas directamente, sino a través de un puntero, y una vez creadas tampoco es posible cambiar su tamaño. El recurso utilizado cuando se necesita cambiar este, es crear otra matriz del tamaño adecuado; copiar en su caso los miembros de la antigua a la nueva; borrar la antigua (liberar el espacio asignado), y finalmente, asignar el puntero a la nueva matriz. Deesta forma la ilusión del usuario es que realmente se ha cambiado el tamaño de la matriz, aunque la realidad subyacente sea muy diferente. Otro recurso, utilizado cuando la matriz «puede» crecer pero no se está muy seguro, es crearla con un tamaño inicial algo mayor que lo necesario (por ejemplo un 25%). En estos casos se dispone de cierto espacio de reserva antes que sea necesario proceder a un…