tema 4 - tipos datos avanzados (i)
TRANSCRIPT
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 - - -
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
Macros
Curso 2009-10Tema 4 - Macros y tipos de datos avanzados
3
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__
Arrays
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
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
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
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
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
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];
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
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
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
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
Registros
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
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
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;
…
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
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
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
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
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