CAPITULO 6: ESTRUCTURAS DE AGRUPAMIENTO DE VARIABLES![]()
1. CONJUNTO ORDENADO DE VARIABLES (ARRAYS) Los
arreglos ó conjuntos de datos ordenados (arrays) recolectan variables del
MISMO tipo , guardandolas en forma secuencial en la memoria . La cantidad
máxima de variables que pueden albergar está sólo limitada por la cantidad
de memoria disponible . El tipo de las variables involucradas puede ser cualquiera
de los ya vistos , con la única restricción de que todos los componentes
de un array deben ser del mismo tipo . tipo de las variables nombre[ cantidad de elementos] ;
Si tomamos el primer caso , estamos declarando un array de 10 variables enteras , cada una de ellas quedará individualizada por el subíndice que sigue al nombre del mismo es decir : var1[0] , var1[1] , etc , hasta var1[9] . Nótese que la CANTIDAD de elementos es 10 , pero su numeración vá de
0 a 9 , y nó de 1 a 10 . En resumen un array de N elementos tiene subíndices
válidos entre 0 y N - 1 . Cualquier otro número usado como subíndice , traerá
datos de otras zonas de memoria , cuyo contenido es impredictible . var1[5] = 40 ; Tambien es posible utilizar como subíndice expresiones aritméticas , valores enteros retornados por funciones , etc . Así podríamos escribir : printf(" %d " , var1[ ++i] ) ; Por supuesto los subíndices resultantes de las operaciones tienen que
estar acotados a aquellos para los que el array fué declarado y ser enteros
. int numero[8] = { 4 , 7 , 0 , 0 , 0 , 9 , 8 , 7 } ; Obsérvese que la lista está delimitada por llaves . Otra posibilidad , sólo válida cuando se inicializan todos los elementos del array , es escribir : int numero[] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ;
donde se obvia la declaración de la cantidad de elementos , ya que está implícita en la lista de valores constantes . int numero[10] = { 1 , 1 , 1 } ; en éste caso los tres primeros elementos del mismo valdran 1 , y los restantes cero en el caso que la declaración sea global , ó cualquier valor impredecible en el caso de que sea local. 2. CONJUNTO ORDENADO DE CARACTERES (STRINGS) Los
strings son simplementes arrays de caracteres , tal como los vimos hasta
ahora , con el agregado de un último elemento constante : el caracter NULL
( ASCII == 0 , simbolizado por la secuencia de escape \0 ) . Este agregado
permite a las funciones que procesan a los mismos , determinar facilmente
la finalización de los datos . char car_str[] = { 'A' , 'B' , 'C' , 'D' , 0 } ; Ambas maneras son equivalentes. Sin embargo hay , en el lenguaje C , una forma más compacta de declararlos : char car_str[] = "ABCD" ; Simplemente en la declaración del mismo se encierran los caracteres que
lo componen entre comillas . Obsérvese que en la segunda declaración , se
ha explicitado ( no es necesario ) , la cantidad de elementos que tiene
el string , y és uno más que la cantidad de caracteres con que se lo inicializa
, para dejar lugar al NULL . Todas éstas declaraciones agregan automáticamente
el NULL como último elemento del array . 3. ARRAYS Y STRINGS COMO ARGUMENTOS DE FUNCIONES
Los arrays , como todos los otros tipos de variables , pueden ser pasados
como argumentos a las funciones . Veamos esquematicamente como sería la sintaxis
:
Es necesario analizar con mucho detenimiento , este último ejemplo . En la primer línea declaramos el prototipo de funcion_1() que recibe como argumentos dos arrays , uno de 10 elementos del tipo float , y otro de caracteres de longitud indeterminada . En el primer caso la función necesitará saber de alguna manera cual es la longitud del array numérico recibido, mientras que en el segundo , no hace falta , ya que la función puede ser construída para que , por sí misma , detecte la finalización del string por la presencia del caracter NULL . Se podría generalizar más el programa declarando : double funcion_1( double numeros[] , int longitud_array , char palabra[] ) ;
en donde , en la variable longitud_array se enviaría la cantidad de elementos de numero[] . numero == dirección de numero[0]
La primer sentencia es correcta , ya que estamos incializando al string , pero la segunda produciría un error del tipo " LVALUE REQUERIDO " , es decir que el compilador espera ver , del lado izquierdo de una expresión , a una variable y en cambio se ha encontrado con una constante titulo (ó sea la dirección de memoria donde está almacenada la P de "Primer título") . Esto al compilador le suena similar a una expresión de la clase : 124 = j y se niega rotundamente a compilarla. 4. ARRAYS MULTIDIMENSIONALES. Las estructuras de datos del tipo array pueden tener más de una dimensión , es bastante común el uso de arrays "planos" ó matriciales de dos dimensiones , por ejemplo :
Si declaramos : int matriz[3][4] ;
Por supuesto , aunque menos usados , se pueden generar arrays de cualquier número de dimensiones . char dia_de_la_semana[7][8] = { Acá el elemento [0][0] será la "l" de lunes , el [2][3] la "r" de miercoles
, el [5][2] la "b" de sabado, etc. Nótese que los elementos [0][5] , [1][6]
,etc estan inicializados con el caracter NULL y demas [0][6] y [0][7], etc
no han sido inicializados. Si le parece que en este párrafo se nos escapó
un error , está equivocado , lo que ocurre es que se olvidó de contar los
índices desde 0. 5. ESTRUCTURAS DECLARACION DE ESTRUCTURAS Así como los arrays son organizaciones
secuenciales de variables simples , de un mismo tipo cualquiera dado , resulta
necesario en multiples aplicaciones , agrupar variables de distintos tipos
, en una sola entidad . Este sería el caso , si quisieramos generar la variable
" legajo personal " , en ella tendriamos que incluir variables del tipo :
strings , para el nombre , apellido , nombre de la calle en donde vive ,
etc , enteros , para la edad , número de codigo postal , float ( ó double
, si tiene la suerte de ganar mucho ) para el sueldo , y así siguiendo .
Existe en C en tipo de variable compuesta , para manejar ésta situación típica
de las Bases de Datos , llamada ESTRUCTURA . No hay limitaciones en el tipo
ni cantidad de variables que pueda contener una estructura , mientras su
máquina posea memoria suficiente como para alojarla , con una sóla salvedad
: una estructura no puede contenerse a sí misma como miembro . struct legajo { En la primer sentencia se crea un tipo de estructura , mediante el declarador
"struct",luego se le dá un nombre " legajo " y finalmente , entre llaves
se declaran cada uno de sus miembros , pudiendo estos ser de cualquier tipo
de variable , incluyendo a los arrays ó aún otra estructura . La única restricción
es que no haya dos miembros con el mismo nombre , aunque sí pueden coincidir
con el nombre de otra variable simple , ( o de un miembro de otra estructura
) , declaradas en otro lugar del programa. Esta sentencia es sólo una declaración
, es decir que no asigna lugar en la memoria para la estructura , sólo le
avisa al compilador como tendrá que manejar a dicha memoria para alojar variables
del tipo struct legajo . struct legajo {
Y si nó fueran a realizarse más declaraciones de variables de éste tipo , podría obviarse el nombre de la estructura ( legajo ). Las variables del tipo de una estructura , pueden ser inicializadas en su definición , así por ejemplo se podría escribir: struct legajo { struct legajo legajo_programador = { 23 , "Jose Peres" , 2000.0 , Acá se utilizaron las dos modalidades de definición de variables , inicializandolas a ambas. REGLAS PARA EL USO DE ESTRUCTURAS Lo primero que debemos
estudiar es el método para dirigirnos a un miembro particular de una estructura
.Para ello existe un operador que relaciona al nombre de ella con el de un
miembro , este operador se representa con el punto ( . ) , así se podrá referenciar
a cada uno de los miembros como variables individuales , con las particularidades
que les otorgan sus propias declaraciones , internas a la estructura. strut posicion_de { fin_recta.eje_x = 10.0 ; if( fin_recta.eje_x == inicio_recta.eje_x ) Es muy importante recalcar que , dos estructuras , aunque sean del mismo tipo , no pueden ser asignadas ó comparadas la una con la otra , en forma directa , sino asignando ó comparandolas miembro a miembro. Esto se vé claramente explicitado en las líneas siguientes , basadas en las declaraciones anteriores: fin_recta = inicio_recta ; /* ERROR */ if( (fin_recta.eje_x >>= inicio_recta.eje_x) && /* FORMA CORRECTA DE */ Las estructuras pueden anidarse , es decir que una ó mas de ellas pueden ser miembro de otra . Las estructuras también pueden ser pasadas a las funciones como parámetros , y ser retornadas por éstas , como resultados. 6. ARRAYS DE ESTRUCTURAS Cuando hablamos de arrays dijimos que se podían agrupar , para formarlos , cualquier tipo de variables , esto es extensible a las estructuras y podemos entonces agruparlas ordenadamente , como elementos de un array . Veamos un ejemplo : typedef struct { Item stock[100] ; Hemos definido aquí un array de 100 elementos , donde cada uno de ellos es una estructura del tipo Item compuesta por tres variables , un int , un double y un string ó array de 50 caracteres. Los arrays de estructuras pueden inicializarse de la manera habitual , así en una definición de stock, podríamos haber escrito: Item stock1[100] = { Analicemos un poco las diferencias entre la dos inicializaciones dadas
, en la primera , el array material[] es inicializado como un string , por
medio de las comillas y luego en forma ordenada , se van inicializando cada
uno de los miembros de los elementos del array stock1[] , en la segunda se
ha preferido dar valores individuales a cada uno de los elementos del array
material , por lo que es necesario encerrarlos entre llaves . longitud_base_de_datos = sizeof( stock1 ) ; Con la primera calculamos el tamaño necesario de memoria para albergar a todos datos, en la segunda la longitud de un sólo elemento ( record ) y por supuesto dividiendo ambas , se obtiene la cantidad de records. 7. UNIONES Las uniones son a primera vista, entidades
muy similares a las estructuras, están formadas por un número cualquiera
de miembros, al igual que aquellas, pero en éste caso no existen simultaneamente
todos los miembros, y sólo uno de ellos tendrá un valor válido. ![]()
© Derechos Reservados, Copyright, DATA-2013, 1998-2020.
|