tema 4 - tipos datos avanzados (i)

24
http://www.eps.uam.es/~phaya PROG-I 2009-10 MACROS Y TIPOS DE DATOS AVANZADOS Tema 4 – 4.1 y 4.2 1 2 3 4 5 1 - X 2 - 3 - - X X 4 X - - 5 X - 6 - X 7 - - -

Upload: pablo-haya

Post on 22-Jan-2018

52 views

Category:

Education


1 download

TRANSCRIPT

Page 1: Tema 4 - Tipos datos avanzados (I)

http

://w

ww

.eps

.uam

.es/

~pha

ya

PROG-I2009-10

MACROS Y TIPOS DE DATOS AVANZADOSTema 4 – 4.1 y 4.2

1 2 3 4 51 - X2 -3 - - X X4 X - -5 X -6 - X7 - - -

Page 2: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Objetivos

Semana 6

4.1 Definir macros y tipos de datos en C, y hacer uso de arrays y estructuras

Curso 2009-10Tema 4 - Macros y tipos de datos avanzados

2

Page 3: Tema 4 - Tipos datos avanzados (I)

Macros

Curso 2009-10Tema 4 - Macros y tipos de datos avanzados

3

Page 4: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Preprocesador ABC, Capítulo 8, 8.1-8.4, 8.8, 8.9 #include #define

#define SEGUNDOS 60 #define SEGUNDOS_DIA (60*60*24) #define POS(c) ((c)-'a') #define SQR(X) ((x)*(x))

Compilacion condicional #ifndef CTE

#define CTE…#endif

Macros predefinidas __DATE__, __FILE__, __LINE__, __STDC__, __TIME__

Page 5: Tema 4 - Tipos datos avanzados (I)

Arrays

Page 6: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Problema Realizar un programa lance un dado de seis caras n

veces y devuelva cuantas veces se obtiene cada cara.

for (i=1; i < n; i++){

tirada = (rand() % 6) + 1; if (tirada == 1)

cara1++; else if (tirada == 2) cara2++;

else if (tirada == 3) cara3++;

else if (tirada == 4) cara4++;

else if (tirada == 5) cara5++;

else if (tirada == 6) cara6++;}

for (i=1; i < n; i++){

tirada = (rand() % 6) + 1; switch (tirada)

{ case 1: cara1++; break;

case 2: cara2++; break;

case 3: cara3++; break;

case 4: cara4++; break;

case 5: cara5++; break;

case 6: cara6++; break;

}} Curso 2009-10 6Tema 4 - Macros y tipos de datos

avanzados

Page 7: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Arrays Estructura de datos estática que permite agrupar una colección

ordenada de valores que comparten un mismo tipo.

nombre

v1

v2

v3

v4

v5

v6

v7

v8

v9

14

Ejemplo: caras: array de 1 a 6 posiciones de números enteros caras

nombre[0]

nombre[1]nombre[2]

nombre[3]

nombre[4]

nombre[5]

nombre[6]

nombre[7]

nombre[8]

1089

1011

caras[0]caras[1]caras[2]

caras[3]caras[4]

caras

nombre del array [5]

subíndice

contenido

Curso 2009-10 7Tema 4 - Macros y tipos de datos avanzados

Page 8: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Arrays en C <tipo> <nombre>[TAMANO];

donde <TAMANO> debe ser un entero positivo. int caras [6]; /* 6 elementos */ float notas [MAXALUMNOS]; /* MAXALUMNOS elementos*/ int cuenta['z'-'a' + 1]; /* 26 elementos */

El máximo número de elemento que se puede almacenar es fijo. Los índices tiene rango desde 0..TAMANO-1

int caras[6] /* espacio para caras[0], cara[1] …cara[5] */ Inicialización

float coef[4] = {0.1, 0.2, 0.5, 0.7};/* coef[0] = 0.1 coef[1] = 0.2 coef[2] = 0.5 coef[3] = 0.7 */

float coef[] = {0.1, 0.2, 0.5, 0.7}; /* coef[0] = 0.1 coef[1] = 0.2 coef[2] = 0.5 coef[3] = 0.7 */

float coef[4] = {0.1};/* coef[0] = 0.1 coef[1] = 0 coef[2] = 0 coef[3] = 0 */

Uso typedef #define N 4

typedef float vector[N];vector coef;

Curso 2009-10 8Tema 4 - Macros y tipos de datos avanzados

Page 9: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Arrays

Curso 2009-10Tema 4 - Macros y tipos de datos avanzados

9

ee

lanzadado.c

main

int caras[6] = {14, 10, 8, 9, 10, 11};

carascaras

