You are on page 1of 19

TEMA 5 Datos estructurados 5.2.

Registros (struct) y Arrays de Registros

Antonio L. Carrillo

REGISTROS : Necesidad

! Cuando se quiere procesar un conjunto de datos de distinto tipo, se pueden crean interfaces engorrosas de manejar:
comparar_fechas(dia1,mes1,ao1, dia2,mes2,ao2); sumar_fracciones(num1,den1, num2,den2); leer_datos_persona(dni,nombre, dir, dia_nacim, mes_nacim, ao_nacim, lugar_nacim, nacionalidad);

! Si se agrupase la informacin, se obtendran interfaces ms simples y legibles:


comparar_fechas(fecha1, fecha2); sumar_fracciones(fraccion1, fraccion2); leer_datos_persona(empleado);
2

REGISTROS: Conceptos

! Un registro (o estructura) es una coleccin finita y heterognea (de distinto tipo) de uno o ms elementos ! Cada uno de esos elementos tiene asociado su propio nombre, que se denomina campo ! Cada campo puede ser de cualquier tipo definido previamente ! Ejemplo:
Campos
nmeros strings
dni nombre domicilio d_nac m_nac a_nac lugar_nac nacionalidad
3

persona

REGISTROS : Definicin de un tipo struct


! Definicin de un tipo registro:
typedef struct { Tipo1 campo1; Tipo2 campo2; ... Tipo nuevo } nombre_TipoRegistro; Los nombres deben ser distintos

Tipos ya definidos: cualesquiera

! Ejemplo de definicin de un tipo registro (TRpersona):


