Logo Studenta

Clase C - Estructuras

¡Este material tiene más páginas!

Vista previa del material en texto

Informática I
Departamento de Ingeniería Electrónica
Estructuras
Ing. Ezequiel Gorandi
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Ejercicio disparador
Un sistema almacenará los datos correspondientes a 60 personas (como 
máximo). Para cada persona, se deberá ingresar: DNI, teléfono y sexo.
El ingreso de datos finaliza al ingresarse una persona de DNI igual a 0.
a) Implementar la función ingresar, que permita el ingreso de datos. 
Implementar la función imprimir, para mostrar todos los datos ingresados.
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Estructuras y vectores múltiples
Utilizando vectores múltiples apareados:
33222111
34555222
23999888
12777444
11352126
11789652
11223344
11776655
‘M’
‘X’
‘F’
‘F’
dni telefono sexo
Persona
0
1
i
N-1
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Necesidad
Generar estructuras de datos compuestos (es decir, conformados por varios 
tipos de datos primitivos).
Ejemplo: Una estructura de datos “Persona”, compuesta por:
• Un dni
• Un teléfono
• Un sexo
Necesidad: Ejemplos
dni (int)
teléfono (long)
sexo (char)
Persona
Estas estructuras podrían crecer en complejidad…
dni (int)
teléfono (long)
sexo (char)
Persona
Carrera
Curso Informática I
legajo (int)
promedio (float)
persona (Persona)
Alumno
dni (int)
teléfono (long)
sexo (char)
Persona
id (int)
alumnos[] (Alumno)
Carrera
Curso Informática I
legajo (int)
promedio (float)
persona (Persona)
Alumno
Estas estructuras podrían crecer en complejidad…
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Estructura: Definición
Una estructura es un tipo de dato que hace referencia a una colección de
variables referenciadas bajo un único nombre
//Declaración del tipo de una estructura
struct persona_s
{
int dni;
long telefono;
char sexo;
};
dni (int)
teléfono (long)
sexo (char)
Persona
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Estructura: Tipo y variable
El tipo es la definición del dato compuesto:
• Se puede definir de forma global o local
• No tiene existencia en el espacio de memoria.
La variable es la instanciación del tipo:
• Se puede definir de forma global o local
• Tiene existencia en memoria.
• Se pueden instanciar una o más variables del tipo definido, vectores,
matrices, etc.
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Sintaxis: Tipo global, variable local
//Declaración del tipo (de forma global)
struct persona_s
{
int dni;
long telefono;
char sexo;
};
//Declaración de la variable (de forma local)
int main (void)
{
struct persona_s persona_1, persona_2; 
//persona_1 y persona_2 son variables de tipo struct persona_s
}
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Sintaxis: Tipo global, variable local
//Declaración del tipo (de forma global)
struct persona_s
{
int dni;
long telefono;
char sexo;
};
//Declaración de la variable (de forma local)
int main (void)
{
struct persona_s persona_1, persona_2; 
//persona_1 y persona_2 son variables de tipo struct persona_s
}
NO reserva espacio en memoria
RESERVA espacio en memoria
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Sintaxis: Tipo local, variable local
int main (void)
{
struct persona_s
{
int dni;
long telefono;
char sexo;
};
struct persona_s persona_1, persona_2;
}
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Sintaxis: Tipo local, variable local
//Lo anterior es equivalente a hacer:
int main (void)
{
struct persona_s
{
int dni;
long telefono;
char sexo;
} persona_1, persona_2;
}
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Sintaxis: Declaración de estructura sin tipo
int main (void)
{
struct{
char nombre[30];
long telefono;
char sexo;
} persona_1, persona_2;
//persona_1 y persona_2 son variables 
}
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Campos
//Declaración de una estructura
struct persona_s
{
int dni;
int telefono;
char sexo;
};
dni (int)
telefono (long)
sexo (char)
Persona
Cada uno de los tipos internos (dni, 
telefono, sexo) se denominan “campos” 
(fields) o “miembros” (members) de la 
estructura 
dni (int)
telefono (long)
sexo (char)
struct persona_s
dni (int)
telefono (long)
sexo (char)
persona
persona.dni
persona.telefono
persona.sexo
struct persona_s
{
int dni;
long telefono;
char sexo;
};
int main (void)
{
struct persona_s persona ;
…
}
Acceso a Campos
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Campos: Acceso
//Declaración del tipo (de forma global)
struct persona_s
{
int dni;
long telefono;
char sexo;
};
//Declaración de la variable (de forma local)
int main (void)
{
//persona es una variable de tipo struct persona_s
struct persona_s persona; 
persona.dni = 33666111;
persona.teléfono = 1144332211;
persona.sexo=‘M’;
}
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Campos: Acceso
//Declaración del tipo (de forma global)
struct persona_s
{
int dni;
long telefono;
char sexo;
};
//Declaración de la variable (de forma local)
int main (void)
{
//persona es una variable de tipo struct persona_s
struct persona_s persona; 
persona.dni = 33666111;
persona.teléfono = 1144332211;
persona.sexo=‘M’;
}
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Operadores
struct persona_s
{
int dni;
long telefono;
char sexo;
}persona_1, persona_2;
Asignación:
persona_1 = persona_2;
Comparación entre estructuras :
if ( persona_1 == persona_2 )
Comparación entre campos :
if ( persona_1.dni == persona_2.dni )
Tomar la dirección de memoria:
struct persona_s *persona_ptr ;
persona_ptr = &persona_2 ;
struct persona_s
{
int dni = 33554422;
long teléfono = 11554466;
char sexo = ‘F’;
}persona_1, persona_2;
Inicializar valores al declarar el tipo de datos:
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
El uso de estructuras nos permite 
presidir del uso de vectores 
múltiples apareados…
Informática I – Ingeniería Electrónica
Ing. Ezequiel Gorandi
Estructuras vs Vectores múltiples
Utilizando vectores múltiples apareados:
33222111
34555222
23999888
12777444
11352126
11789652
11223344
11776655
‘M’
‘X’
‘F’
‘F’
dni telefono sexo
Una fila equivale a
una estructura ya
que referencia
datos del mismo
“objeto”
0
1
i
N-1
Estructuras y vectores múltiples
33222111
11352126
‘M’
34555222
11789652
‘X’
12777444
11776655
‘F’
23999888
11223344
‘F’
0
1
i
N-1
Utilizando
estructuras:
//Enfoque con vectores múltiples
#define CANT 10
int main (void)
{
int dni[CANT];
long telefono[CANT];
char sexo[CANT];
int i;
//Carga de datos
for (i=0;i<CANT;i++)
{
scanf(“%d”,&dni[i]);
scanf(“%ld”,&telefono[i]);
scanf(“%c”,&sexo[i]);
}
//. . .
}
//Enfoque con estructuras
#define CANT 10
struct persona_s //Declaro el tipo
{
int dni;
long telefono;
char sexo;
};
int main (void)
{
//Declaro una variable persona_s
struct persona _s persona[CANT];
int i;
//Carga de datos
for (i=0;i<CANT;i++)
{
scanf(“%d”,&persona[i].dni);
scanf(“%ld”,&persona[i].telefono);
scanf(“%c”,&persona[i].sexo); 
}
}
Estructuras y Funciones
Una variable de tipo estructura puede pasar a función por valor o por referencia:
struct persona_s //Declaro el tipo
{
int dni;
long telefono;
char sexo;
};
int main (void)
{
//Declaro una variable persona_s
struct persona_s persona;
//Pasaje por referencia
ingresar (&persona);
//Pasaje por valor
imprimir (persona);
}
void ingresar(struct *persona_s persona)
{
//...
}
void imprimir(struct persona_s persona)
{
//...
}
Estructuras y Funciones
Una variable de tipo estructura puede pasar a función por valor o por referencia:
struct persona_s //Declaro el tipo
{
int dni;
long telefono;
char sexo;
};
int main (void)
{
//Declaro una variable persona_s
struct persona_s persona;
//Pasaje por referenciaingresar (&persona);
//Pasaje por valor
imprimir (persona);
}
void ingresar(struct *persona_s persona)
{
scanf(“%d”,&persona->dni);
scanf(“%ld”,&persona->telefono);
scanf(“%c”,&persona->sexo); 
}
void imprimir(struct persona_s persona)
{
//...
}
Cuando trabajamos con punteros a estructuras, el acceso a 
los campos se realiza con el operador flecha ->.
De manera que
persona->dni es equivalente a (*persona).dni
Estructuras y Funciones
Una variable de tipo estructura puede pasar a función por valor o por referencia:
struct persona_s //Declaro el tipo
{
int dni;
long telefono;
char sexo;
};
int main (void)
{
//Declaro una variable persona_s
struct persona_s persona;
//Pasaje por referencia
ingresar (&persona);
//Pasaje por valor
imprimir (persona);
}
void ingresar(struct *persona_s persona)
{
scanf(“%d”,&persona->dni);
scanf(“%ld”,&persona->telefono);
scanf(“%c”,&persona->sexo); 
}
void imprimir(struct persona_s persona)
{
printf(“%d”,persona.dni);
scanf(“%ld”,persona.telefono);
scanf(“%c”,persona.sexo); 
}
Ejercicio
Un sistema almacenará los datos correspondientes a 60 personas (como 
máximo). Para cada persona, se deberá ingresar: DNI, teléfono y sexo.
El ingreso de datos finaliza al ingresarse una persona de DNI igual a 0.
a) Implementar la función ingresar, que permita el ingreso de datos. 
Implementar la función imprimir, para mostrar todos los datos ingresados.
b) Implementar un menú que permita imprimir las personas ingresadas, 
ordenándolas según DNI o teléfono.
c) Modificar el punto b para que al imprimir, agrupe las personas según su 
sexo (puede haber mas de 2).
Typedef
Es una palabra reservada de C que sirve para establecer un nombre alternativo
para tipos de datos existentes
Sintaxis:
typedef tipo Nuevo_nombre
Ejemplos:
typedef int Nota_t
typedef float Temp
Typedef: Aplicaciones
Se puede usar para renombrar los tipos de datos utilizados haciendo que:
• El programa sea más legible
• Independizar los tipos de datos utilizados de los tipos de dato base
typedef float Temp_t
int main (void)
{
Temp_t temperatura[100], aux;
//float no me indica para que se usa la variable
//temp_t si -> me sugiere que guarda una temperatura
}
Typedef: Uso con estructuras
typedef struct persona_s
{
int dni;
long telefono;
char sexo;
} Persona_t;
int main (void)
{
Persona_t persona[100], aux;
}

Otros materiales