Capítulo 12 - Tipos de Datos Definidos por el Usuario.pdf

Embed Size (px)

Citation preview

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    1/28

    ITSON Manuel Domitsu Kono

    Captulo 12

    Tipos de Datos Definidos por elUsuario

    Aparte de los tipos de datos predefinidos: enteros, flotantes y apuntador, C nos permitecrear algunos tipos de datos a partir de los tipos de datos predefinidos y de tipos de datospreviamente definidos. Esto nos permite una representacin ms natural del problema aresolver. Uno de esos tipos de datos, el arregloya ha sido estudiado anteriormente. Eneste tema se estudiarn tres tipos ms: las enumeraciones, las estructuras y las uniones.

    Tambin se estudiar un mecanismo que posee C para establecer aliases para los tiposde datos lo que permite simplificar la sintaxis de las declaraciones y ayuda aautodocumentar los programas.

    Declaracin typedef

    La declaracin typedef de C nos permite establecer un alias para un tipo de datopredefinido o previamente definido por el usuario. Una vez declarado, ese alias puedeutilizarse en declaraciones de objetos (variables y parmetros), casts, tipos de funciones,

    etc. La sintaxis de la declaracin typedef es la siguiente:

    typedef tipo alias;

    Una declaracin typedef empieza con la palabra reservada typedef. tipo es el tipo dedatos al que le estamos estableciendo el sinnimo dado por alias. Por ejemplo:

    t ypedef unsi gned char uchar;t ypedef unsi gned l ong ul ong;t ypedef i nt cont ador ;

    Estas declaraciones establecen a uchar, ulong y a contador como aliases de

    unsi gned char , unsi gned l onge i nt , respectivamente. En declaraciones t ypedefms complicadas es conveniente visualizar la parte de la declaracin:

    tipo alias

    como una declaracin de una variable, en la que aliasocupa la parte en la que ira el

    nombre de la variable a declarar. Por ejemplo:

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    2/28

    236 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    t ypedef char *cadena;t ypedef char mensaj e[80] ;

    Aqu hacemos que cadena sea un alias de char * , esto es, de apuntador a char ymensaj esea un alias de char . . . [ 80] , esto es, una cadena de 80 caracteres. Msadelante veremos que la declaracin t ypedefpuede emplearse con tipos declarados porel usuario.

    Hay varias razones para desear establecer aliases para los tipos de datos:

    Simplifica las declaraciones de objetos. Por ejemplo es ms sencillo escribir

    uchar x, y;ul ong z, w;

    que

    unsi gned char x, y;unsi gned l ong z, w;

    Hacen ms claro el propsito de ciertos objetos, esto es, autodocumentan unprograma. Por ejemplo:

    cont ador i ;char buscaMayuscul a(cadena s) ;

    Alcance Lxico de una Declaracin typedef

    Las declaraciones t ypedefpueden hacerse al principio de un bloque o externas a lasfunciones por lo que sus alcances lxicos son de bloque y de archivo respectivamente.

    Enumeraciones

    Hay ocasiones en que usamos variables enteras para representar valores que no sonnecesariamente numricos. Por ejemplo para almacenar los valores Booleanos de falso yverdadero, el lenguaje C, emplea una variable entera donde 0 representa el valor de falsoy 1 representa el valor de verdadero. Como un segundo ejemplo, para representar losmeses del ao podemos emplear una variable entera codificando cada mes con unnmero entero: 1 para Enero, 2 para Febrero, .. , 12 para Diciembre. Los inconvenientesde codificar valores no numricos como nmeros son: tener que recordar la codificacinempleada y el hecho de que en el programa no resulta tan obvio el significado de dichosnmeros. En estos casos C nos permite definir tipos enumerados. Un tipo enumeradonos permite asignarles un identificador a cada valor de un subconjunto finito del tipo enteroy de declarar variables que tomen valores de ese subconjunto. El conjunto de valores seconoce como constantes de enumeracin.

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    3/28

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    4/28

    238 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    VI E, SAB. Los identificadores DOMy SABtienen el valor de 0, LUN, Mi ey VI Etienen elvalor de 1 y MARyJ UEel valor de 2.

    Podemos establecer un alias para un tipo enumerado. Por ejemplo:

    t ypedef enumbool ean eBool ean;

    hace de bool ean un alias de enum bool ean, suponiendo que la enumeracin enumbool eanya ha sido declarada. Se puede declarar un tipo enumerado y darle un alias almismo tiempo:

    t ypedef enumbool ean {FALSE, TRUE

    } eBool ean;

    Sin embargo, como el propsito de crear un alias para un tipo es el de usarlo en lugar deltipo original. Usaremos BOOLEANcomo especificador de tipo ms que enum bool eany

    por lo tanto el rtulo bool eanno ser empleado. Por lo tanto la definicin anterior puedeescribirse como:

    t ypedef enum{FALSE, TRUE

    } eBool ean;

    Declaracin de Variables Enumeradas

    Hay tres formas de declarar variables de un tipo enumerado.

    La primera forma es declararlas al mismo tiempo que se define el tipo. Esto ya seilustr al definir el tipo enumerado mes, al mismo tiempo que se declar la variable

    eMescomo de ese tipo.

    La segunda forma de declarar variables de tipo enumerado es declararlas como deun tipo enumerado previamente declarado. Por ejemplo:

    enumbool ean bander a;enummes mes1, mes2;

    La primera declaracin puede substituirse por

    eBool ean eBander a;

    si previamente se estableci que eboolean es un alias de enum bool ean.

    La tercera forma de declarar variables de tipo enumerado consiste en declarar lasvariables como de un tipo enumerado annimo. Por ejemplo:

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    5/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 239

    ITSON Manuel Domitsu Kono

    enum{DOM, LUN, MAR, MI E = 1, J UE, VI E = 1, SAB = 0

    } di a;

    Esta forma de declaracin slo se recomienda usarse cuando la declaracin de

    variables se hace en un solo punto del programa ya que no podemos declararposteriormente otras variables del mismo tipo usando la segunda forma dedeclaracin.

    Tipos Enumerados y Constantes Enteras

    Un identificador de una constante de un tipo enumerado puede emplearse en expresionesdonde se requiere la constante entera que representa, an cuando no se haya declaradouna variable del tipo enumerado. De hecho una definicin de un tipo enumerado es unaforma alterna de definir constantes enteras. Por ejemplo:

    enum mes {ENE, FEB, MAR, ABR, MAY, J UN, J UL, AGO, SEP, OCT, NOV, DI C

    };

    La cual es equivalente a las siguientes declaraciones de constantes:

    const i nt ENE = 0;const i nt FEB = 1;const i nt MAR = 2;. . .const i nt DI C = 11;

    Declaracin de Parmetros, Tipos de Funcin y Castsde Tipos Enumerados

    La declaracin de parmetros, tipos de funciones y casts de tipos enumerados slo puedehacerse con tipos previamente definidos. En estos casos, el tipo enumerado no puede serde tipo annimo. Por ejemplo las siguientes declaraciones no son vlidas:

    enum{FALSE, TRUE} hayDatos( voi d);

    f l oat ventasMes( enum{ENE, FEB, MAR, ABR, MAY, J UN,J UL, AGO, SEP, OCT, NOV, DI C} mes) ;

    en su lugar debern definirse primero los tipos enumerados, como:

    enumbool ean {FALSE, TRUE

    };

    enum mes {ENE, FEB, MAR, ABR, MAY, J UN, J UL, AGO, SEP, OCT, NOV, DI C

    };

    o

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    6/28

    240 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    t ypedef enum{FALSE, TRUE

    } eBool ean;

    t ypedef enum{ENE, FEB, MAR, ABR, MAY, J UN, J UL, AGO, SEP, OCT, NOV, DI C

    } eMes;

    y luego emplearlos

    enum bool ean hayDatos( voi d) ;f l oat ventasMes( enummes mes) ;

    o

    bool ean hayDatos(voi d) ;f l oat ventasMes( eMes mes) ;

    Uso de EnumeracionesUna variable de un tipo enumerado no est limitada a tomar slo los valores de lasconstantes de enumeracin. En realidad puede tomar cualquier valor en el rango de losenteros. Sin embargo, lo normal es slo asignarles los valores de las constantes deenumeracin. Por ejemplo en:

    mes = ABR;

    la variable eMestoma el valor de 3. Una variable de tipo enumerado puede utilizarse de lamisma forma en que se utiliza una variable entera. Puede usarse en expresiones, ciclos,

    listas de argumentos de una funcin y an como parte de nuevos tipos. Por ejemplo lassiguientes expresiones son vlidas.

    i f ( bander a) br eak;

    f or ( mes = ENE; mes

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    7/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 241

    ITSON Manuel Domitsu Kono

    eMes mesSiguiente(eMes mesActual);

    Por ejemplo, en la siguiente llamada a la funcin:

    eMes mesSi g =mesSiguiente( MAR) ;

    almacenar el valor de ABRen la variable mesSi g.

    Espacios de Nombre

    Dentro de un mbito o alcance no podemos usar el mismo identificador para nombrar doso ms objetos y/o funciones. Se dice que los objetos y funciones pertenecen al mismoespacio de nombre. El mismo identificador puede utilizarse para diferentes propsitos,incluso dentro del mismo alcance, si los usos son en diferentes espacios de nombres. Haycuatro espacios de nombre:

    Objetos, funciones, nombres typedef y constantes enumeradas.

    Etiquetas.

    Rtulos de estructuras, uniones y enumeraciones.

    Miembros de cada estructura o unin individualmente, esto es, en diferentesestructuras o uniones pueden emplearse los mismos nombres de miembros.

    Por ejemplo en las declaraciones siguientes:

    enum mes {ENE, FEB, MAR, ABR, MAY, J UN, J UL, AGO, SEP, OCT, NOV, DI C

    };

    t ypedef enum mes mes;

    podemos usar el identificador mes tanto para el rtulo de la enumeracin como para sualias ya que pertenecen a diferentes espacios de nombre.

    Alcance de una Declaracin de Tipo

    Las declaraciones de tipos enumerados, estructuras y uniones al igual que lasdeclaraciones typedef tienen dos alcances: Alcance de bloque y alcance de archivo.

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    8/28

    242 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    Estructuras

    Un arreglo es una lista de variables todas del mismo tipo. Una estructura tambin es unalista de variables relacionadas pero a diferencia de un arreglo, stas pueden ser de

    diferentes tipos. Algunos ejemplos de listas de variables relacionadas que puedenalmacenarse en una estructura son los datos de un alumno: matrcula, NIP, nombre,carrera; los datos de un artculo en inventario: clave, nombre, cantidad, localizacin, etc.

    Definicin de Tipos Estructuras

    La definicin de un tipo estructura establece una plantilla, es decir la forma, para unavariable del tipo estructura que se est declarando. La definicin del tipo no crea lavariable. La sintaxis de la definicin de un tipo estructura es:

    struct [rtulo] {

    tipo1 nomMiembro11 [ , nomMiembro12] . . . ;[ tipo2 nomMiembro21 [ , nomMiembro22] . . . ;]. . .

    }[ nomVar1] [ , nomVar2] . . . ;

    rtuloes un identificador que sirve para referenciar al tipo que se est declarando en las

    declaraciones de objetos, casts y tipos de funcin. La referencia al tipo estructura que seest creando es struct rtuloy no slo rtulo.

    tipo1es el tipo de las variables nomMiembro11,nomMiembro12 . . . , tipo2es eltipo de las variables nomMiembro21,nomMiembro22 . . . , etc. Esas variables son lasque forman la variable tipo estructura y son llamadas miembros de la estructura.

    Al mismo tiempo que definimos un tipo estructura podemos declarar variables de ese tipo.nomVar1, nomVar2 . . . son los identificadores de esas variables.

    Por ejemplo:

    st r uct punt o {doubl e x, y;

    };

    define a st r uct punt ocomo un tipo estructura para almacenar las coordenadas de un

    punto en el plano.

    st r uct t r i angul o {st r uct punt o p1, p2, p3;

    }

    define a str uct t r i angul ocomo un tipo estructura para almacenar las coordenadasde los vrtices de un tringulo. Note que una estructura puede contener a otra estructuracomo miembro. La siguiente definicin establece a st r uct al umno como un tipo

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    9/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 243

    ITSON Manuel Domitsu Kono

    estructura con los datos de un alumno y al mismo tiempo declara a al umnocomo unavariable del tipo st r uct al umno.

    st r uct al umno {i nt mat r i cul a;char *ni p;

    char *nombre;char *car r er a;} al umno;

    Podemos establecer un alias para un tipo estructura. Por ejemplo:

    t ypedef st r uct punt o sPunt o;t ypedef st r uct al umno sAl umno;

    hacen de sPunt o y sAl umno alias de struct punto y st r uct al umno,respectivamente. Al igual que con los tipos enumerados tambin podemos declarar unaestructura y darle un alias simultneamente:

    t ypedef st r uct al umno {i nt mat r i cul a;char *ni p;char *nombre;char *car r er a;

    } sAl umno;

    o

    t ypedef st r uct {i nt mat r i cul a;char *ni p;char *nombre;

    char *car r er a;} sAl umno;

    Declaracin de Variables Tipo Estructura

    Las variables tipo estructura pueden declararse de la misma forma en que se declaran lasvariables de un tipo enumerado.

    La primera forma es declararlas al mismo tiempo que se define el tipo. Por ejemploal definir el tipo st r uct al umno, se declar la variable al umnocomo de ese tipo.

    La segunda forma de declarar variables de tipo estructura es declararlas como deun tipo estructura previamente declarado. Por ejemplo:

    st r uct al umno al umno;

    o

    sAl umno al umno;

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    10/28

    244 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    si consideramos que sAl umnoes un alias de st r uct al umno;

    La tercera forma de declarar variables de tipo estructura consiste en declarar lasvariables como de un tipo estructura annimo. Por ejemplo:

    struct {doubl e x, y;

    } punt o;

    Al igual que con las enumeraciones, esta forma de declaracin solo se recomiendausarse cuando la declaracin de variables se hace en un slo punto del programaya que no podemos declarar posteriormente otras variables del mismo tipo usandola segunda forma de declaracin.

    Inicializacin de Variables Tipo Estructura

    Una variable tipo estructura puede inicializarse al mismo tiempo que se declara. Porejemplo:

    sAl umno al umno = {12345, "BXPK", " J uan Per ez" , " I E"};

    inicializa los miembros mat r i cul a, *ni p, *nombr e, *car r er aa 12345, "BXPK","J uan Per ez", "I E" .

    Si el nmero de inicializadores es menor que el nmero de miembros, el compiladorrellena la estructura con ceros si los campos son numricos y con apuntadores nulos sison apuntadores.

    Operaciones con una Estructura

    Las nicas operaciones vlidas con estructuras son: acceder a los miembros de unaestructura, asignar una estructura a otra del mismo tipo, tomar la direccin de unaestructura, y calcular el tamao de una estructura.

    Acceso a los Miembros de una Estructura

    Para acceder a los miembros de una variable de tipo estructura se utiliza el operador demiembro de estructura (.) llamado tambin operador punto. La sintaxis de este

    operador es

    nomVar.nomMi embr o

    nomMi embr o es el nombre del miembro de la variable tipo estructura nomVar . Laexpresin nomVar .nomMi embr o es sintcticamente equivalente al nombre de unavariable del tipo del miembro accesado. Por ejemplo dadas las declaraciones:

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    11/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 245

    ITSON Manuel Domitsu Kono

    sPunt o punt o;sAl umno al umno;char nombr e[ 40] = "J uan Ol i vas" ;

    sPunt o. xnos da acceso al miembro xde la estructura sPunt oy como xes un entero, laexpresin sPunt o. x puede emplearse como se emplea el nombre de una variable

    entera. Luego

    punto. x = 10. 5;

    almacena en el miembro x1de la estructura sMarcoel valor de 10, mientras que

    punto. x += 3. 6;

    lo incrementa en uno. sAl umno. nombre nos permite acceder al miembro nombr e desAl umno. Como nombr ees un apuntador a char, la expresin sAl umno. nombrees unapuntador a char, por lo que

    al umno. nombre = nombre;

    almacena la direccin de la cadena nombr e en el miembro nombr e de la estructurasAl umno. La expresin

    put s( al umno. nombr e) ;

    desplegara en la pantalla la palabra "Juan Olivas", y

    al umno. nombr e[ 1] = ' o' ;

    o

    *( al umno. nombr e + 1) = ' o' ;

    hacen que el contenido de la cadena t i t ul osea " Joan Olivas ".

    Asignacin de una Estructura a Otra

    Una variable del tipo estructura puede asignarse a otra estructura del mismo tipo. Porejemplo

    sAl umno al umno1, al umno2;al umno1 = al umno2;

    Cada uno de los miembros de la estructura sAl umno2 se copian, byte por byte, a laestructura sAl umno1.

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    12/28

    246 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    Direccin de una Estructura y Apuntadores a una Estructura

    La direccin de una estructura (la direccin del primer miembro) puede obtenerseutilizando el operador de direccin (&). Tambin podemos declarar apuntadores aestructuras. Por ejemplo:

    sAl umno al umno1, al umno2, *pAl umno;

    pAl umno = &al umno1;al umno2 = *pAl umno;

    La primera lnea declara a al umno1y al umno2como dos estructuras del tipo sAl umnoya pAl umnocomo un apuntador a una estructura de tipo sAl umno.

    La segunda lnea almacena en pAl umnola direccin de al umno1, mientras que la terceralnea asigna a la variable al umno2la estructura que se encuentra en la direccin dada porpAl umno. Las dos ltimas lneas equivalen a la lnea

    al umno2 = al umno1;

    En el ejemplo anterior vimos como podemos utilizar el operador de indireccin (*) paraaccesar a una estructura de la cual tenemos su direccin. Tambin podemos accesar a losmiembros de esa estructura. Por ejemplo para accesar al miembro mat r i cul a de laestructura apuntada por psAl umnoescribimos

    ( *pAl umno). matr i cul a

    Note que debemos primero desreferenciar el apuntador para obtener la estructura ya que

    el operador punto requiere del lado izquierdo una estructura. Tambin note que sonnecesarios los parntesis ya que el operador punto tiene mayor precedencia que eloperador de indireccin. Para simplificar la sintaxis de la expresin anterior C posee unoperador que nos permite accesar a un miembro de una estructura de la cual tenemos sudireccin, el operador de apuntador a estructurallamado tambin operador flecha. Eloperador flecha formado por el signo menos (- ) y el signo mayor que (>) sin espaciosintermedios (- >) tiene la siguiente sintaxis

    nomApunVar -> nomMi embr o

    nomMi embr oes el nombre del miembro de la variable tipo estructura cuya direccin est

    dada por nomApunVar . La expresin anterior es sintcticamente equivalente al nombre deuna variable del tipo del miembro accesado. Luego para accesar al miembro mat r i cul ade la estructura apuntada por psAl umnoutilizando el operador flecha, escribimos

    pAl umno- >mat r i cul a

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    13/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 247

    ITSON Manuel Domitsu Kono

    Tamao de una Estructura

    El operador si zeof ( ) nos da el tamao de un tipo u objeto. La sintaxis de este operadores

    sizeof({t i po| nomVar})

    donde t i po es el especificador de un tipo predefinido o declarado por el usuario ynomVar es el nombre de un objeto de cualquier tipo. El operador si zeof ( ) nos da eltamao en bytes de ocupado por un objeto del tipo t i poo de un objeto llamado nomVar .El operador si zeof ( ) es un operador de tiempo de compilacin. Esto es, el clculo deltamao del objeto se efecta durante la compilacin. Por ejemplo, dadas las declaraciones

    i nt x, y[ 10] ;

    las siguientes expresiones

    s i zeof ( i nt)si zeof ( x)

    nos dan el tamao de la variable x, mientras que el tamao del arreglo ypuede obtenersecon la expresin:

    si zeof ( y)

    El operador tambin puede aplicarse a estructuras. Por ejemplo:

    si zeof ( st r uct al umno) / / Tamao del t i po est r uctur a

    si zeof ( sAl umno) / / Tamao del t i po est r uct ur asi zeof ( al umno) / / Tamao de l a var i abl e de t i po est r uct ur a

    nos dan el tamao en bytes de la variable al umno, dadas las declaraciones de losejemplos anteriores.

    Estructura Interna de una Estructura

    Los miembros de una estructura se almacenan en memoria en el mismo orden en que sondefinidos. Sin embargo no podemos asumir que los miembros de una estructura seencuentren en localidades contiguas de memoria. Esto se debe a que algunos

    compiladores fuerzan (siempre u opcionalmente) a que los diferentes miembros de laestructura se almacenen en direcciones mltiples de 2 o 4. Esto a fin de hacer mseficiente el acceso a los miembros de la estructura. Esto hace que algunos compiladoresdejen huecos entre los miembros de una estructura, por lo tanto el tamao de unaestructura no necesariamente es igual a la suma de los tamaos de los miembros de dichaestructura. Por esa razn si deseamos saber el tamao de una estructura debemosemplear el operador si zeof ( ) .

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    14/28

    248 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    Estructuras y Funciones

    Una funcin puede regresar por el mecanismo de return una estructura completa. Porejemplo la siguiente funcin inicializa una estructura de tipo sPunt oa un par de valoresque recibe como argumentos.

    sPunt o punt o(doubl e x, doubl e y){

    sPunt o p;

    p. x = x; p. y = y;r et urn p;

    }

    Una funcin tambin puede recibir como argumento una estructura. Por ejemplo lasiguiente funcin regresa la distancia entre dos puntos

    #i ncl ude

    doubl e di st anci a( sPunt o p1, sPunt o p2){

    r et urn sqr t ( pow( ( p2. x- p1. x) , 2) + pow( ( p2. y- p1. y) , 2) ;}

    Como ejemplo de llamadas a las funciones punt o() y di st anci a() tenemos:

    doubl e d;sPunt o p1;

    . . .p1 = punt o( 4. 0, 7. 0) ;d = di stanci a( p1, punt o( 8. 0, 2. 0) ) ;

    . . .

    Por ltimo una funcin puede recibir como argumento un apuntador a una estructura. Porejemplo, la siguiente funcin recibe la informacin necesaria para desplegar un alumno, enuna estructura del tipo sAl umno.

    voi d despl i egaAl umno( sAl umno *pAl umno){

    pr i nt f ( "%d, %s, %s, %s" , pAl umno -> matr i cul a, pAl umno -> ni p,pAl umno - > nombr e, pAl umno - > carr era) ;

    }

    Note que dado a que el parmetro pAl umnoes un apuntador a una estructura de tiposAl umno, utilizamos el operador flecha para accesar a los miembros de la estructuraapuntada por pAl umno. La llamada a la funcin despl i egaAl umno( ) tendra la forma

    sAl umno al umno = {12345, "BXPK", " J uan Per ez" , " I E"};

    . . .despl i egaAl umno( &al umno) ;. . .

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    15/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 249

    ITSON Manuel Domitsu Kono

    donde vemos que a la funcin despl i egaAl umno() le pasamos la direccin de laestructura al umno.

    Una funcin que recibe como argumento un apuntador a una estructura puede hacer elmismo trabajo que las funciones que regresan una estructura por el mecanismo de return

    o que las que reciben como argumento una estructura. De hecho las funciones queregresan una estructura o las que reciben una estructura tienen dos inconvenientes:Primero deben reservar espacio para la estructura, ya sea como una variable local o comoun parmetro y segundo toma tiempo que la funcin regrese o enviarle a la funcin todauna estructura. Por otro lado tienen la ventaja de que la sintaxis para accesar a losmiembros de la estructura es ms sencilla ya que no tenemos que manejar apuntadores.En resumen si las estructuras son de unos cuantos bytes no importa mucho el mecanismoque usemos para enviarle a una funcin o que la funcin nos regrese una estructura. Perosi la estructura es grande es ms eficiente mandarle a la funcin un apuntador a laestructura.

    Arreglos de Estructuras

    Ya vimos que un miembro de una estructura puede ser de cualquier tipo: enteros,flotantes, enumerados, estructuras y como veremos posteriormente uniones. Por otro ladopodemos agrupar estructuras en arreglos. Por ejemplo

    sPunt o punt os[ 100] ;

    declara un arreglo de estructuras del tipo sPunt o. La siguiente pieza de cdigo muestra lasintaxis para accesar a los miembros de una estructura que es un elemento de un arreglo:

    . . .punt os[ 1] = punt o( 4. 0, 7. 0) ;punt os[ 2] = punt o( 8. 0, 2. 0) ;

    pr i nt f ( "\ La di stanci a ent r e l os punt os ") ;pr i nt f ( "( %. 2f , %. 2f ) y ", punt os[1]. x, punt os[ 1] . y) ;pr i nt f ( "( %. 2f , %. 2f ) es ", punt os[2]. x, punt os[ 2] . y) ;pr i nt f ( "%. 2f ", di st anci a( punt os[ 1] , punt os[ 2] ) ;. . .

    En este ejemplo punt os[ 1] y punt os[ 2] son los nombres de dos de las estructurasque componen el arreglo puntos.

    Ejemplos sobre Estructuras

    Se desea implementar un programa que permita administrar el catlogo de alumnos deuna universidad. El catlogo se almacenar en un arreglo donde cada elemento contienelos datos de un alumno: matrcula, NIP, nombre y carrera, en una estructura. Para manejarlos datos de un alumno se crear el mdulo alumno. En el archivo de cabeceraal umno. hse define la estructura empleada para almacenar los datos de cada alumno,

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    16/28

    250 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    as como la declaracin de las funciones que permiten inicializar los datos de un alumno ycrear una cadena con los datos de un alumno.

    alumno.h/ ** Fi l e: al umno. h

    * Aut hor : mdomi t su** Creat ed on 11 de abr i l de 2010, 05: 31 PM

    */

    #i f ndef _ALUMNOS_H#def i ne _ALUMNOS_H

    / / Tamao de una cadena para l os dat os de un al umno#def i ne TAM_ALUMNO 80

    t ypedef st ruct {i nt mat r i cul a;char ni p[ 7] ;char nombre[40] ;

    char car r er a[ 7] ;} sAl umno;

    voi d i ni ci al i zaAl umno(sAl umno *pAl umno, i nt matr i cul a, char *pNi p,char *pNombr e, char *pCarr er a) ;

    char* al umnoACadena(char *pCadenaAl umno, sAl umno *pAl umno) ;

    #endi f / * _ALUMNOS_H */

    El archivo fuente al umno. c contiene las definiciones de las funciones declaradas enal umno. h:

    alumno.c

    / ** al umno. c** Est e mdul o represent a a un al umno de una uni versi dad*/

    #i ncl ude #i ncl ude ". . / i ncl udes/ al umno. h"

    / ** Esta f unci on i ni ci al i za l os campos de una est r uct ur a de ti po sAl umno* con l os val ores de sus par ametr os*/

    voi d i ni ci al i zaAl umno(sAl umno *pAl umno, i nt matr i cul a, char *pNi p,char *pNombr e, char *pCarr era) {

    pAl umno- >matr i cul a = mat r i cul a;st r cpy(pAl umno->ni p, pNi p) ;st r cpy( pAl umno->nombre, pNombre) ;st r cpy(pAl umno->car r er a, pCarr er a) ;

    }

    / ** La f unci n despl i ega l os val ores de l os campos del al umno del parametr o* en un rengl on.*/

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    17/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 251

    ITSON Manuel Domitsu Kono

    char* al umnoACadena(char *pCadenaAl umno, sAl umno *pAl umno) { spr i ntf ( pCadenaAl umno, "%d, %s, %s, %s" , pAl umno- >mat r i cul a,

    pAl umno- >ni p, pAl umno- >nombre, pAl umno- >car r era) ;

    r eturn pCadenaAl umno;}

    Para implementar las operaciones que permitan agregar un alumno al catlogo dealumnos, actualizar, eliminar y listar alumnos del catlogo de alumnos se implementar elmdulo alumnos. En el archivo de cabecera al umnos. hse definen las operaciones:

    alumnos.h/ ** Fi l e: al umnos. h* Aut hor : mdomi t su** Creat ed on 25 de abr i l de 2010, 06: 58 PM

    */

    #i f ndef _ALUMNOS_H

    #def i ne _ALUMNOS_Ht ypedef enum {

    REPETI DO = - 3, CATALOGO_LLENO, NO_EXI STE, OK} eCodi goEr r or;

    i nt i ndi ceAl umno( i nt mat r i cul a) ;i nt obt enAl umno(sAl umno *pAl umno, i nt matr i cul a) ;i nt agr egaAl umno( sAl umno *pAl umno) ;i nt actual i zaAl umno(sAl umno *pAl umno) ;i nt el i mi naAl umno( i nt mat r i cul a) ;voi d despl i egaAl umnos( ) ;

    #endi f / * _ALUMNOS_H */

    El siguiente cdigo es un listado parcial del archivo alumnos.c con la declaracin delarreglo para almacenar el catlogo de alumnos y los mtodos: i ndi ceAl umno( ) ydespl i egaAl umnos( ) .

    alumnos.c/ ** al umnos. c** Est e mdul o represent a l as operaci ones del catal ogo de* al umnos de una uni versi dad*/

    #i ncl ude

    #i ncl ude ". . / . . / al umno/ i ncl udes/ al umno. h"#i ncl ude ". . / i ncl udes/ al umnos. h"

    st at i c sAl umno al umnos[ 100] ;st at i c const i nt MAX_ALUM = 100;st at i c i nt numAl umnos = 0;

    / ** Est a f unci n busca a un al umno en el cat l ogo de al umnos cuya* matr i cul a coi nci da con l a matr i cul a del parmet r o. Regr esa el

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    18/28

    252 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    * ndi ce del al umno en el arr egl o si exi st e, NO_EXI STE en caso* cont rari o.*/

    i nt i ndi ceAl umno( i nt mat r i cul a) {i nt i ;

    f or( i =0; i < numAl umnos; i ++) {i f ( al umnos[ i ] . mat r i cul a == mat r i cul a)

    ret urn i ;}

    r eturn NO_EXI STE;}

    . . .

    / ** La f unci n despl i ega l os val ores de l os campos de l os al umnos del catal ogo* de al umnos. Uno por r engl on.*/

    voi d despl i egaAl umnos( ) {i nt i ;char cadenaAl umno[ TAM_ALUMNO] ;

    f or( i =0; i < numAl umnos; i ++) {pr i nt f ( " \ n%s" , al umnoACadena(cadenaAl umno, &al umnos[ i ] ) ) ;

    }pr i nt f ( " \ n" ) ;

    }

    Ejercicios sobre Estructuras

    1. Implemente la funcin

    i nt agr egaAl umno( sAl umno *pAl umno) ;

    que agrega al alumno del parmetro, al catlogo de alumnos. Si hay xito la funcinregresa el valor OK. Si no hay espacio en el catlogo, la funcin regresa el valor deCATALOGO_LLENO. Si el alumno ya est en el catlogo, la funcin regresa el valorREPETI DO.

    2. Implemente la funcin

    i nt el i mi naAl umno( i nt mat r i cul a) ;

    que borra los datos del alumno cuya matrcula est dado por el parmetro, del

    catlogo de alumnos. Si hay xito la funcin regresa el valor OK. Si el alumno noexiste en el catlogo, la funcin regresa el valor NO_EXI STE.

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    19/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 253

    ITSON Manuel Domitsu Kono

    Uniones

    Al igual que las estructuras, una unin es un tipo definido por el usuario consistente de unalista de variables relacionadas que pueden ser de diferente tipo. A diferencia de una

    estructura, en la que cada uno de sus miembros ocupa su propio espacio de memoria, enuna unin todos los miembros de la unin comparten el mismo espacio de memoria. Porejemplo, considere las siguientes definiciones y declaraciones:

    st r uct s { uni on u {i nt x; i nt x;l ong y; l ong y;doubl e z; doubl e z;

    } }

    st r uct s a; uni on u b;

    Las variables ay bapareceran en la memoria como

    a b

    x y z

    x

    y

    z

    Podemos ver que en la unin los miembros x, y y z comparten el mismo espacio dememoria y por lo tanto slo uno de ellos puede estar almacenado en la variable a la vez.El tamao de una unin es del tamao del mayor de sus miembros. El lenguaje C noprovee un mecanismo que nos permita determinar cul de los miembros est almacenadoen la variable. Es responsabilidad del programador recordar cul de los miembros est

    almacenado.

    Definicin de Tipos Uniones

    La definicin de un tipo unin, al igual que la de una estructura establece una plantilla, esdecir la forma, para una variable del tipo unin que se est declarando. La definicin deltipo no crea la variable. La sintaxis de la definicin de un tipo unin es

    union [r t ul o]{

    t i po1 nomMi embro11 [, nomMi embro12] . . . ;

    [ t i po2 nomMi embro21 [ , nomMi embro22] . . . ;] . . .}[ nomVar1] [, nomVar2] . . . ;

    rtul oes un identificador que sirve para referenciar al tipo que se est declarando en lasdeclaraciones objetos, casts y tipos de funcin. La referencia al tipo unin que se estcreando es union r t ul oy no slo r t ul o.

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    20/28

    254 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    t i po1es el tipo de las variables nomMi embr o11, nomMi embr o12..., t i po2es el tipode las variables nomMi embr o21, nomMi embr o22 ..., etc. Esas variables son las queforman la variable tipo unin y son llamadas miembros de la unin.

    Al mismo tiempo que definimos un tipo unin podemos declarar variables de ese tipo.

    nomVar 1,nomVar 2... son los identificadores de esas variables.

    Los miembros de una unin pueden ser de cualquier tipo ya sea predefinido o definido porel usuario. Tambin una estructura puede contener uniones y podemos tener arreglos deuniones. Tambin podemos establecer aliases para uniones con la declaracin typedef.Por ejemplo el tipo unin del ejemplo anterior puede tener el alias

    t ypedef uni on u u;

    Declaracin e Inicializacin de Variables Tipo Unin

    Las variables tipo unin pueden declararse de la misma forma en que se declaran lasvariables de un tipo estructura.

    Una variable tipo unin slo puede inicializarse a un valor del tipo del primero de susmiembros. Por ejemplo, la variable bdel tipo unin Udel ejemplo anterior pudo habersedeclarado e inicializado como:

    u b = 125;

    pero no como:

    u b = 789. 56

    Operaciones con una Unin

    Las nicas operaciones vlidas con las uniones son las mismas operaciones con lasestructuras y tienen la misma sintaxis: accesar a los miembros de una unin, asignar unaunin a otra del mismo tipo, tomar la direccin de una unin, y calcular el tamao de unaunin.

    Como ya se mencion anteriormente, es responsabilidad del programador recordar el tipodel dato que se encuentra almacenado en una unin. Por ejemplo en el siguiente

    segmento de cdigo

    u b;

    . . .b. x = 125;pr i nt f ( " l d" , b. y) ;. . .

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    21/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 255

    ITSON Manuel Domitsu Kono

    la funcin pr i nt f () no despliega el valor de 125, sino un nmero largo cuyos dos bytesmenos significativos contienen la secuencia binaria equivalente a 125. Sin embargo nosiempre es un error asignarle a una unin un valor del tipo de uno de sus miembros yextraerle un valor del tipo de otro de sus miembros. De hecho esta propiedad de lasuniones se emplear en un subtema ms adelante. Otra de las ventajas de las uniones es

    la de que al compartir sus miembros el mismo espacio de memoria, son de menor tamaoque una estructura con los mismos miembros. Por supuesto la unin slo se puedeemplear si estamos seguros que slo un miembro va a ocupar la unin a la vez.

    Ejemplos Sobre Uniones

    Se desea implementar un programa que permita administrar el inventario de unlaboratorio. El inventario se almacenar en un arreglo donde cada elemento contiene losdatos de un producto: clave, nombre, tipo de producto (material o reactivo), cantidad (unentero para los materiales o un flotante para los reactivos) y unidad, en una estructura.Para manejar los datos de un producto se crear el mdulo producto. En el archivo de

    cabecera pr oduct o. h se define la estructura empleada para almacenar los datos decada producto, as como la declaracin de las funciones que permiten inicializar los datosde un producto y crear una cadena con los datos de un producto.

    producto.h/ ** Fi l e: pr oducto. h* Aut hor : mdomi t su** Creat ed on 25 de abr i l de 2010, 10: 04 PM

    */

    #i f ndef _PRODUCTO_H

    #def i ne _PRODUCTO_H/ / Tamao de una cadena para l os datos de un pr oducto#def i ne TAM_PRODUCTO 100

    t ypedef enum {MATERI AL, REACTI VO

    } eTi po;

    t ypedef st ruct {i nt cl ave;char nombre[40] ;eTi po t i po;uni on {

    i nt nCant i dad;f l oat f Cant i dad;

    } cant i dad;char uni dad[ 2] ;

    } sPr oduct o;

    voi d i ni ci al i zaMat er i al ( sProducto *pPr oducto, i nt cl ave, char *nombr e,i nt nCant i dad, char *uni dad) ;

    voi d i ni ci al i zaReact i vo( sProduct o *pPr oduct o, i nt cl ave, char *nombr e,f l oat f Cant i dad, char *uni dad) ;

    char * product oACadena(char *pCadenaPr oducto, sPr oducto *pProducto) ;

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    22/28

    256 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    #endi f / * _PRODUCTO_H */

    El archivo fuente pr oduct o. ccontiene las definiciones de las funciones declaradas enpr oduct o. h:

    producto.c/ ** pr oduct o. c** Est e mdul o r epresent a a un product o de un al macen*/

    #i ncl ude #i ncl ude #i ncl ude ". . / i ncl udes/ pr oducto. h"

    / ** Est a f unci on i ni ci al i za l os campos de un mater i al apunt ado por sProduct o

    * con l os val ores de sus par ametr os*/voi d i ni ci al i zaMat er i al ( sProducto *pPr oducto, i nt cl ave, char *nombr e,

    i nt nCant i dad, char *uni dad) {pPr oducto- >cl ave = cl ave;st r cpy( pPr oducto- >nombre, nombre) ;pProduct o- >t i po = MATERI AL;pProduct o- >cant i dad. nCant i dad = nCant i dad;st r cpy(pProduct o->uni dad, uni dad) ;

    }

    / ** Esta f unci on i ni ci al i za l os campos de un r eact i vo apunt ado por sProduct o* con l os val ores de sus par ametr os*/

    voi d i ni ci al i zaReact i vo( sProduct o *pPr oduct o, i nt cl ave, char *nombr e,f l oat f Cant i dad, char *uni dad) {pPr oducto- >cl ave = cl ave;st r cpy( pPr oducto- >nombre, nombre) ;pProduct o- >t i po = REACTI VO;pPr oducto- >cant i dad. f Cant i dad = f Cant i dad;st r cpy(pProduct o->uni dad, uni dad) ;

    }

    / ** La f unci n despl i ega l os val ores de l os campos del pr oduct o del parametr o* en un rengl on.*/

    char * pr oduct oACadena(char *pCadenaPr oducto, sPr oducto *pPr oducto) {i f ( pProduct o->t i po == MATERI AL)

    spri nt f ( pCadenaPr oduct o, "%d, %s, Materi al , %d, %s" ,pProducto- >cl ave, pProducto- >nombre,pProduct o- >cant i dad. nCant i dad, pPr oduct o- >uni dad) ;

    el se i f ( pProduct o->t i po == REACTI VO)spr i nt f ( pCadenaPr oduct o, "%d, %s, React i vo, %. 4f , %s",

    pProducto- >cl ave, pProducto- >nombre,pProduct o->cant i dad. f Cant i dad, pProduct o->uni dad) ;

    r eturn pCadenaPr oducto;}

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    23/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 257

    ITSON Manuel Domitsu Kono

    Para implementar las operaciones que permitan agregar un producto al inventario deproductos, actualizar, eliminar y listar productos del inventario de productos seimplementar el mdulo productos. En el archivo de cabecera pr oduct os. hse definenlas operaciones:

    productos.h/ ** Fi l e: pr oductos. h* Aut hor : mdomi t su** Creat ed on 25 de abr i l de 2010, 11: 02 PM

    */

    #i f ndef _PRODUCTOS_H#def i ne _PRODUCTOS_H

    t ypedef enum {PRODUCTO_I NSUFI CI ENTE = - 3, I NVENTARI O_LLENO, NO_EXI STE, OK

    } eCodi goEr r or;

    i nt i ndi cePr oducto(i nt cl ave) ;i nt obt enProduct o( sPr oduct o *pPr oduct o, i nt cl ave) ;i nt agr egaPr oduct o(sProduct o *pProduct o) ;i nt act ual i zaPr oducto( sPr oduct o *pPr oduct o) ;i nt el i mni naPr oducto( sPr oduct o *pProduct o) ;voi d despl i egaPr oduct os( ) ;

    #endi f / * _PRODUCTOS_H */

    Como un producto es o un material o un reactivo pero no ambos, la cantidad es o unentero o un flotante pero no ambos, por lo que podemos utilizar un tipo uni oncon uncampo entero y un campo flotante para la cantidad y as optimizar el espacio de memoria.

    El siguiente cdigo es un listado parcial del archivo productos.ccon la declaracin delarreglo para almacenar el catlogo de alumnos y los mtodos: i ndi cePr oduct o( ) ydespl i egaPr oduct os( ) .

    productos.c/ ** pr oduct os. c** Est e mdul o represent a a l os product os de un al macen*/

    #i ncl ude #i ncl ude ". . / . . / pr oducto/ i ncl udes/ pr oducto. h"#i ncl ude ". . / i ncl udes/ pr oductos. h"

    st at i c sPr oduct o product os[ 100] ;st at i c const i nt MAX_PROD = 100;st at i c i nt numPr oduct os = 0;

    / ** Est a f unci n busca a un pr oduct o en el i nvent ari o de pr oduct os cuya* cl ave coi nci da con l a cl ave del parmet r o. Regr esa el

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    24/28

    258 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    * ndi ce del pr oduct o en el arr egl o si exi st e, NO_EXI STE en caso* cont rari o.*/

    i nt i ndi cePr oducto( i nt cl ave) {i nt i ;

    f or ( i = 0; i < numPr oductos; i ++) {i f ( productos[i ] . cl ave == cl ave)

    ret urn i ;}

    r eturn NO_EXI STE;}

    / ** Est a f unci n r egr esa el pr oduct o del i nvent ari o de pr oduct os cuya cl ave* coi nci da con l a cl ave del parmet r o. El pr oduct o se r egr esa en l a* est r uct ur a apunt ada por el parametr o pProduct o. Regr esa el ndi ce del* pr oduct o en el ar r egl o si exi st e, NO_EXI STE en caso cont rari o.*/

    i nt obt enProduct o( sPr oduct o *pPr oduct o, i nt cl ave) {i nt pos = i ndi cePr oducto(cl ave) ;

    i f ( pos == NO_EXI STE) r etur n NO_EXI STE;

    *pPr oduct o = product os[ pos] ;r et ur n OK;

    }

    / ** La f unci n despl i ega l os val ores de l os campos de l os pr oduct os del

    i nvent ar i o* de pr oduct os. Uno por r engl on.*/

    voi d despl i egaPr oduct os( ) {i nt i ;

    char cadenaPr oduct o[ TAM_PRODUCTO] ;

    f or ( i =0; i < numPr oductos; i ++)pr i nt f ( " \ n%s" , pr oduct oACadena(cadenaPr oduct o, &pr oduct os[ i ] ) ) ;

    pr i nt f ( " \ n" ) ;}

    Ejercicio sobre Uniones

    Implemente la funcin

    i nt agr egaProduct o( sProduct o *pProduct o) ;

    que agrega el producto apuntado por el parmetro al catalogo de productos si no existe. Siexiste, incrementa su cantidad en la cantidad del producto del parmetro. Si hay xito lafuncin regresa OK. Si no hay espacio en el arreglo, la funcin regresaCATALOGO_LLENO.

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    25/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 259

    ITSON Manuel Domitsu Kono

    Campos de Bits

    Un miembro entero o entero sin signo de una estructura puede declararse como formadopor un nmero dado de bits. Tal miembro se denomina Campo de bits, y su nmero

    asociado de bits se llama su ancho. La sintaxis para declarar un campo de bits es:

    {int| unsigned} nomCampo: ancho;

    El ancho de un campo de bits es un nmero entero no negativo, cuyo valor mximodepende de la implementacin del compilador de C.

    Los valores negativos en un campo de bits con signo se almacenan en su formacomplemento de dos. Los rangos permitidos para algunos campos dependiendo deltamao de bits se muestran en la tabla 13-1.

    Tabla 13-1. Rango de los campos de bits.Tamao del campo

    en bits

    Con signo Sin signo

    1 -1 .. 0 0 .. 1

    2 -2 .. 1 0 .. 3

    3 -4 .. 3 0 .. 7

    4 -8 .. 7 0 .. 15

    5 -16 .. 15 0 .. 31

    6 -32 .. 31 0 .. 63

    7 -64 .. 63 0 .. 127

    ...

    Normalmente los campos de bits se declaran como miembros consecutivos de unaestructura. El orden en que se acomodan los campos de bits depende de laimplementacin del compilador.

    Por ejemplo, la siguiente declaracin:

    st r uct BI TS{

    i nt i : 2;unsi gned j : 5;i nt : 4;i nt k: 1;unsi gned m: 4;

    } x;

    Crea una variable xde tipo estructura con la siguiente distribucin:

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    26/28

    260 Tipos de Datos Definidos por el Usuario

    ITSON Manuel Domitsu Kono

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

    m k Sin uso j i

    La mayora de los compiladores no permiten que un campo de bits quede repartido entredos palabras. Por ejemplo la siguiente declaracin:

    st r uct BI TS2{

    i nt a: 4;unsi gned b: 5;i nt c: 10;i nt d: 1;unsi gned e: 4;

    } y;

    Crea una variable yde tipo estructura en la cul los primeros dos campos quedan en unapalabra y los otros tres en otra.

    Primer palabra15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

    b a

    Segunda palabra

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

    e d c

    Podemos mezclar en una estructura, campos normales y campos de bits. Por ejemplo:

    st r uct BI TS3{

    l ong x;char msj [ 20] ;i nt a: 4;unsi gned b: 5;i nt c: 10;unsi gned e: 4;

    };

    Restricciones en el Uso de los Campos de Bits

    Las siguientes restricciones se aplican sobre los campos de bits

    1. No se permite tomar la direccin de un campo de bits. Por ejemplo, sea bits unavariable del tipo estructura BITS definida anteriormente:

    str uct BI TS bi t s

    la siguiente expresin no es vlida:

    &(bi ts . j )

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    27/28

    Captulo 12 Tipos de Datos Definidos por el Usuario 261

    ITSON Manuel Domitsu Kono

    2. No podemos crear arreglos de campos de bits. Por ejemplo:

    st r uct BI TS4{

    i nt i : 3;

    unsi gned j : 5;i nt k[ 4] : 1; / * No es vl i do */unsi gned m: 4;

    };

    Ejercicio sobre Campos de Bits

    Construya una funcin llamada codifica()que reciba tres parmetros enteros: a, b y c.

    La funcin combinar los bits de los parmetros para formar un byte de la siguientemanera:

    c0 b2 b1 b0 a3 a2 a1 a0

    la funcin regresa el byte codificado. La sintaxis de la funcin es:

    unsigned char codifica(int a, int b, int c);

    Problemas

    1. Para el programa que permite administrar el catlogo de alumnos de una

    universidad de los ejemplos sobre estructuras, implemente las siguientes funcionesen el mdulo alumnos:

    i nt obt enAl umno(sAl umno *pAl umno, i nt matr i cul a) ;

    que regresa, en la variable apuntada por pAl umno, al alumno del catlogo dealumnos cuya matrcula est dada por el parmetro mat r i cul a. Si hay xito lafuncin regresa el valor OK, en caso contrario regresa el valor NO_EXI STE.

    i nt actual i zaAl umno(sAl umno *pAl umno) ;

    que actualiza los datos del alumno cuya matrcula est en el alumno del parmetro,del catlogo de alumnos. Si hay xito la funcin regresa el valor OK. Si el alumno noexiste en el catlogo, la funcin regresa el valor NO_EXI STE.

    2. Para el programa que permita administrar el inventario de un laboratorio de losejemplos sobre uniones, implemente las siguientes funciones:

    i nt obt enPr oduct o( sPr oduct o *pPr oduct o, i nt cl ave)

  • 7/25/2019 Captulo 12 - Tipos de Datos Definidos por el Usuario.pdf

    28/28

    262 Tipos de Datos Definidos por el Usuario

    que regresa el producto del catlogo de productos cuya clave coincida con la clavedel parmetro. El producto se regresa en la estructura apuntada por el parmetropProduct o. Regresa el ndice del producto en el arreglo si existe, NO_EXI STEencaso contrario.

    i nt act ual i zaPr oduct o( sPr oduct o *pPr oduct o)

    que actualiza al producto del catalogo de productos cuya clave coincida con laclave del producto del parmetro. Si hay xito la funcin regresa OK. Si el productono existe, la funcin regresa NO_EXI STE.

    i nt el i mni naPr oduct o(sProduct o *pProduct o)

    que reduce la cantidad del producto del catalogo de productos cuya clave coincidacon la clave del producto parmetro. Si despus de la reduccin la cantidad