Objetivos Conocer el uso de las estructuras (struct) en ansi c. Desarrollo



Descargar 16.81 Kb.
Fecha de conversión09.03.2017
Tamaño16.81 Kb.

ISC-205. Algoritmos y Programación

Clase 15. Las estructuras en ANSI C

Objetivos


Conocer el uso de las estructuras (struct) en ANSI C.

Desarrollo

1. Estructuras en C. Declaración y uso de estructuras


Los arreglos son agrupaciones homogéneas de datos, pero hay muchísimas situaciones en que hay agrupaciones, pero ellas no son homogéneas. Las estructuras sirven para tal propósito.

1.1 Agregados de componentes heterogéneas


Las estructuras son agrupaciones heterogéneas de datos.

1.2 La declaración struct


struct {

char nombre[20];

long matricula;

} estudiante;

Lo anterior declara una variable estudiante como una estructura de tipo innominado.

struct {


double re;

double im;

} z1, z2;

La anterior estructura permitiría especificar un número complejo z1 y otro z2. Lo anterior define que los complejos tienen una parte real (re) y otra imaginaria (im).

No se admite asignación entre struct, aunque sean del mismo tipo:

z1= z2;


no está permitido.

Esta declaración define DOS variables del mismo tipo, también innominado:

struct {

char nombre[20];

long matricula;

} estudiante, otroestudiante;


2. Comparación de las estructuras y los arreglos


Arreglos

Estructuras

Componentes homogéneas.

Componentes heterogéneas.

Componentes son contiguas.

Componentes no tienen que ser contiguas.

El acceso a las componentes se realiza a través de índice.

Ejemplo: x[3]



El acceso a las componentes se realiza a través del nombre del campo.

Ejemplo: z1.re



El acceso por índice implica un cálculo.

El acceso por nombre no implica cálculo, sino desplazamiento.

Se utiliza en condiciones de absoluta homogeneidad.

Se utiliza en condiciones de ausencia de homogeneidad.


3. Construcción de estructuras complejas.

3.1 Creación de estructuras complejas mediante composición


Problema: crear una estructura de almacenamiento que guarde datos de un estudiante Y su fecha de nacimiento.

Solución: crear una estructura en combinación con una estructura de fecha.


3.2 Posibilidades y limitaciones de la composición

3.3 La instrucción typedef


La instrucción typedef nos permite asignar un nombre a una estructura. Además, en el caso de una struct, es posible emplear “structure tags”. Su uso es a veces imprescindible para poder respetar la regla de que el uso de un identificador debe ser siempre precedido por su declaración.

La definición inicial, con “structure tags” pudiera ser así:

struct estudianteStruct {

char nombre[20];

long matricula;

};

struct estudianteStruct estudiante;



Con lo cual la declaración de varias variables del mismo tipo de estructura se simplifica:

struct estudianteStruct estudiante;

struct estudianteStruct otroestudiante;

Sin embargo, usualmente se emplea un typedef para simplificar la escritura y el uso:

typedef struct _estudianteStruct {

char nombre[20];

long matricula;

} estudianteStruct;

estudianteStruct estudiante;

estudianteStruct otroestudiante;


4. Estructuras auto referentes


Se les llama estructuras auto referentes a aquellas que refieren a una del mismo tipo. Esta referencia puede ser directa o indirecta. Son especialmente importantes en el tratamiento de estructuras de datos enlazadas (listas, pilas, colas, etc.)

4.1 Campos punteros


Nótese que en este punto nos estamos refiriendo estrictamente a campos no relacionados con arreglos, aunque sabemos que ellos son punteros, con reglas especiales de uso.

typedef struct {

char *nombre;

long matricula;

} TipoEstudiante;

TipoEstudiante *ptrEstudiante;

.

.

.



/* Se asigna memoria a la estructura apuntada por ptrEstudiante */

if ( (ptrEstudiante= malloc(sizeof(TipoEstudiante))) == NULL )

{ printf(“No se pudo asignar memoria!!!\n”);

exit(1);


}

/* Se solicita el nombre del estudiante */

char buffer[1000]; /* Almacenamiento transitorio */

printf(“Teclee el nombre del estudiante:\n”);

gets(buffer);

/* Lo leido se incorpora al campo nombre.

La funcion empleada solicita exactamente la memoria

necesaria.

*/

if ( (ptrEstudiante->nombre= strdup(buffer)) == NULL )



{ /* No se pudo obtener memoria para la copia :(

Hay que retirarse, limpiando.

*/

free(ptrEstudiante);



exit(EXIT_FAILURE);

}

/* Asignacion de la matricula */



ptrEstudiante->matricula= 20042123;

/* Lo anterior es equivalente a

(*ptrEstudiante).matricula= 20042123;

*/

.



.

.

/* Antes de retirarse, la memoria debe ser liberada.



Primero hay que liberar el interio.

EL ORDEN DE LA LIBERACION ES CRITICO.

*/

free(ptrEstudiante->nombre);



free(ptrEstudiante);

.

.



.

4.2 Campos punteros hacia estructuras


typedef struct {

char nombre[20];

long matricula;

} TipoEstudiante;

TipoEstudiante *ptrEstudiante;

.

.



.

/* Se asigna memoria a la estructura apuntada por ptrEstudiante */

if ( (ptrEstudiante= malloc(sizeof(TipoEstudiante))) == NULL )

{ printf(“No se pudo asignar memoria!!!\n”);

exit(1);

}

/* Asignacion de la matricula */



ptrEstudiante->matricula= 20042123;

/* Lo anterior es equivalente a

(*ptrEstudiante).matricula= 20042123;

*/

.



.

.

/* Antes de retirarse, la memoria debe ser liberada */



free(ptrEstudiante);

.

.



.

Bibliografía


[1] The C Programming Language, Brian Kernighan / Dennis Ritchie. Chap. 6

[2] Data Structures, Algorithms and Program Style Using C, James F. Korsh / Leonard J. Garrett





La base de datos está protegida por derechos de autor ©bazica.org 2016
enviar mensaje

    Página principal