Está en la página 1de 20

Estructuras de Datos Tipos de Datos Complejos Estructuras en C

Gonzalo Gabriel Mndez, M.Sc.

En el captulo anterior
Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Los punteros pueden


1. Apuntar a la direccin de alguna otra variable 2. Reservar memoria propia Mediante la funcin malloc* Un solo espacio en memoria

Varios espacios consecutivos (en algunos sentidos se comportan como arreglos)


*La memoria reservada dinmica (con malloc) debe ser liberada Funcin free

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Algo de terminologa
tipo *ptr // Puntero llamado ptr que apunta a variable de tipo tipo *ptr // Valor almacenado en espacio de memoria a donde ptr

apunta

*(ptr + i) // Valor almacenado en el i-simo espacio de memoria delante de donde ptr apunta &algo // Direccin o referencia de algo tipo *ptr = &algo // Puntero llamado ptr que apunta a variable de tipo tipo al que se le asigna la direccin de memoria de algo ptr++ // Incremento de posicin a la que ptr apunta

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Ejemplo: Planteamiento
Tenemos dos arreglos que almacenan: (1) los nombres de un grupo

de estudiantes, y (2) las notas obtenidas por stos en un curso de


programacin. Queremos imprimir el nombre de cada estudiante de la nmina y, a continuacin la nota que ha obtenido.

De cuntas maneras diferentes podemos hacer esto?

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Ejemplo: Solucin
// Creacin de arreglos int notas[] = {23, 43, 67, 89, 72}; char *nombres[] = {"Alan", "Frank", "Mary", "John", "Lisa" };

int total = sizeof(notas) / sizeof(int); // obteniendo tamao de arreglo notas int i = 0;


// 1. Usando ndices sobre los arreglos definidos for(i = 0; i < total; i++) { printf ("%s ha sacado %d\n", nombres[i], notas[i]); } // 2. Utilizando punteros (y aritmtica de punteros) int *ptrNotas = notas; char **ptrNombres = nombres; for(i = 0; i < total; i++) { printf ("%s ha sacado %d\n", *(ptrNombres+i), *(ptrNotas+i)); } // 3. Tratando a los punteros definidos como simples arreglos for(i = 0; i < total; i++) { printf ("%s ha sacado %d\n", ptrNombres[i], ptrNotas[i]); }
Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Otros Tipos de Datos


Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Hasta ahora
Tipos de datos bsicos o simples Enteros, reales, caracteres, etc. Operaciones sobre cada uno Representan datos atmicos (pequeas unidades de informacin) Datos ms complejos o estructurados

Arreglos: Elementos ubicados de forma consecutiva en la memoria


Estticos o dinmicos

Finito: Capacidad predeterminada, lmite se alcanza eventualmente (incluso si el arreglo es dinmico).


Ordenado: elementos ubicados uno tras otro) Homogneo: Elementos de un mismo tipo Operaciones propias: Consulta/modificacin elementos
Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Datos Estructurados: Por qu?


Consideremos el ejercicio anterior
Matrculas Nombres Carreras Notas Ciudades FactoresP Promedios

200911147 201016284 200008423 200708295 7 Arreglos! 200719029 200810968 200827749 201024502 200002426 200115061
Nuevo estudiante

Alan Frank Mary John Lisa Carl Emily Jimmy Ann Marc Diane

IN-ICC-SM IN-ICC-SI IN-TEL IN-TLM IN-TLM IN-TEL IN-ICC-SI IN-ICC-ST IN-ICC-SM IN-TLM IN-TEL

23 43 67 89 72 80 86 30 74 100 87

Guayaquil Guayaquil Machala Salinas Guayaquil Milagro Babahoyo Guayaquil Salinas Salinas Ambato

17 9 11 13 15 8 7 7 6 11 9

7.98 6.32 8.33 9.03 6.43 7.39 9.00 6.07 6.77 7.46 8.34

200423176

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Representacin de Datos
Alan

Marc
Emily Mary John Ann

Diane

7 arreglos (nonatural)
Frank

Lisa Jimmy

Carl

Por qu mejor no trabajamos con 11 estudiantes?


Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

10

Solucin: Dato Estudiante


Estudiante: Matrcula Nombre Carrera Ciudad Atributos que definen a un estudiante

Factor P
Promedio Nota

Solucin en C

Estructuras de Datos

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

11

Estructuras de Datos
Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

Definicin
Constituyen un tipo de dato ms complejo Agrupa componentes (datos simples) Cada componente tiene un identificador y se conoce como elemento o campo de la estructura
typedef struct Nombre_de_Estructura {

Sintaxis en C

// Declaracin de campos tipo nombre_de_campo_1; tipo nombre_de_campo_2; tipo nombre_de_campo_3;


tipo nombre_de_campo_n;

} Nombre_de_Estructura;
Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

13

Recordando typedef
Sirve para 1. Renombrar tipos de datos existentes (creando alias)
typedef int entero; entero count = 1; entero *ptr = &count;

2. Crear enumeraciones
typedef enum { LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO } DIA; DIA hoy = SABADO

3. Definir estructuras
Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

14

Estructura Estudiante
Cmo se definira la estructura Estudiante del ejemplo anterior?
typedef struct Estudiante { char matrcula[9]; char nombre[100]; char carrera[10]; char ciudad[50]; int factorP; float promedio; int nota; } Estudiante; Estudiante estudiante1;

Despus de esta definicin, todos los Estudiantes tendrn la misma estructura en memoria

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

15

Acceso a campos
La variable seguida de un punto y del nombre del campo. Ejemplo:
Estudiante est; // Declaracin de la variable

// Asignacin de valores a campos est.promedio = 9.36; strcpy (est.matricula, 200305845); strcpy(est.nombre, Gonzalo Mndez Cobea) // Consulta de valores de campos printf("%d", est.factorP);

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

16

Estructuras: Ejemplos
Estructura para representar el nombre completo de una persona
typedef struct NombreCompleto { char primero[10]; char inicial; char ultimo[10]; } NombreCompleto;

Estructura para representar un punto en el plano


typedef struct Punto { int x; int y; } Punto;

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

17

Ejercicio
Utilizando la definicin que se muestra a continuacin para la estructura Punto, defina una nueva estructura para representar un Cuadrado en un plano cartesiano
typedef struct Punto { int x; int y; } Punto;

Cmo podra definir un Cuadrado SIN crear una nueva estructura?

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

18

Propuestas de Solucin
// 1. Cuadrado est formado por cuatro puntos typedef struct Cuadrado { Punto p1, p2, p3, p4; } Cuadrado;

p1

p2

p4
// 2. Definido por dos puntos esquineros diagonalmente opuestos

p3

supIzq
typedef struct Cuadrado { Punto supIzq, infDer; } Cuadrado;

infDer
Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

19

Propuestas de Solucin
// 3. Definido por un punto, una direccin hacia dnde se debe dibujar y la longitud del lado del cuadrado lado typedef enum { DERECHA_ARRIBA, DERECHA_ABAJO, IZQUIERDA_ARRIBA, IZQUIERDA_ARRIBA DERECHA_ARRIBA IZQUIERDA_ABAJO } Direccion; typedef struct Cuadrado { Punto p; int lado; Direccion dir; } Cuadrado;

p
IZQUIERDA_ABAJO DERECHA_ABAJO

Gonzalo Gabriel Mndez, M.Sc. 23/10/2013

20