Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una...

18
Informática I Código 2547100 Semestre 2013-1 Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones Profesor: Sebastián Isaza

Transcript of Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una...

Page 1: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Informática I

Código 2547100

Semestre 2013-1

Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones

Profesor: Sebastián Isaza

Page 2: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

• Imagine que el Sistema de Bibliotecas de la Universidad de Antioquia quiere adquirir un software que gestione la información asociada a cada uno de los libros de sus bibliotecas. Una primera versión del programa debería estar en capacidad de manejar el titulo, el autor, la editorial, el número de páginas, el número de ejemplares y el código de barras.

• ¿Qué tipo de variables podríamos definir para el desarrollo del programa?

• En lugar de usar 6 variables por cada libro sería mejor guardar toda esa información en una especie de “arreglo” para manipularla con un sólo nombre.

• En C, ese “arreglo” que puede tener elementos de diferentes tipos, se conoce como una estructura (struct).

Informática I (2013-1) – Prof. Sebastián Isaza 2

Structures

Page 3: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

• Una estructura en C es un objeto de datos conformado por elementos que pueden ser de un tipo de dato diferente.

• A los elementos de una estructura se les llama miembros o campos de la estructura.

• Suponga que mystruct es una variable tipo estructura que tiene tres miembros. El primer miembro (val) es una variable tipo int, el segundo miembro (coef) es un elemento tipo double y el tercer miembro (ar1) es un arreglo de 3 elementos tipo char. En memoria mystruct aparecería de esta forma:

Informática I (2013-1) – Prof. Sebastián Isaza 3

Struct

0x2348

47

0x234C

728.04812

0x2354 ‘X’

‘Y’

‘Z’

ar1[0]

ar1[1]

ar1[2]

val

coef

mystruct

Page 4: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

La plantilla de una estructura se declara así:

struct book{

char title[MAX_TIT];

char author[MAX_AUT];

int barcode;

};

La definición de una variable tipo estructura sería:

struct book mybook;

struct book anotherbook;

Informática I (2013-1) – Prof. Sebastián Isaza 4

Structure template and variable definition

struct book{

char title[MAX_TIT];

char author[MAX_AUT];

int barcode;

} mybook;

Page 5: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Una estructura se inicializa similar a un arreglo:

struct book mybook = {

“C Primer Plus”,

“Stephen Prata”,

00123783000

};

Para acceder a un miembro de la estructura se usa el operador . (punto):

int c;

c = mybook.barcode;

scanf(“%s”, mybook.title);

Informática I (2013-1) – Prof. Sebastián Isaza 5

Initialization and access to struct members

struct book{

char title[MAX_TIT];

char author[MAX_AUT];

int barcode;

};

Page 6: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Crear un arreglo de estructuras es tan simple como:

struct book mybooks[10];

mybooks[0] es una estructura, mybook[1] es otra estructura… y así sucesivamente.

Informática I (2013-1) – Prof. Sebastián Isaza 6

Arrays of structures

mybook[0].title mybook[0].author mybook[0].author

mybook[0] mybook[1] mybook[2] …

Page 7: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Una estructura también puede ser miembro de otra estructura. Supongamos que se necesita un arreglo de estructuras para almacenar la lista de nombres completos de este curso, junto con su nota final.

struct fname{

char firstname[20];

char familyname[30];

};

struct student{

struct fname name;

float grade;

};

struct student stdl[39];

printf(“%s”, stdl[23].name.familyname);

Informática I (2013-1) – Prof. Sebastián Isaza 7

Nested structures

Page 8: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Un apuntador a una estructura se declararía así:

struct book{

char title[MAX_TIT];

char author[MAX_AUT];

int barcode;

};

struct book *ptrb;

struct book bookarr[10];

ptrb = bookarr;

Informática I (2013-1) – Prof. Sebastián Isaza 8

Pointers to structures

struct book{

char title[MAX_TIT];

char author[MAX_AUT];

int barcode;

};

struct book *ptrb;

ptrb = malloc(10*sizeof(book));

Page 9: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Para acceder a un miembro de la estructura a través del apuntador se usa el operador -> así: struct book{

char title[MAX_TIT];

char author[MAX_AUT];

int barcode;

};

struct book *ptrb;

struct book bookarr[10];

ptrb = bookarr;

for(int i=0;i<10;i++){

printf(“%s %d\n”, bookarr[i].title, bookarr[i].barcode);

printf(“%s %d\n”, (ptrb++)->title, (ptrb++)->barcode);

}

Informática I (2013-1) – Prof. Sebastián Isaza 9

Structure pointer access

