Este documento presenta información sobre macros y tipos de datos avanzados en C, incluyendo definiciones de macros, arrays unidimensionales y bidimensionales, cadenas, registros, uniones y arrays de registros. Explica cómo declarar y utilizar estas estructuras de datos avanzadas para organizar y almacenar información de manera flexible y eficiente.
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
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. 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. 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
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. 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. 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
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. 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
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. 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. 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. 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. 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. 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. 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