UNIDAD 4 Arreglos y estructuras

ARREGLOS Y ESTRUCTURAS

Arreglo (array)
Es una colección o conjunto de variables relacionadas entre sí, por el hecho de que todas tienen el mismo nombre y son del mismo tipo.
Un arreglo es una variable capaz de guardar uno o más valores del mismo tipo.  Un arreglo consta de posiciones de memoria contiguas, para referirse a una posición en particular o elemento dentro de un arreglo especificamos el nombre del arreglo y el número de posición del elemento particular dentro del mismo.
                    - Unidimensionales (vectores)
Arreglos     - Bidimensionales (matrices)
                    - Multidimensionales




Arreglos unidimensionales
Son esencialmente listas de información de un solo tipo, es decir, de una sola dimensión.  Por ejemplo, tenemos el siguiente arreglo de enteros llamado a.






Arreglo tridimencional






 
CADENAS
El uso más corriente de un arreglo unidimensional es crear cadenas de caracteres.
En C/C++, una cadena es un arreglo de caracteres, que termina con un caracter nulo (‘\0’).
Por esta razón, se debe declarar arreglos de caracteres con un caracter más que la cadena más larga que vaya a guardar.
Se tiene acceso a una cadena mediante un apuntador al primer caracter de la cadena.
Una cadena puede ser asignada en una declaración, ya sea un arreglo de caracteres o una variable de tipo char.
            char cadena [11];                //cadena de 10 caracteres
            char color[  ] = “blue”;          // 5 elementos
            char color [  ] = [“’b’, ‘l’, ‘u’, ‘e’, ‘\0’};
La mejor manera de introducir una cadena desde el teclado es usando la función de biblioteca gets ( ).  El formato general es:
 
 gets (nombre_arreglo);

Funciones de cadena de la biblioteca de C/C++
El archivo cabecera <string.h> contiene un gran número de funciones de manipulación de cadena.  Las más comunes son:
Ø  strcpy ( )
Ø  strcat ( )
Ø  strcmp ( )
Ø  strlen ( )
 
Función strcpy
Copia los contenidos de la cadena desde  a la cadena a.
Función strcat
La función strcat ( ) añade s2 al final de s1; s2 no se altera.  Ambas cadenas terminan con un nulo y el resultado temina en nulo.
Función strcmp
La función strcmp ( ) compara dos cadenas y devuelve 0 (cero) si son iguales.  Si s1 es lexicográficamente mayor que s2, entonces la función devuelve un número positivo; su s1 es menor que s2, la función devuelve un número negativo.
 
Función strlen
La función strlen ( ) devuelve la longitud de la cadena s.  
Arreglos bidimensionales
Los arreglos multidimensionales constan de dos o más dimensiones.  La forma más común para utilizar los arreglos multidimensionales son los arreglos bidimensionales (matrices)  que representan tablas de valores, consistiendo de información arreglada en renglones (filas) y columnas.

El formato general para la declaración de un arreglo bidimensional:

tipo nombre_arreglo [m][n];
tipo nombre_arreglo[tam];
tipo nombre_arreglo[tam];
tipo declara el tipo de datos de cada elemento del arreglo.
m número de renglones (filas) del arreglo.
n número de columnas del arreglo.
Para identificar un elemento particular de la tabla, se especifican 2 subíndices:
-          el primero identifica el renglón del elemento.
-          el segundo identifica la columna del elemento.
Por ejemplo, para declarar un arreglo bidimensional (matriz) de 3x4 de tipo flotante:
float  matriz [3] [4];
Otras declaraciones:
int num [3] [2];
double a [100] [40];
int m [F] [C];              // donde F y C se declaran como constantes simbólicas
float f [10] [5];