14 10 8 9 10 11

Page 10: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Acceder a los valores Los valores de un array se acceden mediante el nombre y la

posición (o índice) que se quiere acceder: nombre[índice]. Acceso directo (o aleatorio) Ej:

x[1] = 2; x[i] = 3; x[i-3] = y[j]; x[2] = x[5]; x[i] = rand(); x[y[i] – 2] = 5; w[OCT] = TEMP_MAX; y[i] := z['b'-'a']; z[pos('k')]++; x[i++] = y[j++]; x[++i] = 20;

El índice nunca deberá ser mayor que el límite superior ni menor que el límite inferior.

#define TEMP_MAX 25.5#define TAM_ALFA 'z'-'a'+1#define pos(c) ((c)-'a')

enum {ENE, FEB, MAR, MAY, JUN, JUL, AGO, SEP, OCT, NOV, DIC};

int main(){

int x[100] , y[100];float w[12];int z[TAM_ALFA];

Curso 2009-10 10Tema 4 - Macros y tipos de datos avanzados

Page 11: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Ejemplos básicos

Rellenar los valores de un array a un valor constante.for (i = 0; i < N; i++)

v[i] = CONSTANTE;

float v[N];

int i;

Rellenar los valores de un array leyéndolosfor (i = 0; i < N; i++)

scanf("%f", &v[i]);

Imprimir el contenidofor (i = 1; i < N; i++)

printf("%2.1f ", v[i]);

Curso 2009-10 11Tema 4 - Macros y tipos de datos avanzados

Copiar un array a otro:for (i = 0; i < N; i++)

a[i] = b[i];

Page 12: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Arrays bidimensionales

Array unidimensionales: vector Array de dos dimensiones: tabla

Columnas

Fila

s

0 10

1

23

#define NFILAS 4

#define NCOLUMNAS 2

int matriz[NFILAS][NCOLUMNAS];

En general: arrays multidimensionales int matriz[100][100][100];

Curso 2009-10 12Tema 4 - Macros y tipos de datos avanzados

Page 13: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Asignación bidimensionalColumnas

Fila

s

0 10

1

23

(0,0) (0,1)

(1,0) (1,1)

(2,0) (2,1)

(3,0) (3,1)

Columnas

Fila

s

0 10

1

23

12 3

4 23

100 10

2 3

Ej1:

#define NFILAS 4

#define NCOLUMNAS 2

int main(void)

{

int matriz[NFILAS][NCOLUMNAS]

matriz [0][0]= 12;

matriz [0][1]= 3;

matriz [1][0]= 4;

matriz [1][1]= 23;

matriz [2][0]= 100;

matriz [2][1]= 10;

matriz [3][0]= 2;

matriz [3][1]= 3;

Curso 2009-10 13Tema 4 - Macros y tipos de datos avanzados

Page 14: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Ejemplos básicos

Rellenar los valores de un array a un valor constante.for (i = 0; i < NFILAS; i++)

for (j = 0; j < NCOLUMNAS; j++)

matriz[i][j] = CONSTANTE;

int matriz[NFILAS][NCOLUMNAS];

int i, j;

Imprimir el contenido

Rellenar los valores de un array leyéndolosfor (i = 0; i < NFILAS; i++)

for (j = 0; j < NCOLUMNAS; j++)

scanf("%f", &matriz[i][j]);

for (i = 0; i < NFILAS; i++){

for (j = 0; j < NCOLUMNAS; j++)

prinf("%2.1f ",matriz[i][j]);

printf("\n");

}

Curso 2009-10 14Tema 4 - Macros y tipos de datos avanzados

Page 15: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Tipo especial de array que cumple dos propiedades tipo char incluye delimitador de fin de cadena => '\0' (carácter nulo)

char nombre[6] = "Hola\n"; char nombre[] = "Hola\n"; /* sizeof(nombre) = 6 */

H o l a \n \0nombre

0 1 2 3 4 5

Cadenas de caracteres

char nombre[TAM_MAX+1]; scanf("%s", nombre); Longitud efectiva vs. tamaño del array Funciones con cadenas

<string.h> strlen, strcpy, strncpy, strcmp, strncmp, strchr véase ABC Apéndice A, pag. 671-675

Curso 2009-10 15Tema 4 - Macros y tipos de datos avanzados

Page 16: Tema 4 - Tipos datos avanzados (I)

Registros

Page 17: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Registros Permite agrupar valores con tipos heterogéneos. Los valores de un registro se acceden por nombre, en

vez de por índice.

struct registro {tipo1 campo1;tipo2 campo2;…tipoN campoN;

} variable;

struct registro {tipo1 campo1;tipo2 campo2;…tipoN campoN;

};

typedef struct registro {tipo1 campo1;tipo2 campo2;…tipoN campoN;

} TipoDato;

struct {tipo1 campo1;tipo2 campo2;…tipoN campoN;

} variable;

Curso 2009-10 17Tema 4 - Macros y tipos de datos avanzados

Page 18: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Ejemplos#define MAX 255

struct Direccion {enum {AVENIDA,CALLE, PLAZA, TRAVESIA} via ;char nombre[MAX+1];int numero;

};

struct Fecha {int dia, mes, anio;

};

struct Persona {char nombre[MAX+1];enum {M, F} sexo;struct Fecha fnac;struct Direccion domicilio;

};

Curso 2009-10 18Tema 4 - Macros y tipos de datos avanzados

Page 19: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Ejemplos

Curso 2009-10Tema 4 - Macros y tipos de datos avanzados

19

int main(void)

{

struct direccion a;

struct fecha f;

struct persona p;

typedef enum {AVENIDA, CALLE, PLAZA, TRAVESIA} Via;

typedef struct direccion {

Via via;

char nombre[MAX_TAM+1];

unsigned short numero;

}Direccion;

int main(void)

{

Direccion a;

Fecha f;

Persona p;

Page 20: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Operaciones con registros (I)

Acceso a un campo: Asignar valor a un campo

individual

strcpy(p.nombre,"Pablo");p.sexo = M;p.fnac.dia = 23;

Tomar valores strcpy(s, p.nombre) sexo = p.sexo;d = p.fnac.dia;

Asignación r = p;

typedef struct persona char nombre[MAX_TAM+1]; Sexo sexo; Fecha fnac;

Direccion domicilio;} Persona;

int main(void){ Persona p = {"Pedro",F,{30,01,1978}, {CALLE, "Gran Via", 18 }}

Persona r; char nombre[MAX_TAM+1] s; Sexo sexo; int d;

Curso 2009-10 20Tema 4 - Macros y tipos de datos avanzados

Page 21: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Operaciones con registros (II) Inicialización de estructuras:

Persona p = {"Pedro",F, {30,01,1978}, {CALLE, "Gran Via", 18 }}

Lectura: Cada campo de manera individual scanf("%s", &p.nombre); scanf("%d%d%d", &p.fnac.dia, &p.fnac.mes, &p.fnac.ano);

Escritura: Cada campo de manera individual printf("%s", p.nombre);printf("%s", sAc(p.sexo)); printf("%d/%d/%d", p.fnac.dia, p.fnac.mes, p.fnac.ano);

nombre sexo fnac domiciliodia mes anio via nombre numero

Curso 2009-10 21Tema 4 - Macros y tipos de datos avanzados

Page 22: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Uniones

Uniones: Registros variables

Como una estructura pero todos comparten los campos comparten en el mismo espacio de memoria

union Longitud {

float metros;

double centrimetros;

long pulgadas;

};

Las uniones no se pueden inicializar en la declaración

uniones.c

ee

main

ll

Longitud l

Curso 2009-10 22Tema 4 - Macros y tipos de datos avanzados

Page 23: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Uniones y Estructuras

typedef struct {

char nombre[MAX+1];

Sexo sexo;

Fecha fnac;

Direccion domicilio;

Nacionalidad nac;

union {

unsigned dni;

char pasaporte[MAX+1];

} u;

} Persona;

Una estructura puede tener anidadas una o más uniones.

Una unión puede tener una o más estructuras.

struct mamifero {

int npatas;

};

struct ave {

int nhuevos;

};

struct pez {

enum {SALADA, DULCE} agua;

};

union Vertebrado {

unsigned peso;

struct mamifero m;

struct ave a;

struct pez p;

};

Curso 2009-10 23Tema 4 - Macros y tipos de datos avanzados

Page 24: Tema 4 - Tipos datos avanzados (I)

PROG-I (P.HAYA)

/24PROG-I (P.HAYA)

Arrays de registros

#include <string.h> enum {NALUMNOS = 100, MAX=255}; typedef struct {

char nombre[MAX+1];char apellidos[MAX+1];float nota;

} Alumno; int main(void) {

Alumno clase[NALUMNOS]; Alumno clase2[] = {{"Pablo", "Haya Coll", 9.9},

{"Pablo", "Varona", 9.9}};strcpy(clase[0].nombre, "Pablo");

strcpy(clase[0].apellidos, "Haya Coll"); clase[0].nota = 9.9;

return 0;}

Curso 2009-10 24Tema 4 - Macros y tipos de datos avanzados