Isc-201. Introducción a la Programación Clase 15. Las estructuras en ansi c



Descargar 13.63 Kb.
Fecha de conversión09.03.2017
Tamaño13.63 Kb.

ISC-201. Introducción a la 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.

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.

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  componentes homogéneas

Estructuras  componentes heterogéneas


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 autoreferentes 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, aunque 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

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



Guardado: 09/03/2017 07:06 O3/p3



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

    Página principal