Estructuras (struct)
En muchos casos, los programas necesitarán agrupar información relacionada que puede no ser del mismo tipo.  Por ejemplo, supongamos que el programa trabaja con registros de empleado.  Se debe seguir la pista del nombre, la edad, el salario, la dirección, el número de empleado, el número de puesto, etc. Para almacenar esta información el programa necesitaría variables de tipo char, int, float, así como cadenas de caracteres.  Cuando es necesario guardar información relacionada de tipo diferente, el programa puede utilizar una estructura.
Las estructuras son colecciones de variables relacionadas que se referencian bajo un mismo nombre.
struct (palabra reservada para definir una estructura) dice al compilador que se va a definir una estructura.
dire (rótulo de la estructura) da nombre a la definición de la estructura.
Las variables declaradas dentro de las llaves de la definición de la estructura son los miembros de la estructura.  Los miembros de la estructura deben tener nombres únicos, pero dos estructuras diferentes pueden contener miembros con el mismo nombre sin entrar en conflicto.
Cada definición de estructura debe terminar con punto y coma (;).
Por lo tanto, el formato general de una definición de estructura es:
struct nombre_tipo_de_estructura {
            tipo nombre_elemento1;
            tipo nombre_elemento2;      miembros
                        ...
            tipo nombre_elemento_n;
} variables_estructura;
struct define un determinado tipo de estructura (nombre_tipo_de_estructura) y declara las variables_estructura del mismo tipo.
Si sólo se necesita una variable estructurada, no se necesita incluir el nombre de la estructura.
Las únicas operaciones válidas que pueden ejecutarse sobre estructuras son: asignar variables de estructura a variables de estructura del mismo tipo, tomando la dirección (&) de una variable de estructura, obteniendo acceso a los miembros de una variable de estructura, y utilizando el operador sizeof,  a fin de determinar el tamaño de la variable de estructura.
Operador sizeof
El operador unario especial sizeof  determina el tamaño de un arreglo en bytes (o de cualquier otro tipo de datos) durante la compilación de un programa.   Cuando se aplica al nombre de un arreglo, el operador sizeof regresa como un entero el número total del bytes del arreglo.  Para esto, se utiliza de la siguiente manera:
                        sizeof (nombre_arreglo)
El operador sizeof  puede ser aplicado a cualquier nombre de variable, tipo o constante.  Al se aplicado aun nombre de variable (que no sea un nombre de arreglo), o a una constante, será regresado el número de bytes utilizados para almacenar el tipo específico de variable o de constante.

Uniones
Conforme los programas se vuelven más complejos, habrá ocasiones en que necesiten diferentes formas de ver una parte de la información, además habrá otras veces que se tenga la necesidad de trabajar con dos o más valores, pero solamente utilizar uno de los valores en un momento dado.  En tales casos, los programas pueden utilizar las uniones para guardar los datos.
Una unión es un tipo de datos derivado, como lo es una estructura, cuyos miembros comparten el mismo espacio de almacenamiento.  Para distintas situaciones en un programa, algunas variables pudieran no ser de importancia, pero otras variables lo son, por lo que una unión comparte el espacio, en vez de desperdiciar el almacenamiento en variables que no están siendo utilizadas.  Los miembros de una unión pueden ser de cualquier tipo.  El número de bytes utilizados para almacenar una unión, deben ser por lo menos suficiente para contener el miembro más grande.   En la mayor parte de los casos, las uniones contienen dos o más tipos de datos.  Únicamente un miembro y, por lot anto, únicamente un tipo de datos, puede ser referenciado en un momento dado.  Es responsabilidad del programador asegurarse que en una unión los datos están referenciados con el tipo de dato apropiado.
Una unión se declara con la palabra reservada union en el mismo formato que una estructura:


union nombre_tipo_union {
      tipo elemento_1;
      tipo elemento_2;   . . .
      tipo elemento_n;
   }  variables_union;
Enumeraciones
Una enumeración es un conjunto de constantes enteras representadas por identificadores.  Estas constantes de enumeración  son constantes simbólicas cuyos valores pueden ser definidos automáticamente.
La declaración de una enumeración se realiza con la palabra reservada enum:
enum nombre_enum {lista_enum} lista_variables;
Arreglos bidimensionales
Son arreglos de dos dimensiones, son llamados tablas o matrices.  Se accesa a los elementos de un arreglo bidimensional por medio de dos índices, b [i] [j].


 









Arreglos multidimensionales
Son arreglos de 3 dimensiones o más, se accesa a los elementos por medio de 3
índices o más, c [i] [j] [k]

