Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Tema 4 - Tipos datos avanzados (I)

167 views

Published on

Tema 4 - Tipos datos avanzados (I)

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

Published in: Education
  • Be the first to comment

  • Be the first to like this

Tema 4 - Tipos datos avanzados (I)

  1. 1. 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 - - -
  2. 2. PROG-I /24PROG-I 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 2
  3. 3. Macros Curso 2009-10Tema 4 - Macros y tipos de datos 3
  4. 4. PROG-I /24PROG-I 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__
  5. 5. Arrays
  6. 6. PROG-I /24PROG-I 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
  7. 7. PROG-I /24PROG-I 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] 10 8 9 10 11 caras[0] caras[1] caras[2] caras[3] caras[4] cara s nombre del array [5] subíndice contenido Curso 2009-10 7Tema 4 - Macros y tipos de datos
  8. 8. PROG-I /24PROG-I 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
  9. 9. PROG-I /24PROG-I Arrays Curso 2009-10Tema 4 - Macros y tipos de datos 9 ee lanzadado.c main int caras[6] = {14, 10, 8, 9, 10, 11}; carascaras 14 10 8 9 10 11
  10. 10. PROG-I /24PROG-I 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
  11. 11. PROG-I /24PROG-I 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éndolos for (i = 0; i < N; i++) scanf("%f", &v[i]);  Imprimir el contenido for (i = 1; i < N; i++) printf("%2.1f ", v[i]); Curso 2009-10 11Tema 4 - Macros y tipos de datos  Copiar un array a otro: for (i = 0; i < N; i++) a[i] = b[i];
  12. 12. PROG-I /24PROG-I Arrays bidimensionales  Array unidimensionales: vector  Array de dos dimensiones: tabla Columnas Filas 0 1 0 1 2 3 #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
  13. 13. PROG-I /24PROG-I Asignación bidimensional Columnas Filas 0 1 0 1 2 3 (0,0) (0,1) (1,0) (1,1) (2,0) (2,1) (3,0) (3,1) Columnas Filas 0 1 0 1 2 3 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
  14. 14. PROG-I /24PROG-I 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éndolos for (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
  15. 15. PROG-I /24PROG-I  Tipo especial de array que cumple dos propiedades  tipo char  incluye delimitador de fin de cadena => '0' (carácter nulo)  char nombre[6] = "Holan";  char nombre[] = "Holan"; /* 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
  16. 16. Registros
  17. 17. PROG-I /24PROG-I 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
  18. 18. PROG-I /24PROG-I 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
  19. 19. PROG-I /24PROG-I Ejemplos Curso 2009-10Tema 4 - Macros y tipos de datos 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; …
  20. 20. PROG-I /24PROG-I 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
  21. 21. PROG-I /24PROG-I 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 domicilio dia mes anio via nombre numero Curso 2009-10 21Tema 4 - Macros y tipos de datos
  22. 22. PROG-I /24PROG-I 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
  23. 23. PROG-I /24PROG-I 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
  24. 24. PROG-I /24PROG-I 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

×