Sunteți pe pagina 1din 7

Laboratorio de Programacin I

Pgina 131

UNIVERSIDAD CATLICA DE SANTA MARA


PROGRAMA PROFESIONAL DE INGENIERA DE SISTEMAS

SESIN N 24:

Estructuras en C/C++
I
OBJETIVOS

Comprender los conceptos de variables tipo struct y su implementacin dentro de


programas.
Aplicar variables tipo struct en la solucin de problemas de gestin de datos.
Valorar las ventajas y capacidades que proporcionan las variables tipo struct.

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

Mgter. ngel Montesinos Murillo, Mgter. Manuel Ziga Carnero

Sesin N 24

Laboratorio de Programacin I

Pgina 132

variables que componen la estructura se llaman miembros de la estructura y est


relacionado lgicamente con los otros. Otra caracterstica es el ahorro de memoria y evitar
declarar variables que tcnicamente realizan las mismas funciones.
struct nombre{
var1;
var2;
varN;
};
.
.
.
.
struct nombre etiqueta1,etiquetaN;

struct nombre{
var1;
var2;
varN;
}etiqueta1,etiquetaN;

Los miembros individuales de la estructura se referencian utilizando la etiqueta de la


estructura el operador punto(.) y la variable a la que se hace referencia. Los miembros de
la estructura deben ser inicializados fuera de ella, si se hace en el interior da error de
compilacin.
etiqueta.variable;
Ejemplo:
#include <stdio.h>
void main (void)
{
int opcion=0;
struct ficha{
char nombre[40];
char apellido[50];
unsigned edad;
}emplead,usuario;
do
{
clrscr();
gotoxy(2,4);printf("1.empleados");
gotoxy(2,5);printf("2.usuarios");
gotoxy(2,6);printf("0.visualizar");
gotoxy(2,7);scanf("%d",&opcion);
if (opcion==0)
break;
if(opcion==1)
{
gotoxy(2,10);printf("Nombre: ");
gets(emplead.nombre);
gotoxy(2,11);printf("Apellido: ");
gets(emplead.apellido);
gotoxy(2,12);printf("Edad: ");
scanf("%d",&emplead.edad);
}
else
{
gotoxy(2,10);printf("Nombre: ");
gets(usuario.nombre);
gotoxy(2,11);printf("Apellido: ");
gets(usuario.apellido);
gotoxy(2,12);printf("Edad: ");
scanf("%d",&usuario.edad);
}
}while(opcion!=0);
gotoxy(2,18);
printf("%s %s\n",emplead.nombre,emplead.apellido);
gotoxy(2,19);printf("%u aos",emplead.edad);
gotoxy(30,18);
printf("%s %s\n",usuario.nombre,usuario.apellido);
gotoxy(30,19);printf("%u aos",usuario.edad);
getch();
Mgter. ngel Montesinos Murillo, Mgter. Manuel Ziga Carnero

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:

Mgter. ngel Montesinos Murillo, Mgter. Manuel Ziga Carnero

Sesin N 24

Laboratorio de Programacin I

Pgina 134

Una lista de inicializadores constantes (tambin se permiten expresiones con sizeof).


Ejemplo:
struct punto {int x; int y;} p1 = {1, 2};

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;

En este caso (suponiendo los valores anteriores) sera: p2.x == 1 y p2.y == 2


Los miembros complejos de listas de iniciadores, como matrices, pueden inicializarse con
expresiones adecuadas incluidas en bloques de llaves anidados. Ejemplo:
struct Pesadas {
int tiket;
int pesos[5];
} s = { 150, {10, 45, 0, 78, 20}};
Si la lista de inicializadores contenidos entre las llaves { } es menor que los miembros de
la estructura, el resto de los miembros es inicializado implcitamente siguiendo las mismas
reglas que los objetos con duracin esttica.

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

Las lneas 2, 3 y 4 no requieren comentario; L5 define un puntero a carcter, ocupar 4


bytes en un compilador de 32 bits. L6 define una matriz de 30 caracteres, por lo que se
reserva espacio para otros tantos; finalmente, L7 define un puntero a matriz de caracteres;
este miembro ocupa un espacio de 4 bytes en la estructura, aunque la matriz a la que
apunta (exterior a la propia estructura) sea de tamao indefinido.
Las lneas 9 a 14 son simplemente una confirmacin de que las suposiciones tericas son
correctas, como efectivamente se comprueba. La lnea 15 es una comprobacin del
tamao total de la estructura, con el sorprendente resultado que se indica.
La razn de la discrepancia hay que buscarla en el hecho de que, por razones de
eficiencia (por ejemplo de velocidad de acceso a memoria), el compilador, que asigna
espacio de memoria en mltiplos de un cierto nmero determinado de bits (8 en este
caso), intenta no utilizar fracciones de palabra, con lo que realiza determinados redondeos
o alineaciones internas. En este caso, la suma terica: 51 x 8 = 408 bits habra supuesto
el uso de 12.75 palabras de 32 bits, por lo que el compilador redondea a 14 palabras; 56 x
8 = 448 bits, 14 palabras. Hay que recordar que, aunque existan 5 bytes perdidos (no

Mgter. ngel Montesinos Murillo, Mgter. Manuel Ziga Carnero

Sesin N 24

Laboratorio de Programacin I

Pgina 135

utilizados), el almacenamiento ocupado por la estructura str sigue siendo contiguo y el


acceso a sus miembros totalmente transparente para el programador; del mismo modo, si
ms tarde se declara una matriz de estructuras de tipo general y se utilizan punteros, el
compilador tiene automticamente en cuenta el verdadero tamao ocupado por cada
elemento, a fin de efectuar correctamente los desplazamientos pertinentes.
Como puede verse, en trminos de tamao de la estructura, las estrategias representadas
por la lneas 6 y 7 varan grandemente; la adopcin de una u otra depende del contexto de
cada caso. Tngase en cuenta por ejemplo, que si se guardase en disco el contenido de
la estructura, una recuperacin posterior garantizara el contenido original para el
elemento str.nom, sin embargo, los punteros str.sg y str.dir quizs podran apuntar a
zonas de memoria totalmente errneas.

5.

OPERACIONES PERMITIDAS CON ESTRUCTURAS


La nicas operaciones con estructuras que se permiten en C++ son las que se indican:

A.

ASIGNARLAS O RECIBIR ASIGNACIN COMO ENTIDAD


NICA.
En estos casos, origen y destino de la asignacin tiene que ser del mismo tipo, aunque si
no lo son, todava es posible la asignacin miembro a miembro. Ejemplo:
struct A {
int i,j;
} a, a1;
struct B {
int i,j;
} b;
a = a1; //OK: mismo tipo, se realiza asignacin miembro a miembro
a = b;
// ILEGAL: tipos diferentes
a.i = b.i; a.j = b.j; // Ok: asignacin por miembros uno a uno
Observe que la asignacin anterior se refiere a instancias de estructuras, no a las clases
en s. Es decir:
struct StrA { ... };
stuct StrB = StrA;

// 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.

// Error. Tipos distintos!!

OBTENER SU DIRECCIN
Ejemplo:
struct StrA sa;

Mgter. ngel Montesinos Murillo, Mgter. Manuel Ziga Carnero

Sesin N 24

Laboratorio de Programacin I

Pgina 136

struct StrA* sptr;


sptr = &sa;

C.

ACCESO A MIEMBROS
Se dispone de dos operadores para referenciar a los miembros de estructuras y uniones
(operadores de seleccin):

Selector directo: Una expresin del tipo

sT.obj representa el objeto obj de la

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).