Arreglos unidimensionales
 

EN RESUMEN, UN ARREGLO:
· No es una variable; es un grupo de variables conocidas como elementos
· Cada elemento ocupa una posición dentro del grupo
· Todos los elementos son del mismo tipo
· El nombre del arreglo indica donde se localiza el grupo en la memoria de la
computadora
· Los arreglos se clasifican de acuerdo a las dimensiones que tengan
· Las dimensiones no tienen relación con el plano Cartesiano; nada que ver con
matemática
· Las dimensiones indican como están organizados los elementos dentro del grupo
· Los arreglos de dos dimensiones pueden visualizarse como tablas
· Los valores que se guarden en el arreglo se almacenan en los elementos ya que los
elementos son las variables
Para crear arreglos en C++, hay que indicar:
1. el tipo de los elementos (ejemplo, int, char, double, bool o un tipo definido por
el programador)
2. el nombre del arreglo
3. la cantidad de dimensiones y sus tamaños; cada dimensión comienza con el signo
[ seguido por el tamaño de la dimensión y termina con el signo ]
Para crear un arreglo de una dimensión, el formato es el siguiente:
<tipo de los elementos> <nombre del arreglo> [ <tamaño primera dimensión> ]
Para determinar la cantidad de elementos en un arreglo, hay que multiplicar el tamaño de cada una de las dimensiones indicados en la declaración. El tamaño debe ser un literal de tipo entero o el nombre de una constante de tipo entero.
Para nombrar un elemento en un arreglo hay que indicar el nombre del arreglo, seguido
de tantas parejas de corchetes [ ] como dimensiones declaradas. Dentro de cada pareja de corchetes tiene que haber un índice. La combinación de los índices indica la posición del elemento dentro del grupo. El valor mínimo para un índice es 0. El valor máximo es uno menos que el tamaño de la dimensión correspondiente en la declaración del arreglo.
Ejemplo #1. Arreglo de una dimensión
Declaración
int a[3]; // forma una secuencia de tres elementos
Nombre del grupo
a
Nombre de los elementos
a[0] primer elemento
a[1] segundo elemento
a[2] tercer elemento
Ejemplo #2. Arreglo de dos dimensiones
Declaración
char m[2][3]; // forma una tabla de dos filas y tres columnas
// cada fila es un arreglo de una dimensión
// la declaración indica que hay dos arreglos de una dimensión
Nombre del grupo
m indica la localización del grupo en la memoria
Nombre de las filas
m[0] primera fila indica la localización de la fila dentro del grupo
m[1] segunda fila indica la localización de la fila dentro del grupo
Nombre de los elementos
m[0][0] primer elemento
m[0][1] segundo elemento
m[0][2] tercer elemento
m[1][0] cuarto elemento
m[1][1] quinto elemento
m[1][2] sexto elemento
Ejemplo #3. Arreglo de tres dimensiones
Declaración
double w[2][2][3]; // forma dos tablas de dos filas y tres columnas
// cada fila es una secuencia de tres elementos
// cada fila es un arreglo de una dimensión
// la declaración indica que hay dos arreglos de dos dimensiones
// los arreglos de dos dimensiones tienen a su vez dos arreglos de una dimensión
Nombre del grupo
w indica la localización del grupo en la memoria
Nombre de las tablas
w[0] primera tabla indica la localización de la tabla dentro del grupo
w[1] segunda tablaindica la localización de la tabla dentro del grupo
Nombre de las filas
w[0][0] primera tabla, primera fila
w[0][1] primera tabla, segunda fila
w[1][0] segunda tabla, primera fila
w[1][1] segunda tabla, segunda fila
Nombre de los elementos
w[0][0][0] primer elemento
w[0][0][1] segundo elemento
w[0][0][2] tercer elemento
w[0][1][0] cuarto elemento
w[0][1][1] quinto elemento
w[0][1][2] sexto elemento
w[1][0][0] séptimo elemento
w[1][0][1] octavo elemento
w[1][0][2] noveno elemento
w[1][1][0] décimo elemento
w[1][1][1] undécimo elemento
w[1][1][2] duodécimo elemento