typedef struct { long dni; // sin la letra string nombre, domicilio; unsigned d_nac, m_nac, a_nac; string lugar_nac, nacionalidad; } TRpersona ;

REGISTROS : Declaracin de variables


! Declaracin de una variable de tipo registro:
nombre_TipoRegistro nombre_variable;
El tipo registro tiene que haber sido declarado antes

! Se puede inicializar la variable en el momento de su declaracin. Se asigna la informacin en el mismo orden en el que se declararon los campos:
TRpersona Jaimito = { 193412, Jaimito Barrientos, C/ Rue del Percebe,3, 25, 10, 1970, Mlaga, Espaola };

REGISTROS : Acceso a sus campos

! Acceso a los campos: se utiliza el operador punto (.)


Jaimito.dni
193412 Jaimito Barrientos C/ Rue del Percebe, 3 25 Madrid espaola 10 1970

Jaimito

Jaimito.a_nac

Jaimito.d_nac

Jaimito.domicilio[1]

REGISTROS : Ejemplo
/* ejemplo de declaracin de registros y acceso a los campos */ #include <iostream> using namespace std; Declaracin del tipo registro: TRcomponente typedef struct { int codigo; string nombre; float coste; } TRcomponente ;

Declaracin de una variable registro Declaracin e inicializacin de una variable registro

int main() { TRcomponente resistencia; TRcomponente condensador = {25,condensador3,0.25}; resistencia.codigo=10; resistencia.nombre = resistencia1; resistencia.coste=0.06; cout << resistencia.nombre << resistencia.codigo; cout << resistencia.coste; return 0; }

REGISTROS : Asignacin (SI) Comparacin (NO)


! Las variables de un mismo tipo registro SI se pueden ASIGNAR: typedef struct { unsigned dia, mes, anio; } TRfecha; ... TRfecha f1, f2 = {12, 10, 1492}; f1 = f2; /* equivale a: f1.dia = f2.dia; f1.mes = f2.mes; f1.anio = f2.anio; */

! Las variables de tipo registro NO se pueden COMPARAR directamente (no se pueden utilizar los operadores relacionales) if (f1 == f2) ...
8

REGISTROS en Funciones: Paso por Valor (para param. de Entrada)


! ! ! A la funcin se le pasa una COPIA de la estructura. La funcin slo puede modificar la copia y no la variable estructura original. Cuando acaba la funcin, los cambios NO se reflejan en la estructura original. void MostrarDatos( TRpersona x ) //x es param. Entrada { cout << Nombre: << x.nombre; cout << La edad es: << x.edad; } //--------------------------------------------------int main() { TRpersona p1; //suponer 2 campos: nombre,edad ... MostrarDatos(p1); /* se pasa una copia de p1 */ }
9

EJEMPLO:

Funciones que devuelven REGISTROS como Valor de Retorno


TRpersona LeerPersona() { TRpersona temp; /*variable local, tipo registro*/ cout << Nombre? ; cin >> temp.nombre; // sin espacios en blanco cout << Edad? ; cin >> temp.edad; return temp; /* devuelve el registro temp */ }
//-----------------------------------------------------

int main() { TRpersona p1; p1 = LeerPersona(); /* copia el registro devuelto por la funcin, en p1 */ MostrarDatos(p1); // Visualiza el registro p1 } 10

REGISTROS en Funciones: Paso por Referencia (para param. de Salida o E/S)


! Se pone un & detrs del nombre del tipo de la estructura en la cabecera de la funcin. ! Si vara el valor de la variable en la funcin, tambin cambia la variable que corresponda en la llamada. EJEMPLO: void LeerPersona2( TRpersona & p) { cout << Nombre? ; cin >> p.nombre; // sin espacios en blanco cout << Edad? ; cin >> p.edad; } //------------------------------------------------void main() { TRpersona p1; LeerPersona2(p1); /* la variable p1 cambia */ MostrarDatos(p1); }
11

REGISTROS: operaciones permitidas

12

REGISTROS: Anidamiento

! Las estructuras de datos estticas se pueden anidar: ! Un registro puede tener campos de cualquier tipo que haya sido definido: ! Arrays (uni y multidimensionales) ! Registros ! Cualquier otro tipo definido ! Los arrays pueden a su vez tener como tipo base a un tipo registro o cualquier tipo definido ! Pondremos ejemplos de las construcciones ms tpicas.

13

Registros con campos de tipo registro


! Para poder declarar un campo de tipo registro, dicho tipo tiene que estar definido previamente typedef struct { unsigned dia; unsigned mes; unsigned anio; } TRfecha;
typedef struct { long dni; string nombre, domicilio; TRfecha f_nac ; string lugar_nac, nacionalidad; } TRpersona;
.........

TRpersona Jaimito={193412,Jaimito Barrientos,


C/ Rue del Percebe,3,{25, 10, 1970}, Mlaga,Espaola};
14

Registros con campos de tipo registro

Jaimito.dni
193412 Jaimito Barrientos C/ Rue del Percebe, 3 25 Madrid espaola 10 1970

Jaimito

Jaimito.f_nac.anio

Jaimito.f_nac.dia

Jaimito.domicilio[1]

15

Arrays de Estructuras
! Se pueden construir arrays en los que cada elemento sea un registro (todas las casillas del mismo tipo struct): typedef struct { double real; double imag; } TRcomplejo; typedef array<TRcomplejo,10> TAcomplejos; TAcomplejos arr; /*array de 10 elementos, cada uno de tipo TRcomplejo */

! Acceso a cada campo: arr[0].real = 2.5; arr[5].imag = 3.2;


arr 0 2.5 1 2 3 4 5 3.2 6 7 8 9
16

Arrays de Estructuras: ejemplo


typedef struct { unsigned dia, mes, anio; } TRfecha; typedef struct { long dni; string nombre, domicilio; TRfecha f_nac ; string lugar_nac, nacionalidad; } TRpersona; typedef array<TRpersona,10> TAclientes; ...... TAclientes banco; /* se ha creado un array con
cada una para una persona */

10 casillas,

TRpersona director;

// y otra var. aparte (para el director)

17

Arrays de Estructuras: ejemplo

237879

banco[2].dni

Pepe Prez 819412 153317 C/ Su Casa, 25 394412 Luis 02 Ortiz 1981 13 193412 Carmen Luque Avda. Velazquez, 12 Malaga Jaimito Barrientos Plaza Constitucin, 25 09 1963 21 banco[9] espaola 3 05 del Percebe, 1975 02 C/ Rue Barcelona 10 1970 25 vila banco[2] espaola Madrid banco[1] espaola banco[0] espaola

banco[1].domicilio[0]

banco[0].f_nac.mes
18

Arrays de Estructuras: otro ejemplo


....... typedef struct { string nombre; float notaTeor, notaPrac; } TRalumno ; typedef array<TRalumno,50> TAalumnos; int main() /*Listado de aprobados y suspensos*/ { TAalumnos arr; /* array de alumnos */ int num; cout << Cuntos alumnos? ; cin >> num; ...... // (suponemos que num<=50 y que se leen los DATOS DE num ALUMNOS for(i=0; i<num; i++) cout << arr[i].nombre << (0.6*arr[i].notaTeor + 0.4*arr[i].notaPrac)<5.0? Suspenso:Aprobado; ...... 19

You might also like