Esta expresin es equivalente, y

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

Encender el equipo de cmputo, si existe algn desperfecto o faltante en el equipo


comunicarlo inmediatamente.
Al aparecer la solicitud de contrasea hacer clic en el botn Cancelar o ingresar el nombre
de cuenta(login) y contrasea(password) que especifique el Docente. Esperar que
aparezca el mensaje de Inicio de sesin.
Crear una carpeta que se llame Programacin I y dentro de ella una que se llame Prctica
N 24 dentro de la carpeta Mis Documentos.
Ejecute el Visual Studio 2010, crear un nuevo proyecto CRL, para esto elegir en la
pestaa Archivo y aqu elegir la opcin ms adecuada.
Nombrar los archivos como se indica en el archivo Actividades N 24 que se adjunta y
asegurarse de almacenarlos en la carpeta Prctica N 24 al momento de crearlos.
Realizar las acciones indicadas en el archivo adjunto.

Mgter. ngel Montesinos Murillo, Mgter. Manuel Ziga Carnero

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.

Qu es una variable tipo struct?.


Qu son los datos miembros de la variable tipo struct?.
Cmo accedemos a los datos miembro de la variable tipo stuct?.
Qu tipos de datos miembro puede tener una variable tipo Struct?.
Cuntas formas de acceder a los datos miembro existen?.
Cul es el equivalente de las variables tipo struct en otros lenguajes de programacin?.
Cmo se declara una variable tipo struct?.
Qu operaciones se pueden realizar sobre una variable tipo struct?.
Se puede declarar una funcin como dato miembro dentro de una variable tipo struct?.
Se puede conseguir encapsulamiento con una variable tipo Struct?.
Cmo almacenaramos una referencia a una funcin en una variable tipo struct?.

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.

Mgter. ngel Montesinos Murillo, Mgter. Manuel Ziga Carnero

Sesin N 24

S-ar putea să vă placă și