Documente Academic
Documente Profesional
Documente Cultură
Pgina 131
SESIN N 24:
Estructuras en C/C++
I
OBJETIVOS
II
TEMAS A TRATAR
Introduccin.
Operaciones complejas en registros y archivos directos
Resumen.
III
MARCO TEORICO
1.
INTRODUCCIN
Lenguaje C proporciona formas diferentes de creacin de tipos de datos propios. Uno de
ellos es la agrupacin de variables bajo un mismo nombre, Otra es permitir que la misma
parte de memoria sea definida como dos o ms tipos diferentes de variables y tambin
crear una lista de constantes entera con nombre.
Existen circunstancias en que son especialmente importantes y tiles las estructuras,
cuando se trata de almacenar y recuperar registros de datos en medios externos (disco
por ejemplo). En estos casos, las estructuras son especialmente idneas para escribir y
recuperar toda la informacin contenida en ellas en una sola operacin de
lectura/escritura.
Las estructuras son tipos nuevos definidos por el usuario (nuevos en el sentido de que no
estn predefinidos en el lenguaje), se engloban dentro de la categora general de tipos
derivados. Representan conjuntos de miembros que pueden ser a su vez de tipo bsico o
derivado con ciertas; adems tambin pueden ser miembros los campos de bits.
En otros lenguajes se les denomina registros (records); sus componentes se denominan
"miembros", aunque en ocasiones tambin se suelen llamar "campos".
2.
ESTRUCTURAS
Una estructura es una coleccin de variables que se referencia bajo un nico nombre,
proporcionando un medio eficaz de mantener junta una informacin relacionada. Las
Sesin N 24
Laboratorio de Programacin I
Pgina 132
struct nombre{
var1;
var2;
varN;
}etiqueta1,etiquetaN;
Sesin N 24
Laboratorio de Programacin I
Pgina 133
}
Un miembro de la estructura no puede ser la estructura que se declara porque dara lugar
a una declaracin circular (lo definido est dentro de su definicin). Ejemplo:
struct mystr { mystr s };
// Ilegal
Si es posible que uno de los miembros sea un puntero a la estructura que se est
declarando como en el ejemplo:
struct mystr { mystr *ps }
// Ok: Correcto
Tambin es posible que los miembros de una estructura sean a su vez estructuras
previamente definidas, dando lugar a estructuras anidadas. Ejemplo:
struct Punto{
int x;
};
int y;
struct Cuadro{
struct Punto p1;
struct Punto p2;
} c1;
Se declara Cuadro como un tipo struct con dos miembros, cada uno de los cuales es un
tipo struct Punto.
Es importante tener en cuenta que, en este punto, solo est permitido sealar tipo y
nombre de los miembros, sin que se pueda efectuar ninguna asignacin; ni an en el caso
de que se trate de una constante. Por ejemplo, las definiciones que siguen seran ilegales,
pues todas implican una asignacin en la definicin del segundo miembro:
struct
struct
struct
struct
struct
struct
3.
Str
Str
Str
Str
Str
Str
{int
{int
{int
{int
{int
{int
x;
x;
x;
x;
x;
x;
int y = 2; };
const int y = 3; };
char c = 'X'; };
char * st = "Hola"; };
"Hola"; };
int a[2] = {3, 4};};
INICIALIZACIN DE ESTRUCTURAS
Las estructuras pueden inicializarse al igual que las matrices incluso en el mismo punto de
su declaracin, con una lista de iniciadores entre llaves { } separados por comas, uno para
cada miembro de la estructura. Ejemplo:
struct Cliente {
int i;
char str[20];
double d;
} s = { 33, "Pepe Lopez", 3.14 };
Aqu se declara una estructura Cliente compuesta por un entero, un array de 20
caracteres y un doble; inicia una estructura s como perteneciente al tipo Cliente con
valores concretos en cada campo.
En estructuras o uniones con duracin automtica, el inicializador debe ser alguno de los
siguientes:
Sesin N 24
Laboratorio de Programacin I
Pgina 134
Una sola expresin con una estructura de tipo compatible. En este caso, el valor
inicial del objeto es el de la expresin. Ejemplo:
struct punto p2 = p1;
4.
ESPACIO DE ALMACENAMIENTO
A continuacin se expone un ejemplo de estructura con una composicin de miembros
variada. En el comentario de cada lnea se indica el espacio de almacenamiento necesario
(en bytes) segn las especificaciones declaradas para el compilador utilizado:
struct general {
int x;
// L2.
char ch;
// L3.
double db;
// L4.
char * sg;
// L5.
char nom[30];
// L6.
char * dir[];
// L7.
} str;
// L8.
printf("M1:%3.0d\n", sizeof(str.x));
printf("M2:%3.0d\n", sizeof(str.ch));
printf("M3:%3.0d\n", sizeof(str.db));
printf("M4:%3.0d\n", sizeof(str.sg));
printf("M5:%3.0d\n", sizeof(str.nom));
printf("M6:%3.0d\n", sizeof(str.dir[0]));
printf("Total:%3.0d\n", sizeof(str));
4 bytes
1 byte
8 bytes
4 bytes
30 bytes
4 bytes
//
//
//
//
//
//
//
L9.
L10.
L11.
L12.
L13.
L14.
L15.
M1: 4
M2: 1
M3: 8
M4: 4
M5: 30
M6: 4
Total: 56
Sesin N 24
Laboratorio de Programacin I
Pgina 135
5.
A.
// Error!!
La asignacin anterior no est permitida. Sin embargo, puesto que se trata de clases
puede construirse una estructura que contenga exactamente los mismos elementos que
otra anterior derivndola por herencia:
struct StrB : StrA {};
Sin embargo, recordemos que en este caso ambas estructuras son tipos distintos, por lo
que ms tarde no pueden efectuarse asignaciones del tipo:
StrA Sa;
StrB Sb = Sa;
B.
OBTENER SU DIRECCIN
Ejemplo:
struct StrA sa;
Sesin N 24
Laboratorio de Programacin I
Pgina 136
C.
ACCESO A MIEMBROS
Se dispone de dos operadores para referenciar a los miembros de estructuras y uniones
(operadores de seleccin):
estructura sT. ( la expresin es un Lvalue siempre que sT no lo sea y obj no sea una
matriz).
Selector indirecto: Una expresin del tipo stPt -> obj representa el objeto obj de la
estructura sT siempre que stPt sea un puntero a dicha estructura (la expresin es un
Lvalue siempre que obj no sea una matriz).
preferible a (*stPt).obj.
El uso de uno u otro es indiferente, depende de que se tenga un identificador de la
estructura, en cuyo caso puede usarse el selector directo (expresin sT.obj ), o un
puntero, en cuyo caso puede usarse el indirecto (expresin: stPt->obj ). Ejemplo:
struct Str {
// declara estructura Str
int i;
char a;
} s, *sptr = &s;
// declara s tipo Str; sptr puntero a s
...
s.i = 3;
// asigna 3 al miembro i de s
sptr -> a = 'B';
// asigna 'B' al miembro a s
6.
RESUMEN
Los archivos de acceso aleatorio al ser ms verstiles, permiten acceder a cualquier parte
del archivo en cualquier momento, como si fueran arrays en memoria. Las operaciones de
lectura y/o escritura pueden hacerse en cualquier punto del archivo de forma directa con
las funciones asociadas a este tipo de archivos.
Los archivos de acceso directo tiene como los de acceso secuencial las mismas
operaciones complejas, pero la diferencia es la capacidad que poseen estos archivos de
saltar al registro respectivo para hacer sus operaciones, esto hace que el tipo de gestin
sea mucho ms rpido a la hora de hacer el procesamiento, para ello posee un
mecanismo que nos permite apuntar al registro deseado.
IV
(La prctica tiene una duracin de 2 horas)
1.
2.
3.
4.
5.
6.
ACTIVIDADES
Sesin N 24
Laboratorio de Programacin I
7.
Pgina 137
Al finalizar la prctica de be guardar todos sus archivos, ya sea en su memoria USB o por
correo electrnico y luego eliminar los archivos del equipo y vaciar la papelera de
reciclaje.
V
EJERCICIOS
1.
2.
3.
Crear una aplicacin que nos permita gestionar toda la informacin que se puede
almacenar sobre un alumno en la universidad en una variable tipo Struct, con las
consistencias de ingreso de datos del caso.
Modifique el programa anterior agregando una funcionalidad que nos permita ver la
cantidad de memoria utilizada por cada dato miembro y la estructura en su conjunto.
Agregar al programa ms variables tipo Struct para almacenar los datos de ms alumnos.
VI
CUESTIONARIO
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
VII
BIBLIOGRAFIA Y REFERENCIAS
Deitel, Paul J., Deitel, Harvey M., "Cmo Programar en C++", 6ta Edicin, Ed. Pearson
Educacin, Mxico 2009.
Ceballos Sierra, Francisco J., "Curso de Programacin C++. Programacin Orientada a
Objetos"; MADRID, RA-MA, 1991.
Kernighan, Brian W., Ritchie, Dennis M., "El Lenguaje de Programacin C", 2da Edicin, Ed.
Prentice Hispanoamrica S. A., Mxico 1991.
Sesin N 24