Page 10: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Existen tres maneras de pasar estructuras como argumentos de una función:

• Por valor

• Por referencia

• Por miembros

Informática I (2013-1) – Prof. Sebastián Isaza 10

Passing structures to functions

struct book mybook;

func(mybook);

struct book mybook;

func(&mybook);

struct book *ptrb = mybook;

func(ptrb);

struct book mybook;

func(mybook.barcode);

func(&mybook.barcode);

Page 11: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Una unión es un tipo que permite almacenar diferentes tipos de datos en un mismo espacio de memoria.

union hold{

int digit;

double bigfl;

char letter;

};

union hold fit;

fit.digit = 17;

fit.bigfl = 3.1;

fit.letter = ‘G’;

Informática I (2013-1) – Prof. Sebastián Isaza 11

union

Page 12: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

• La palabra clave typedef es usada para crear un nombre propio para un tipo de dato.

• Suponga que usted desea usar el término BYTE para números de un sólo byte...¿Cómo lo hacemos?

typedef unsigned char BYTE;

• Ahora usted puede usar la palabra BYTE para definir variables:

BYTE x, y[10], * z;

• ¿Para qué darle un nuevo nombre a un tipo de dato existente? → legibilidad del código.

Informática I (2013-1) – Prof. Sebastián Isaza 12

typedef

Page 13: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Podemos usar typedef con estructuras, por ejemplo:

typedef struct {

float real;

float imag;

}COMPLEX;

COMPLEX mycmp;

Informática I (2013-1) – Prof. Sebastián Isaza 13

typedef

struct complex{

float real;

float imag;

};

struct complex mycmp;

Page 14: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Suponga que deseamos escribir un programa que le permita al administrador de una tienda registrar uno por uno los productos de una tienda. No sabemos con anticipación cuántos productos son. Una primera versión sería:

struct item{char name[20]; int price;};

struct item * ptrItem;

int numprod = 5;

ptrItem = (item *)malloc(numprod * sizeof(struct item));

ptrItem[0].price = 1000;

ptrItem->price = 1000;

¿Qué limitación tiene este programa? → El numero de productos queda fijo una vez definido.

Informática I (2013-1) – Prof. Sebastián Isaza 14

Motivating linked lists

Page 15: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Una mejor opción: crear dinámicamente cada estructura a medida que se necesita.

– Pero necesitamos entonces un arreglo estático de apuntadores que apunte a cada estructura dinámicamente creada.

struct item{char name[20]; int price;};

struct item * ptrarr[100];

for(int i=0;i<5;i++)

ptrarr[i] = (struct item *)malloc(sizeof(struct item);

• ¿Qué problemas tienen los enfoques anteriores? → desperdicio de memoria o necesidad de saber con anticipación el número de productos • ¿Hay una mejor opción? → Listas enlazadas

Informática I (2013-1) – Prof. Sebastián Isaza 15

Motivating linked lists

Item[2] Item[0] Item[3]

Item[1] Item[4]

Page 16: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Una lista enlazada es una lista de estructuras o nodos que se enlazan entre sí a través de un apuntador que apunta al siguiente nodo. struct item{

char name[20];

int price;

item * next;

};

• Observe que el último miembro de la estructura es un apuntador a una estructura de su mismo tipo. Es esa la base para construir una lista enlazada.

• La idea es que ese apuntador apunte otra estructura de la misma plantilla.

• ¿Y quién apunta a la primera estructura creada?

Informática I (2013-1) – Prof. Sebastián Isaza 16

Linked lists

Page 17: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

• Suponga que el usuario ingresa por primera vez al programa y escribe “rice” como nombre del producto y 1.900 como precio.

• Suponga que cabeza es un apuntador a estructura tipo item y que es inicializado con la dirección de la primera estructura creada.

Informática I (2013-1) – Prof. Sebastián Isaza 17

Linked lists

“rice” 1900 NULL 0x2358

head name price next

0x2358

Page 18: Informática I - USFX · Crear un arreglo de estructuras es tan simple como: ... • ¿Hay una mejor opción? → Listas enlazadas Informática I (2013-1) – Prof. Sebastián Isaza

Si el usuario sigue ingresando ítems, nuevas estructuras se seguirán creando dinámicamente y cada apuntador que retorne malloc() será guardado en el miembro next de la última estructura creada.

Informática I (2013-1) – Prof. Sebastián Isaza 18

Linked lists

“rice” 1900 0x4F34 0x2358

head name price next

0x2358

“rice” 1900 0x17FA

name price next

0x4F34

“rice” 1900 NULL

name price next

0x17FA