Descarga la aplicación para disfrutar aún más
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; }
Compartir