3era Parte

53
Guíadel Estudiante Introducción a la Programación con C 8) e) 7) ¿Cuáles de los siguientes tienen la mayor precedencia? a) * b) ++ C) == d) 0 ¿Cuáles de los siguientes no pueden ser declarados? a) Puntero a un arreglo b) Puntero a una estructura c) Puntero a una función d) Ninguna de las anteriores En la declaración int *ptr ( int ) ¿Qué ES prr? a) Un puntero a función b) Un puntero a puntero c) Una función d) Ninguna de las anteriores 10) En a) b) c) d) la declaración int * (*ptr) (int *) ¿Qué €s ptr? Un puntero a puntero Un puntero a una función Declaración inválida Ninguna de las anteriores Volumen 5: Punteros en C Unidad 3: Punteros Avanzados93 O Copyright IBM Corp. 2006 Los materiales del cursono pueden ser reproducidos total o parcialmente sin el permiso previo escrito de IBM

description

IBM

Transcript of 3era Parte

  • Gua del Estudiante Introduccin a la Programacin con C

    8)

    e)

    7) Cules de los siguientes t ienen la mayor precedencia?a ) *b) ++C ) = =d) 0

    Cules de los siguientes no pueden ser declarados?a) Puntero a un arreglob) Puntero a una estructurac) Puntero a una funcind) Ninguna de las anteriores

    En la declaracinin t *p t r ( i n t )

    Qu ES p r r?a) Un puntero a funcinb) Un puntero a punteroc) Una funcind) Ninguna de las anteriores

    1 0 ) E n

    a)b )c)d )

    la declaracini n t * ( * p t r ) ( i n t * )

    Qu s pt r?Un puntero a punteroUn puntero a una funcinDeclaracin invlidaNinguna de las anteriores

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 93

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Respuestas a la Unidad 3: Examen de Autoevaluacin1 ) a2 \ b3 ) d4 ) a5) a6) a7 ) dB ) d9) c

    1 0 ) b

    Volumen 5: Punteros en C Volumen 5: Punteros en C 94

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante lntroduccin a la Prooramacin con 0

    Unidad 4: Laboratorio de PunterosAvanzados

    Objetivos de Aprend tzajeAl f inal izar esta unidad, usted ser capaz de:

    . Trabajar con diferentes t ipos de punteros.

    . Usar punteros en la solucin de problemas.

    Volumen 5: Punteros en C Unidad 4: Laborator io de Punteros Avanzados 95

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • .lntro:lr"cin u lu Ptogt, Gua del Estudiante

    Ejercicios de Laboratorio1) Considere la siguiente estructura definida a continuacin:

    typede f , r t ruct {i n t dd , f f i f t , yy ;

    ) nncua;t y p e d e f ; t r u c t {

    i n t - i dno ;

    cha r nombre [40 ] ;FECHA ddn;f l oa t sa . l a r r c r ;

    i n t C e p e n d i e n t e s ;

    i nurr-rano;a) Escribir una funcin que lea los datos para 100 empleados. Usted puede

    probar el programa para 5 a 10 empleados pero debe trabajar para cualquiernmero de empleados.

    b) Escribir una funcin para incrementar el sueldo de los empleados basados enuna entrada del usuario. Las entradas sern el nmero del empleado y elporcentaje de incremento en el sueldo. La funcin debe retornar el nuevosueldo del empleado.

    c) Escribir una funcin que muestre los detal les del empleado con un formato.

    volunren 5: Punteros en c Volumen b: punteros en c 96

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Proqramacin con C

    Volumen 6: Tpicos Avanzados

    Volumen 6: Tpicos Avanzados Unidad 4. Laboratorio de Punteros Avanzados 97

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Gua del Estudiante Iniroduccin a la programacin con C

    Unidad 1: Manejo de Archivo en CObjetivos de Aprend izajeAl f inal izar esta unidad, usted ser capaz de:

    ' Reconocer problemas que requieren la necesidad de leer v escribir datos endisposit ivos de almacenamiento secundario.

    o Discutir cmo manejar archivos de datos en C.e Discutir el mtodo de manejo de archivos orientado a f lujo en c.' Describir diferente l ibreras de funciones que ayudan a crear, leer y escribir

    archivos en disco.

    Volumen 6: Tpicos Avanzados Unidad 1. Manejo de Archivo en C 99@ Copyright IBM Corp. 2006

    Los materiales del curso no pueden ser reproducidos totalo parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    1. lntroduccinAlgunas aplicaciones requieren que los datos estn disponibles para varias ejecucionesdel programa. Ejemplos de estas aplicaciones son:

    . Datos sobre empleados, requeridos por aplicaciones de nmina de pago.

    . Datos sobre cuentas del cliente, requeridos por lor; programas bancarios.Los datos que se usan en las variables de los programas prevalecen solamente elt iempo de duracin de dicho programa. Los datos, almacenados en la RAM, se pierdenuna vez que el programa termina a menos que explcitamente se coloquen en losdisposit ivos de almacenamiento secun.Jario. Sin embargo, en los disposit ivos dealmacenamiento secundario como discos y cintas, los datos se almacenanpermanentemente err la forma de archivos de dafos. En esta unidad se va considerarslo archivos de disco cuando se haga referencia a los disposit ivos de almacenamientosecundario. Los datos que se mantienen en el disposit ivo de almacenamientosecundario son permanentes, a menos que sean borrados por el usuario.

    Muchos lenguajes de programacin clasifican los archivos de datos como archivossecunciales y archivos de acceso directo o acceso aleatorio. C ofrece dos tiposdiferentes de archivcls de datos. Estos son:

    o Archivos de datos orientados a flujo, llamados tambin archivos estndar.o Archivos de datos orientados a sistema. llamados tambin archivos de datos

    de bajo nivel.De los dos, los archivos de datos orientados a flujo son los ms fciles de programar ymanipular. En esta unidad slo se cubrirn los archivos de datos orientados a f lujo.Los archivos de datos orientados a flujo se dividen en dos categoras. Estas son:

    . Archivos de texto.

    . Archivos de datos sirrformato.Los arclrivos de texto son aquellos que consisten de una secuencia de caracteres, loscuales pueden ser considerados de slo caracteres o como una cadena de caracteres(str ing) o como nmeros. Varias funciones de l ibrera estn disponibles para crear, leery escribir en archivos de disco.

    Los archivos de datos sin formato son aquellos en los cuales los datos estnorganizados dentro de bloques que consisten de bytes contiguos. Se pueden usar pararepresentar estructuras de datos ms complejas tales como arreglos y estructuras.Ciertas funciones especficas de librera estn tambin disponibles para transferirestructuras de datos completas.

    Volumen 6: Tpicos Avanzados Volumen 6:Tpicos Avanzados 100

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Proqramacin con C

    2. Uso de Archivos de Datos en CEl lenguaje C ofrece un amplio conjunto de funciones de l ibrera para crear y uti l izararchivos de datos.

    Una de las primeras cosas que hay que hacer con los archivos de datos orientados aflujo es crear un rea de buffer (almacenamiento temporal). Un rea de buffer es unlugar en memoria que se usa para transferir datos desde la memoria a los disposit ivosde almacenamiento secundario y viceversa. El rea de buffer es la asociacin entre elarchivo de datos en el disposit ivo de almacenamienlo secundario y el programa que usalos datos. Crear un rea de buffer que ayuda a que la transferencia de informacin entreel disposit ivo de almacenamiento secundario y el programa sea ms rpida.Un rea de buffer se puede crear como sigue:

    F I L E * b u f f 3 L r ;

    FrLE es un t ipo de estructura especial que permite la definicin de un rea de buffer, ybuf f3Lr es un puntero que apunta al inicio del rea de buffer. Al buf f_prr tambinse denomina puntero a f lujo. Ntese que siempre debe escribirse FrLE en maysculas.La estructura especial rr ln est definida en srdio. h.En C, los archivos de datos deben ser abiertos antes que puedan ser procesados eirtclusive creados. Al abrir un archivo se hace una asociacin entre un nombre dearchivo y el rea del buffer. Tambin especifica cmo los archivos de datos sernusados, de acuerdo a la l ista que se presenta a continuacin:

    . Slo lectura.

    . Slo escritura.

    . Lectura/escritura.

    Existe una funcin de l ibrera para abrir archivos l lamada f open.b u f f _ p t r = f o p e n ( n o m b r e - d e 1 - a r c h i v o , t i p o - d e - a r c h i v o ) ;

    Se deben seguir las reglas para crear nombres de archivos en un sistema operativo.Consulte los manuales del computador con respecto a las reglas para crear nombres dearchivos.

    El t ipo de archivo es una cadena de caracteres (str ing) que especif ica cmo se debeusarel archivo. Los diferentes t ipos de archivos se presentan en la Tabla 1.1.

    Volumen 6: Tpicos Avanzados Unidad 1 : Manejo de Archivo en C 101

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Tipo deArchivo

    Signif icado

    , r r , l Abre un archivo que existe, slo de lectura

    "!vuAbre a un nuevo archivo para slo escritura. Si un archivo delmismo nombre existe. ste ser borrado v un nuevo archivo sercreado.

    i lar l Abre un archivo que existe para agregar al f inal del archivo. Si elarchivo no existe un nuevo archivo ser creado.

    , r r+r l Abre un archivo existente para ambos lectura y escritura.

    t'w+ttAbre un nuevo archivo para escritura/lectura. Si un archivo con elmismo nombre existe, ste ser borrado y un nuevo archivo sercreado.

    "a+" Abre un archivo que existe para lectura/escritura. Si el archivo noexiste un nuevo archivo ser creado.

    Tabla 1.1: Tipos de Archivo

    Cuando la funcin fopen se usa, retorna un puntero al inicio de la posicin del rea debuffer asociada con el archivo. Si, por alguna razn, el archivo no puede ser abierto, seretorna un valor NULL (cero). Esta condicin puede ocurrir cuando un archivo de datosexistente no se puede encontrar, o cuando fal la el intento de abrir el archivo por estardaado. Al f inal de cada programa, un archivo de datos que ha sido abierto debc sercerrado. Una funcin de l ibrera l lamada f close permite hacer esto.

    f c f o s e ( b u f f _ p L r ) ;Aunque muchos compiladores de C cierran automticamente todos los archivos dedatos alf inal del programa, es mejor si se cierran los archivos explcitamente.A continuacin se presentan algunos ejemplos para entender los conceptos de m;rrrejode archivos en C con ms claridad.

    Ejemplo 1.1: Cmo Abrir un Archivo de DatosEn este ejemplo, se ilustra cmo los archivos de datos se pueden abrir en C. Considerreel siguiente fragmento de programa.

    El cdigo C in ic ia aqu . . .1 . / * a r c h i v o d e c a b e c e r a * /

    2 . # i n c l u d e < s t d i o . h >

    3 .4 . / * L a f u n c i n m a i n s e i n i c i a a q u * /

    l \ l5 . m a r n ( ) I

    Volumen 6: Tpicos Avanzados Volumen 6: Tpicos Avanzados 102

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante lntroduccin a la Programacin con C

    6 .' 7 .

    a

    / * a b r i r u n a r c h i v a * /F I L E * b u f f _ p t r ;b u f f _ p t r - f o p e n ( " m y D a t a . d a t " ,

    " r " ) ;

    " ; - Ce r ra r un a rch i vo * /

    f c l o s e ( b u f f p t r ) ;

    9 .

    1 0 .

    1 1 .

    7 2 .

    1 3 .

    1_4 .

    1 5 .

    1 6 .

    El cdigo C termina aqu

    A continuacin se analizan cada una de las sentencias anteriores. La primera sentenciaincluye el archivo de cabecera l lamado srdio.h. Recuerde que este archivo indica eluso de operaciones de E/S de cualquier clase. Aqu especf icamente, la estructura FrLEest def in ida dentro del arch ivo de encabezado std io .h. La sentencia FrLE def ineuna variable puntero l lamada buf f_ptr. Este crea un rea de bufferpara el archivo dedatos y apunta a la posicin inicial de memoria ocupada por buf f_prr.

    La sentencia, f open, abre el archivo l lamado myData . dat en modo slo lectura yretorna un valor apropiado que es asignado al butf_pr-r. Sifue exitoso abrir el archivo,la funcin fopen retorna un puntero al inicio del rea de buffer, el cual ahora esasignado a buf f3tr ' . Si no fue exitoso abrir el archivo (como se ver en el siguienteejemplo), f open retorna un valor NULL (el cual es cero). El buf f_ptr apunta al reade buffer asociada con el archivo myDara. dar QUe fue abierto. Con esto, todas lassentencias que se refieren y hacen uso del archivo de datos usarn buf f_ptr en vezdel nombre del archivo. La lt ima sentencia, f c1ose, cierra el archivo de datos.

    Note que el buf f; tr tambin se us para cerrar el archivc.

    F in del E jemplo 1.1Ejemplo 1.2: Como Manejar un fopen No ExitosoEn este ejemplo, se i lustra dos mtodos para manejar un f open no exitoso.Considere el siguiente fragmento de programa en C.

    Volumen 6: Tpicos Avanzados Unidad 1 : Manejo de Archivo en C 103@ Copyrigrht IBM Corp. 2006

    Los materiales del curso no pueden ser reproducidos totalo parcialmente sin el permiso previo escr i to de IBM

  • Introdr-ccin a la Programacin con C Gua del Estudiante

    El cdigo C in ic ia aqu . . .

    1 . / * A r c h i v o d e c a b e c e r a * /

    2 . # i n c l u d e < s t d i , . h >

    3 . # d e f i n e N U L L 0

    4 .

    5 . / * L a f u n c i n n a i n s e i n i c i a a q u * /6 . m a i n O {7 .

    B .

    9 .

    1 0 .

    1 l .

    1 2 .

    1 3 .

    1 4 .

    1 _ 5 .

    1_6 .L 7 .

    , L t J .

    1 9 .) l

    I

    / * A b r i r e l a r c h i v o * /

    F I L E * p t r ;

    p t r = f o p e n ( " m y D a t a . d a L " , " r t " ) ;i f ( p t r = = N U L L r

    p r i n t f ( " E r r o r a I a b r i r d e 1 a r c h i v o \ n " ) ;e I S e t

    / * C e r r a r e l a r c h i v o * /f l n c o l n t - r \ .\ l : ' v L t '

    El cdigo C termina aqu

    Conro se mencion en el Ejemplo 1.1 cuando se intenta abrir un archivo usando unfopen que no es exitoso, la funcin retorna el valor NULL. Se verifica si el valorretornado por la funcin f open es un valor NULL. Se ha definido aqu el NULL como 0.Un rnensaje de error apropiado debe darse al usuario. Si abrir el archivo es exitoso sepuede proceder a hacer lo que se quera con el archivo de datos. Para recordar, f openno ler exitoso si el archivo mencionado no se encontr o si el archivo est daado. Espos,itrle que existan otras razones por las cuales al intentar abrir el archivo no se tengaxito.

    Otr'-r mtodo para verificar si un f open fue exitoso o no es combinar la sentencia f opendertro de la sentencia i f , como se muestra en elsiguiente segmento de cdigo:

    Volumen 6: Tpicos Avanzados Volumen 6: Tpicos Avanzados 104

    @ Copyright IBM Corp. 2006Los materiales dei curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Proqramacin con C

    El cdigo C in ic ia aqu . . .1 . / * e rch i vo de Cabecera * /2 . # i n c l u d e < s t d i o . h >3 . # d e f i n e N U L L 04 .

    5 . / * L a f u n c i n m a i n s e i n i c i a a q u * /

    6 . m a i n O {" l

    . / * A b r i r e l a r c h i v o * /8 . F I L E * p t r ;

    f . i f ( ( p t r = [ o p e n ( ' , m y D a L a . d a t " , ' , r + " ) ) N U L L )1 0 . p r i n t f (

    " E r r o r a b r i e n d o e 1 a r c h i v o \ n ) ;1 1 . e , l s e {1 2 . / * C e r r a r e l a r c h i v o * /

    1 3 . f c l o s e ( p t r ) ;4 4 .

    1 5 .

    1 6 .r t . )1 8 . )

    El cdigo G termina aqu

    Fin del Ejemplo 1.2Note como en este mtodo se ha colocado ? fopen dentro de la sentencia i f . Lafuncin fopen se ejecuta y retorna un valor, el cual se asigna 3 ptr y luego secompara con NUI,L.

    Se puede usar cualquiera de los dos mtodos. Al f inal, son los programadores quienesdeciden cul de los mtodos desean emplear.

    Tal como se mencion anteriormente, un archivo de datos debe ser primero creadoantes de ser usado. A continuacin se aprender a como crear los archivos de datos.Los archivos de datos orientados a f lujo se pueden crear de las siguientes formas:

    , ' Creacin directa del archivo usando un editor de texto o un procesador depalabras.

    . Creacin indirecta a travs de un programa.Cuando se crea un archivo de datos a travs de un programa, generalmente los datosse leen primero como entrada del usuario a travs del teclado y luego se escriben alarchivo de datos, Se pueden usar las siguientes funciones de l ibrera:

    Volumen 6: Tpicos Avanzados Unidad 1: Maneio de Archivo en C 105

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    o getchar0. putcQ

    Ejemplo 1.3: Leer un Archivo de Texto y Mostrarlo

    En este ejemplo se presenta cmo leer un archivo de texto desde un dispositivo dealmacenamiento secundario y mostrar el texto. Se debe abrir un archivo de textoexistente l lamado mysrory.dar n modo slo de lectura. Entonces se debe leercarcter por carcter del archivo, mostrando cada carcter hasta que se encuentre uncarcter Eor (f in de archivo).El cdigo C in ic ia aqu . . .

    1 . # i n c l u d e < s t d i o . h >

    2 . / * L a f u n c i n m a i n s e i n i c i a a q u * /

    3 . m a i n O {

    E

    7 .

    B .

    1 0 .

    1 1 .

    1 2 .

    1 3 .1 4

    1 5 .

    1 6 .1-1 -

    1 8 .

    1 9 .

    z v - I

    F I L E * m y T e x t ; / * A r e a d e b u f f e r * f

    c h a r c h ;

    / * A b r i r e 1 a r c h i v o * /

    m y T e x t = f o p e n ( " m y S t o r y . d a t " , " r " ) ;j f (myTex t - == NULL)

    p r i n t f ( " E r r o r a l a b r i r e 1 a r c h i v o \ n " ) ;e . L s e t

    / * L e e r u n c a r c t e r a f a v e z h a s t a a f c a n z a r E O F ei m p r i m i r l o * /6 = g e L c ( m y T e x t ) ;w h i l e ( c h ! = E o F ) {

    p u L c h a r ( c h ) ;6 = g e t c ( m y T e x L ) ;

    )/ * C e r r a r e l a r c h i w o * /f c l o s e ( m y T e x t ) ;

    )

    El cdigo C termina aqu

    Las sentencias iniciales que abren un rea de buffer, abren un archivo y verifican si elarchivo fue abierto exitosamente o no. La otra seccin es para leer desde el archivohasta que se encuentre el carcter de ror. Se usa la funcin getc para leer uncarcter desde el archivo que est abierto. Note que se usa con la variable puntero a

    Volumen 6: Tpicos Avanzados Volumen 6:Tpicos Avanzados 106

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la prooramacin con C

    buffer myTexr. La funcin gerc(myTexL) lee desde el archivo de texto y retorna elcarcter a leerse. Cada l lamada a getc lee los caracteres en secuencia. El carcter defin de archivo, EoF, marca el archivo de texto mismo. Esto se hace de manera iterativahasta que el carcter ledo sea el nor' . Note que el carcter EoF es macro definida en elarchivo de cabecera. La funci putchar se usa para mostrar el carcter ledo.Fin del Ejemplo 1.3Ejemplo 1.4: Escribir a un Archivo de DatosEn este ejemplo se i lustra un mtodo para escribir a un archivo de datos. La idea es leercaracteres del teclado que el usuario ingresa. Estos caracteres se deben convert ir amaysculas y luego escribirse en el archivo de datos. El siguiente segmento deprograma hace esto:

    El cdigo C in ic ia aqu . . .1 . # i n c f u d e < s t d i o . h >2 . # i n c l u d e < c t y p e . h >3 . / * L a f u n c i n m a i n i n i c i a a q u * /

    4 . m a i n O {5 . F I L E * m y T e x t ;

    6 . i n L c h ;7 . / * a b r i r e l a r c h i v o * /

    I . m y T e x t = f o p e n ( " m y s t o r y . d a t " , , , w " ) ;f . i f ( m y T e x t = = N U L L )1 0 . p r i n t f ( , ' E r r o r e n f a c r e a c i o n \ n " ) ;1 1 . e l s e t1 2 . p r i n t f (

    " I n g r e s e L r n r e x t o a s e L a l m a c e n a d o d e n t r o e 1 \ a r c h i v o \ r - r " ) ;

    1 3 . 6 6 = g e t _ c h a r o ;1 4 . w h i l e ( c h l = ' \ n ' ) {1 5 . c h = , t o u p p e r ( c h ) ;1 6 . p u t . c ( c h , m y T e x t ) ;7 7 . g = g e t c h a r 0 ;1 8 - )L 9 . / * C e r r a r e l a r c h i v o * /

    2 0 . f c l o s e ( m y T e x t ) ;2 7 . )2 2 . )El cdigo C f inal iza aqu

    Volumen 6: Tpicos Avanzados Unidad 1: Manejo de Archivo en C 107O Copyright IBM Corp. 2006

    Los materiales del curso no pueden ser reproducidos totalo parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Para convertir los caracteres ledos a maysculas, se usa la funcin toupper. Dadoque se usa esa funcin, se debe tambin incluir el archivo de cabecera ctype. h. Seusa la funcin qetchar para leer un carcter desde el teclado. Se usa la funcin putcpara escribir un carcter en el archivo de datos abierto en modo escritura. Lo siguientees el nrtodo para usar la funcin putc:

    pu tc ( ch , n t yTex t ) , 'Esta funcin escribe el carcter ch dentro del 2r^t':uo de datos asociado con el rea debuffer, el cual est apuntandc por ia variable puntero myText.

    Fin del Ejemplo 1.4Exir;ten muchas funciones que ayudan a leer y escribir archivos de datos. Para leer yesr:r ibir caracteres, se puede usar las funciones de l ibrera geLc y putcrespectivanrente. Para leer y, escribir cadenas completas (string) (no precisamente uncarcter) se pueden usar las funciones de l ibrera gets y puts. Alternativamente, paraescribir y leer datos con formato se puede usar fgets o fputs. El lenguaje C tambinpermite que estructuras complejas sean ledas y escritas en archivos de datosdirectamente, a travs de las funciones f scanf y f printf .

    Ejemplo 1.5: Contar los Espacios y Caracteres en un Archivo de TextoEste ejemplo consit jera el problema de contar el nmero de espacios en blanco ycaracteres (diferentes a espacios en blanco) en un el archivo de texto. El problema esabrir un archivo de texto designado para lectura, proceder a leer caracteres del archivode texto hasta que se alcanza el sor y mantener un contador del nmero de espacios yun contador del nmero de caracteres. Al final, los contadores de espacios y caracteresse imprimen.

    Esto refuerza el uso de la lectura de un carcter, por ahora esto se realiza usando lafurrcin fcr6s.

    El cdigo G in ic ia aqu . . .1 . # i r r c l u d e < s t d i o . h >

    2 . # r n c l r r d e < c t . y p e . h >3 . / * L a f u n c i n m a i n s e i n i c i a a q u * /

    rnain O {FILE * text - , -cha r ch ;

    r n t n s p a c e = 0 , n c h a r = 0 ;

    , / * a b r i r u n a r c h i v o * /

    t e x t = f o p e n ( " m y T e x t . d a t " , t ' r " ) ;i f ( t e x t = = N U L L )

    p r i n t f ( " E r r o r a I a b r i r \ n " ) , .

    + .

    5 .

    6 .

    7 .

    a t .

    9 .1 0 .1 1 .

    Volunren 6: Tpicos Avanzados Volumen 6:Tpicos Avanzados 108

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    1 2 . e f s e {1 3 .

    1 4 .

    1 5 .

    1 6 .

    L 7 .

    1 8 .

    1 9 .

    2 0 .

    2 I .

    2 2 .

    2 3 .

    c h = f g e L c ( L e x L ) ;w h i f e ( c h t = E o F ) t

    / * V e r i f i c a l o s e s p a c i o s e n b l a n c o s ,L a b u f a c i o n e s y c a r a c t e r e s d e n u e v a f n e a * /i f ( c h = = ' ' l l c h = = r \ r r l l g = = , \ n , )

    n s p a c e + + ;i f ( t o u p p e r ( c h ) > = ' A ' & & t o u p p e r ( c h ) < = , 2 , )

    n c h a r + + , .

    c h = f g e t c ( t e x t ) ;)/ * C e r r a r e l a r c h i v o * /

    f c f o s e ( t e x t ) ;z + . t

    2 5 . p r i n t f ( " E s p a c i o s : ? d C a r a c t e r e s = % d \ n , , , \2 6 . n s p a c e , n c h a r ) ;2 . 7 . )El cdigo C termina aqu

    Fin del Ejemplo 1.5Ejemplo 1.6: Crear un Archivo de Notas para una ClaseEn ste ejemplo se muestra cmo trabajar con estructuras y escribir las a un archivo dedatos. Considere la siguiente estructura para esta aplicacin:

    s L r u c t l i s t a n o t a s {c h a r i d n o [ 9 ] ;c h a r n o m b r e I a 5 ] ;f l o a t n o t a s [ 6 ] ; / * n o t a s d e 6 c u r s o s * /

    ] ;Suponga datos para un mximo de 100 estudiantes que deben ser ledos desde elteclado y escrtos en el disco. Se asume el f inal de la entrada cuando el usuario ingreseel carcter $ en la primera posicin del idno. Esto es ms realista que tomar enormescantidades de datos como entrada desde el teclado. En este ejemplo, se crea un reade buffer con una variable puntero, como mark_ptr. Entonces se abre un archivol lamado history.dat refir indose al archivo de datos de notas. Existe una asociacincreada entre el archivo history.dat y la variable puntero in_rnark_prr. El archivode dato se abre para escritura. Note que se escribe los datos al archivo de datosusando la func in fpr in t r . La s in tax is de la func in fpr in t f es s imi lar a la func inprintf , la nica diferencia notable es el uso de la variable puntero de f lujo como el

    Volumen 6: Tpicos Avanzados Unidad 1: Manejo de Archivo en C 109@ Copyright IBM Corp. 2006

    Los materiales del curso no pueden ser reproducidos totalo parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    primer argumento en la funcin fprintf . La cadena de formato usa las mismascaractersticas de la funcin prinL f .

    El cdigo G in ic ia aqu . . .1 . / * P rog rama pa ra c rea r un a rch i vo con l as no tas de l os

    e s t u d i a n L e s * /2 . / * A r c h i v o d e c a b e c e r a * /3 . # i n c f u d e < s t d i o . h >

    4 . # d e f i n e S I Z E 2

    5 . / * Es t ruc tu ra que a lmacena l a i n fo rmac in de un es tud ian te* /T

    6 .

    1 . t y p e d e f s L r u c t {B . c h a r i d n o [ 9 ] ;9 . c h a r n o m b r e [ 4 5 ] ;1 0 . f l o a L n o t a s [ 6 ] ; / * N o L a s d e l o s s e i s c u r s o s * /

    I r r n m a r l ar r . ] L l s ' - r ' A _ N o T A S ;1 2 .

    1 3 . / * t r u n c i n p a r a f e e r l o s d a t o s d e l u s u a r i o y a l m a c e n a r o s e nun a rch i vo * /

    7 4 . v o i d a l m a c e n a r D a t o s ( ) {1 5 . F I L E * i n _ m a r k _ p t r ;

    1 6 . L I S T A N O T A S i n s L u d [ S r z e 1 tl 7 . i n t j , k ;1 8 . / * A b r r a r c h i v o p a r a e s c r i t u r a * /

    1 9 . i n _ m a r k _ p t r - f o p e n ( " h i s t o r y . d a L " , " w " ) ;2 0 .

    2 I . f * Lee r t odos l - os da tos de l os es tud ian tes de pa r ted e l u s u a r i o * /

    2 2 . k = 0 ;

    2 3 . w h i l e ( k . S I Z E ) {2 4 . p r i n t f ( " I n g r e s a r I D N O \ n " ) ;2 5 . s c a n f ( r r e s r r , i n _ s L u d [ k ] . i d n o ) ;2 6 . f f l u s h ( s t d i n ) ;2 7 . p r i n t f ( " I n g r e s a r N o m b r e \ n " ) , .28 . scan f ( r r ?s r r , i n_s tud [ k ] . nombre ) ;2 9 . p r i n t f ( " I n g r e s a r l a s n o t a s d e l o s 6 c u r s o s \ n " ) ;3 0 . f o r ( j = O ; j . 6 ; j + + ) {

    Volumen 6. Tpicos Avanzados Volumen 6: Tpir;os Avanzados 1 10

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    3 1 .3 2 .3 3 .3 4 .3 5 .3 6 .3 7 .3 8 .3 9 .4 0 .4 r .4 2 .4 3 .4 4 .4 5 .4 6 . )4 - / .4 8 .4 e . )5 0 .5 1 . / * F u n c i n p a r a l e e r d a t o s d e l - a r c h i v o e i m p r i m i r l o s * /

    \ ) r n i r l r - r r n 1 2 r l - l F n c I \ I\ v J l / l

    1 ro o t^ - . i - F / t t \ T ^ F - -y ! a r r u ! \ r \ v u q D d e f C u r s o N o : \

    ? d [ 0 - 1 0 0 ] \ n " , j + 1 ) ;s c a n f ( r r e f r r , & i n _ s t . u d t k l . n o t a s t j l ) ;

    ) w h i l e ( ( i n _ s t u d I k ] . n o t a s i j I < 0 ) \| | ( i n _ s t u d [ k ] . n o t a s I j ] ' 1 0 0 ) ) ;

    )k + + ;

    )f o r ( k : O ; k < S I Z t r ; k + + ) {

    r n r i n f f / . i n m r l , n t - r " " - ^ * \ n " , i n s t u d l X J . i d n O ) ;' ' ' _ t s . ' ,

    f p r i n t f ( i n _ m a r k _ p L r , " % s \ n " , i n _ s t u d l k l . n o m b r e ) ;f o r ( j = 0 ; j . 6 ; j + + )

    f p r i r i t f ( i n_ rna rk_pL r , \I t e f \ n r r , i n s t u d [ k ] . n o t a s t j I ) ;

    / * C e r r a r a r c h i v o * /

    f c l ose ( i n_mark_p t . r ) ;

    i r I LE *ouL mark _p t r ' ;

    L ISTA NOTAS ouL sLud IS IZE ] ;i n t j , k ;

    / * Ab r r a r ch i vo modo fec tu ra * /

    o u t _ m a r k _ p t r - f o p e n ( " h i s t o r y . d a t " , " r " ) ;

    / * L e e r t o d o s l o s d a t o s d e e s t u c l i a n t e s d e f a r c h v o * f

    f , f

    5 4 .

    5 5 .

    5 6 .

    5 ' / .5 8 .

    5 9 .

    6 0 .6 r . k - 0 ;6 2 . f w h i l e ( k < s r z E ) {6 3 .

    6 4 .

    6 5 .

    6 6 .

    6 '7 .

    f s c a n f ( o u t _ m a r k _ p t r , " % s % s " , o u t _ s t u d [ k ] . i d n o , \ou t_s tud I k ] . non re ) ;f o r ( j = 0 ; j . 6 ; j + + )

    f s c a n f ( o u t _ m a r k _ p t r , " % f " , \& o u L s t u d I k ] . n o t a s t j I ) ;

    Unidad 1: Manejo de Archivo en C 111Volumen 6: Toicos Avanzados

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Progi' 'amacin con C

    6 8 .

    6 e . )k + + ;

    7 o . f * C e r r a r a r c h i v o * /'7 1" . f c lose (ouc_mark_pt r ) ;7 2 . f o r ( k = o ; k < S r z E ; k + + ) {

    Gua del Estudiante

    7 1

    7 4 .

    7 5 .

    7 6 .' 7 7 .

    ' 7 R il

    '7q ' lt

    p r i n t f ( " \ n ? s : % s \ n " , o u t _ s t u d t k l . i d n o , \ou t_s tud [ k ] - nonb re ) ;p r i n t f ( " N o L a s e n l o s c u r s o s : \ n " ) ;f o , : ( j = 0 ; j . 6 ; j + * )

    p r i n t f ( " ? 6 - 2 f \ n " , o u t s t u d [ k ] . n o t a s t j I ) ;

    8 0 . / * L a f u n c r o n m a l n r n r c r a a g u * /

    8 1 . m a i n O {8 2 . a l m a c e n a r D a t o s O ;8 3 . r e c u p e r a r D a t o s ( ) ;8 4 . )El cdigo G f inal iza aqu

    Nota: Cuando se abrieron los archivos no se verfic por NULL. Se requiere que seinch,rya una verificacin por NULL cuando se ejecute este programa en la computadora.F in del E jemplo 1.6Resulta obvio que usar archivos de datos no es slo leer y escribir archivos de texto. Senecesita procesar datos en un archivo de datos, actualizar valores que requieren sermodificados y hacer mu'lhas otras tareas relacionadas. Generalmente un archivo dedatos t iene que ser ledo as como se t iene que escribir en 1. Escribir un archivo dedatos puede tomar la forma de registros siendo aadidos, registros siendo borrados,contenido de registros siendo cambiados o registros siendo arreglados. El siguiente esrrn mtodo para realizar esta actividad:

    . Tener dos archivos diferentes, uno para entrada y el otro para salida.

    . La idea es leer del archivo de entrada, hacer el procesamiento y escribirregistros al archivo de salida.

    . Una vez que todo esto se ha hecho, borrar el ar,;hivo de entrada viejo yreemplazar ste con un archivo nuevo.

    Otro mtodo de hacer esto se presenta a continuacin:. Leer un registro desde el archivo.o Procesarlo y escribirlo de vuelta en el mismo archivo reemplazando el registro.

    Nota: Es difcil leer y escribir datos con formato, en el mismo archivo de datos.

    Volumen 6: Tpicos Avanzados Volumen 6: Tpicos Avanzados 112

    @ Copyright IBM Corp. 2000Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante ramacin con C

    3. Archivos de Texto y BinarosLos archivos de datos ledos y escritos a un disco pueden ser clasif icados como texto ybinarios, basado en cmo el archivo se abre para su uso. Los archivos de texto y losbinarios dif ieren en tres reas.

    o La forma en que los caracteres de nueva lnea se manean.. La forma en que el f in de archivo se maneja.. La forma en que los nmeros se almacenan.

    3.1. Manipular los Caracteres de Nueva Lnea

    En el modo texto, el carcter de nueva lnea (newline) se convierte en un 'retorno decarro y cambio de lnea' (carriage return - CR y l inefeed - LF), y luego escritos en eldisco. De la misma forma cuando se lee del disco, el ' retorno de carro y cambio delnea' se traduce a un carcter de nueva lnea. Cuando el archivo se abre en modobinario, estas conversiones no ocurren. Para abrir un archivo en modo binario, se puedeusar lo s igu iente:

    f p L r = f o p e n ( ' . m i A r c h i v o . d a t , , , , , r b , , ) ;Se puede usar "b" para indicar que el archivo es abierto en modo birrario. Adems sepuede especif icar "t" para indicar modo texto, este lt imo puede ser omit ido al ser elvalor por defecto, es decir, "r" sera equivalente a usar "rt".

    3 .2. Manipular e l F in de Archivo (EOF)Cuando se usa en modo texto, se inserta un carcter como lt imo, un carcter con elvalor ASCII ze para indicar el f in de archivo. En un archivo, siempre que este valor seencuentre, la funcin read retornar eop al programa que lo l lama. En los archivosmodo binario, no existe un carcter especial para marcar el f in de archivo. El f in dearchivo se deduce por el nmero de caracteres presentes en la entrada del directoriodel archivo.

    Nota: Un nmero almacenado en modo binario debe tambin leerse en modo binario. Sise almacenan en modo texto, un nmero vlido como 26 en ASCII siempre signif icarun EoF y esto termina la lectura del archivo ms temprano.

    3.3. Manipular e l A lmacenamiento de Nmeros

    Se ha usado slo la funcin fprint.f hasta ahora para escribir datos a archivos. Uncarcter se almacena como 1 byte en memoria. Pero fprintf no almacena losnmeros, como dos bytes se necesitan para inL y cuatro bytes para ffoat. Losnmeros se almacenan como cadenas de caracteres. Por ejemplo, un nmero como5643 se a lmacena en cuatro bytes. Un nmero punto- f lo tante como 2s.625 sealmacena en seis bytes. Esto signif ica que si los archivos de texto se usan paraalmacenar nmeros grandes, no sern efrcientes ya que ocuparn mucho espacio. Unabuena idea es abrir el archivo en modo binario v usar las funcions f read v fwrite.

    Volumen 6: Tpicos Avanzados Unidad 1: Manejo de Archivo en C 1 13O Copyright IBM Corp 2006

    Los materiales del curso no pueden ser reproducidos totalo parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Proqramacin con C Gua del Estudiante

    4. Manipular Archivos de Datos Sin FormatoEl lenguaje C provee una amplia variedad de formas para representar los datos dentrodel programa. Los datos pueden ser almacenados en estructuras de datos complejascomo arreglos, estructuras o uniones. El alcanc;e de los elementos de estos tipos dedatos est limitado al del programa; estas entidades no existen ms all de la ejecucindel programa. Puede tenerse un requerimiento en el que estos datos sean persistentesentre dos ejecuciones del programa, para esto C provee una solucin a travs de unafaci l idad para manipular t ipos de datos sin fornlato.

    Es posible hacer f luir cualquier t ipo de dato definido en C (arreglos, uniones oestructuras) a un archivo de datos y recuperar los datos de vuelta a variables del mismotipo de dato, usando las funciones de l ibrera de C f read ! f write. Estas funcionesson llamadas funciones de lectura / escritura sin formato.

    Los archivos de datos sin formato se llaman as porque contienen algn texto sinformato. No se pueden abrir y ver con un editor de texto.

    Las funciones f read y fwrite requieren de los siguientes cuatro argumentos:. Un apuntador a bloque de datos.. E l tamao del b loque de datos.o El nmero de bloques de datos que estn siendo manipulados en la

    transferencia.r Un puntero de flujo.

    El siguiente es un uso tpico de f\^/r i te.f w r i t e ( a s L u d , s i z e o f ( L I S T A _ N O T A S ) , 7 , m a r k _ p t r ) ;

    Aqu, stud es la variable estructura del t ipo LrSTA_NoTAS, y mark_ptr es le punterode f lujo asociado con el archivo de datos (historial . dat en nuestro ejemplcl). rindica el nmero de bloques que estn siendo transferidos. El operadorsizeof (LrsTA_NoTAS) retorna el nmero de bytes requeridos para una estructuraque es entrada.

    Ejempfo 1.7: Crear un Archivo de Datos Sin Formato de NotasEl cd igo C in ic ia aqu . . .

    1 . / * P r o g r a m a p a r ae s t u d i a n t e s * /

    c rear un arch ivo con las no tas de

    2 . / * a r c h i v o d e C a b e c e r a * /3 . # i n c l u d e < s t d i o . h >

    4 . #de f i ne TAMANIO 25 . / * E s t r u c t u r a * /

    6 . t y p e d e f s t r u c t {7 . c h a r i d n o [ 9 ] ;

    Volumen 6: Tpicos Avanzados Volumen 6: Tpicos Avanzados 114

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la amacin con C

    B . c h a r n o m b r e [ 4 5 ] ;9 . f l o a t n o t a s [ 6 ] ; / * N o t a s d e l o s 6 c u r s o s * /r ^ I r r a m t u . J L l s l A N U T A S ;1 1 . / * F u n c i n p a r a o b L e n e r d a t o s d e l u s u a r i o y a f m a c e n a r l o e n

    a r c h i v o * /

    7 2 . v o i d a - L m a c e n a r D a L o s ( ) {1 3 . F I L E * i n m a r k _ p t r ;44 . L ISTA_NOTAS in_s tud ITAMANIO] ;1 5 . i n t j , k ;1 6 .

    7 7 . / * A b r i r a r c h i v o m o d o e s c r i t u r a * /

    1 8 . i n _ m a r k _ p t r = f o p e n ( " h i s t o r y . d a t , ' , " w b " ) ;1 9 . / * L e e r l o s d a t o s d e t o d o s l o s e s t u d i a n t e s d e l

    u s u a r i o * , /v - n .

    w h j - l e ( k < T A M A N I o ) {p r i n L f ( " f n t r o d u z c a I D N O \ n " ) ;s c a n f ( r r e s ' t , i n s t u d t k ] . j d n o ) ;f f l r r c l r / c t - d i n \

    \ u L v f r / t

    p r i n t - f ( " l n g r e s e e 1 N o m b r e \ n " ) ;s c a n f ( r r e s r r , n s t u d [ k ] . n o m b r e ) ;p r i n t , f ( " I n g r e s a r l a s n o t a s d e 1 o s 6 c t r r s o s \ n " ) ;f n r ( ; - O . i . \ I

    , t b , ' J t t - l f

    00 1p r i n t f ( " N o t a s d e - L o s C u r s o s N o : % dl O 1 0 O l \ n " , j + 1 ) ;s c a n f ( r r o - f r r , & i n s t u d l k l . n o t a s t j J ) ;

    ) w h i l e ( ( i n _ s t u d [ k ] . n o t a s t j I . o ) | I \i n _ s t u d l k l . n o t a s I j ] > 1 0 0 ) ) ;

    lk + + ;

    )f o r ( k = 0 ; k c T A M A N I O ;

    f w r i t e ( r i n s L u d I k l ,L , i n _ m a r k _ p t r ) ;/ * C e r r a r a r c h i v o * /

    f c l o s e ( i n m a r k p t r ) ;

    Volumen 6: Toicos Avanzados Unidad 1: Manejo de Archivo en C 1 15

    @ Copyright l tsM Corp. 2006Los materiales del curso no pueden ser repr"oducidos total

    o parcialmente sin el permiso previo escr i to de IBM

    2 0 .

    2 r .2 2 .

    2 3 .

    2 4 .

    2 5 .

    2 "7 .

    2 8 .

    2 9 .

    3 0 .

    3 1 .

    3 2 .

    3 3 .

    3 4 .

    3 6 .

    3 7 .

    3 8 .

    3 9 .

    4 0 .

    4 L .^ ) ]

    I

    k + + )s i z e o f ( L I S T A N O T A S ) , \

  • !"tro9g."0", l, Ptogr"t Gua del Estudiante

    4 3 . f * L e e r l o s d a t o s d e l a r c h i v o e i m p r i m i r l o s * /

    44. vo id recuperar l - laLos O {45 . F ILE *ou t -__mark *pL r ;

    46 . L ISTA_NO' IAS ou t_s tud IS IZE ] ;4 7 . i n t j , k ;4 8 .4 9 . / * A b r i r a r c h i v o m o d o l e c L u r a * /5 0 . o u L _ _ m a r k _ p L r = f o p e n ( " h i s t o r y . d a t " , " r b " ) ;51 . f * Lee r t - odos l os da tos de l es tud ian te de l a r ch i vo * /

    5 2 . k = 0 ;

    s 3 . w h i l e ( k < T A M A N I O ) {f r e a d ( e o u t _ s L u d l k l , s i z e o f ( L I S T A _ N O T A S ) , 1 , \^ r r l - m - r l n l - r \ .

    ' | } ' ' L | '

    k + + , '

    5 8 . / * C e r r a r a r c h i v o * /

    59 . f c ]ose (ou t_mark_p t r ) ;6 0 . f o r ( k = 0 ; k < S I Z E ; k + + ) {

    p r i n L f ( " \ n ? s : % s \ n " ,ou t_s tud Ik ] . idno ,ou t_s tud Ik " ] .nombre) ;p r i n t f ( " N o t a s e n l o s C u r s o s : \ n " ) ;f o r ( j = 0 ; j . 6 ; j + + )

    p r i n t f ( " 2 6 . 2 f \ n " , o u t s t u d I k ] . n o t a s t j l ) ;

    5 4 .

    5 5 .

    5 6 .

    5 7 . )

    6 1 .

    6 2 .

    6 3

    6 4 .

    6 5 .I

    o o l

    b / . I

    o t t

    6 s . m a i n O {7 0 . a l m a c e n a r D a t o s O ;7L recupe ra rDa tos O , .7 2 )

    El cdigo C termina aqu

    El tnico cambio signif icativo que se ha hecho al ejemplo anterior es el uso de la funcinfw:' i te en vez de la funcin rprinLf . Note que tambin se ha usado el operadorl lanrado sizeof, el cual sirve para obtener el nmero de bytes requeridos para unaesti rjctura de entrada.Fin del Ejemplo 1.7

    Volumen 6: Tpicos Avanzados Volumen 6: Tpicos Avanzados 116

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrto de IBM

  • Gua del Estudiante lntroduccin a la programacin con C

    ResumenAhora que ha completado esta unidad, usted debe ser capaz de:

    . Reconocer reas de solucin de problemas que requieran la necesidad de leer yescribir datos en disposit ivos de almacenamiento secundario.

    o Discutir cmo manipular archivos de datos en C.. Discutir los mtodos para manejar archivos orientados a f lujo en c.. Describir diferentes funciones de l ibrera que ayudan a crear, leer y escribir

    archivos de disco.

    Volumen 6: Tpicos Avanzados Unidad 1: Manejo de Archivo en C 117

    @ Copyright IBM Corp 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Unidad 1: Examen de Autoevaluacin1) Asuma que se desea ingresar como entrada una cadena de caracteres (string) y

    l levar lo a un arreglo l lamado char mist r ing [50] ; . Culde las s igu ientesfunciones ser la ms adecuada para este propsito?a) gets(miString);b) scanf("%s", &miString);c) getc(miString);d) fscanf(fp, "%s", &miString);

    2) Dnde est la estructura l lamada rrLs definida como una macro?a) ctype.hb) stdio.hc) str ing.hd) s td l ib .h

    3) Uno de los mayores problemas de los archivos de datos es que los programadorestienen que manejar los buffers.a) Verdadero.b) Falso.

    4) Si un archivo se va abrir en modo slo lectura, el archivo debe existir.a) Verdadero.b) Falso.

    5) Si un archivo se abre en modo escritura, y si el archivo ya existe, el archivo viejo esborrado, y un nuevo archivo se crea.a) Verdaderob) Falso

    6) Cules de las siguientes actividades se realizan cuando un archivo se abre enmodo lectura?a) Una asociacin se establece entre el nombre del archivo y el rea de buffer.b) Se hace una verif icacin para determinar si el archivo existe y puede ser

    abierto en modo lectura.c) Un puntero se crea para apuntar al primer carcter que pueda ser ledo delltro

    del archivod) Todas las anteriores.

    Volumen 6: Tpicos Avanzados Volumen 6: Tpicos Avanzados 1 18

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrilo de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    7) Cules de las siguientes se puede usar para leer y escribir archivos de datos conformato?a) fscanfb) fprintfc) freadd) fwrite

    B) Cules de los siguientes se puede usar para leer y escribir archivos de datos sinformato?a) fscanfb) fprintfc) freadd) fwrite

    9) En un archivo de texto, el carcter de nueva lnea esa) Escrito como es y/o ledo como es.b) Traducido a los caracteres cR y Ltr.c) Traducido slo al carcter cR .d) Traducido slo al carcter r- ' .

    10) En un archivo binario, el carcter de nueva lnea esa) Escrito como es y/o ledo como es.b) Traducido a los caracteres cR y Ltr .c) Traducido slo al carcter cR .d) Traducido slo al carcter r,r -

    Volumen 6: Tpicos Avanzados Unidad '1: Maneio de Archivo en C 1 19

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin r:on C Gua del Estudiante

    Rrespurestas a la Unidad 1: Examen de Autoevaluacin1 ) a2 ) b3) b4 ) a5 ) a6) d7 ) a y bB ) c y de) b

    1 0 ) a

    Volumen 6: Tpicos Avanzados Volumen 6: Tpicos Avanzados 120

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Proqramacin con C

    Unidad 2: Laboratorio de Manejo deArchivos en C

    Objetivos de Aprend izaeAl f inal de esta unidad, usted ser capaz de:

    . Usar archivos de datos para solucionar problemas.

    . Usar archivos de texto en C para solucionar problemas tpicosr Emplear archivos sin formato en un programa en C.

    Volumen 6: Tpicos Avanzados Unidad 2: Laborator io de Manejo de Archivos en C 121

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Proqramacin con C Gua del Estudiante

    Ejercicios de Laboratorio1) Considere un archivo de texto que contiene oraciones en el idioma espaol. Los

    caracteres de puntuacin comunes son: punto, coma y los signos de interrogacinque pueden estar todos presentes. El problema consiste en leer el archivo de textoy contar el nmero de ocurrencias de palabras de una letra, palabras de dos letras,palabras de tres letras, palabras de cuatro letras, y todas aquellas palabras conms de cuatro letras. El programa debe imprimir el nmero de ocurrencia de cadatipo de palabras, tal como se muestra a continuacin:

    Nmero de palabras de una letra = 23Nmero de palabras de dos letra = 55Nmero de palabras de tres lelra = 124Nmero de palabras de cuatro letra = 43Nmero de palabras mayor a cuatro letras = 39

    2) Considere la estructura l lamada nombre que t iene un primer_nombre,segunclo_nombre y apell ido, cada uno es un arreglo que contiene 45caracteres. Escriba un programa que cree un archivo de datos sin formato quecontenga una l ista de nombres para un nmero determinado de personas basadosen la estructura definida, que sean ledos como entrada desde el teclado" Ahora,usando el mismo archivo de texto, leer los nombres y crear otro archivo con losnombres ordenado de la forma apelt ido, primer nombre y segundo nombre

    Unidad 2: Laboratorio de Maneio de Archivos en C Vofumen 6:Tpicos Avanzados 122

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    unidad 3: Garactersticas Adicionales de

    Objetivos de Aprend izajeAl f inal de esta unidad, usted ser capaz de:

    . Declarar y usar enumeraciones en C.

    . Describir los argumentos de la l nea de comandos.' Definir las directivas del procesador ms comunes y usarlas en los programas.

    volumen o. toptcos Avanzactos Unidad 3: Caracterst icas Adicionales de C 123

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • lntroduccin a la Programacin con C Gua del Estudiante

    1. lntroduccinEsta unicJad cubre diferentes tpicos que van desde la enumeracin hasta las directivasdei preprocesador. Un programa grande en C usa casi todas las facilidades que sepresentan en esta unidad, junto con las estructuras de control y tipos de datosrelevantes estudiados en la Unidad 1 - Maneio de Archivos en C.

    2. EnumeracionesExisten muchas entidades en un sistema dado, las cuales pueden contener uno de unconjunto posible de valores. Por ejemplo, la entidad color puede tener el valor azuf ,ver:de, amari l to, rojo y as sucesivamente. Similarmente, la entidad f lor puedecontener el valor r, lsa, girasol, l i r io y as sucesivamente. Para capturar estasentidades definidas por el usuario y sus posibles valores, el lenguaje C provee unmtodo poderoso a travs de la enumeracin.

    Considere los siguientes casos. Un t ipo de dato booleano puede ser verdadero o falso.Un usuario puede ponerse slo uno de las siguientes piezas de vestir: jeans, pantaln,o bermudas. Un usuario puede desear cult ivar f lores y slo una de las siguientes: rosa,l ir ios, margaritas, narcisos o claveles.

    En todos los casos anteriores hay un conjunto de valores para un tipo de dato particulary las variables de este t ipo de dato pueden contener slo uno de esos de valores en unmomento determinado. Para representar esta situacin del mundo real en un programaen C, se puede usar el t ipo de dato l lamado enum .

    La sintaxis es la siguiente:enum nombre - de I - enumerado { miembrol , miembro2 , . . . ,rniembron i ;

    Una vez definida la sintaxis, se presenta una forma de representar el t ipo f lor en C.

    Ejemplo 3.1: Tipo FlorSuponga que se quiere definir un t ipo de dato para almacenar los diferentes t ipos deflores. Sea las siguientes declaraciones de enumerados:

    enum f l o r { rosa , 1 i r i o , marga r i - t a , na rc i so , c laveJ - } ;e n u n f l o r a l i c i a , j e s s i c a , s h i r l e y , s t e - ' : f i , .

    Note que la enumeracin contiene cinco constantes: rosa, 1ir io, margari-ra,n a r c i s o y c 1 a v e 1 .

    Aqu, enum eS una palabra reservada. nombre-def -enumerado S un nombre opcional

    que ident i f ica la enumeraci. miembrol, miembro2, etc. Son las constantes de laenumeracin y deben ser distintos de otro identificador usado.

    Se ha de f in ido , a f i ce , jess ica , sh i r ley ! s te f f i como var iab les de l t ipo f 1or .Combinando los dos anter iores, la siguiente declaracin es equivalente:

    Unidad 3: Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 124

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    e n u m f l o r { r o s a , l i r i o , m a r g a r i L a , n a r c i s o , c l a v e f }a f i c e , j e s s i c a , s h i r l e y , s t e f f i ;

    Nota: El nombre-def -enumerado Bspecif icado no siempre es requerdo.

    Lo cual s igni f ica, que puede tambin ser escr i to como sigue:

    e n u m { r o s a , l i r i o , m a r g a r i L a , n a r c i s o , c l a v e l } a l i c e ,j e s s i c a , s h i r J e y , s L e [ [ i ;As a rosa se le as igna a 0 , I i r io s le as igna 1 , margar i ta se le as igna 2 y as sucesivamente hasta alcanzar clavel, al cual se le asigna +. El usuario puedesobrescr ibir la asignacin automtica de los valores enteros para las constantesenumeradas. Por ejemplo, en una sentencia de asignacin, se puede escr ibr miembro= int en la def inic in/declaracin de la enumeracin, Sea la siguiente declaracin:

    e n u m f l o r { r o s a = 3 , l i r i o , m a r g a r i t a , n a r c i s o : 1 0 , c l a v e f) t

    E s t o a s i g n a 3 r o s a , 4 l i r i o , 5 a m a r g a r i t . a , 1 0 n a r c i s o y 1 1 a c l a v e 1 .

    Es posible para dos constantes enumeradas tener el mismo valor entero asignado. Lasvariables enumeradas se pueden usar de la misma forma que las variables enteras entrminos de las operaciones que soportan. Sin embargo, las constantes enumeradas nopueden ser ledas como entrada o mostradas como salida.

    Fin del Ejemplo 3.1Una vez visto esto, se presenta otro ejemplo que define la enumeracin de diferentesmarcas de pasta de dientes y define su asociacin con diferentes miembros en unafami l ia .

    Ejemplo 3.2: Tipo de Pasta de DientesSe puede definir una enumeracin para pasta de diente como sigue.

    e n u m p a s L a d e _ d i e n t e s { c o - l g a l e , c l o s e u p , f o r ] r a n s , a n c h o r ,n o n c n r l a n

    " , _ . -___ , , , t ] ;Basado en esto, se puede tener las siguientes sentencias vlidas en C:

    El cdigo G comienza aqu. . .1 . e n u m p a s t a _ d e _ d i e n t e s r n i P a s t a , m i E s p o s a , m i H i j o , m i H i j a ;2 . m i P a s t a : c o l g a t e ;3 . m i E s p o s a = a n c h o r ;4 . i f ( m i u i j o = = c l o s e u p ) {5 .- ' lc ) . t

    Volumen 6: Tpicos Avanzados Unidad 3: Caractersticas Adicionales de C 125

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • lntroduccin a la amacin con C Gua del Estudiante

    7 . e l s e8 . m i H i j a = ( p a s t a _ d e _ d i e n t e s ) ( ( m i P a s t a + m i E s p o s a ) % 2 ) ;9 . s w i t c h ( m i u i j o {1 0 . c a s e c o f g a t e :1 1 . c a s e f o r h a n s :' t ) l

    El cdigo C f inal iza aqu

    Fin del Ejemplo 3.2La enumeracin aumenta la claridad de la lgica del programa. Nmeros mgicos(valores codif icados) usados en el programa tienden a reducir la legibi l idad y a hacerdifci l el mantenimiento del programa. Por ejemplo, si se intercala generosamente elnmero 3,141 en el programa, no es evidente para el que lee el programa que se estrefir iendo al nmero pi. Similarmente, si se t iene 1 para representar la pasta de dientesColgate, 2 para Closeup, etc. se agrega una carga mayor para leer y entender elprograma. Las variables enumeradas y los valores ayudan a adherirse a lo que eslgico y normal, dentro del dominio part icular de una aplicacin.

    Nota: La enumeracin no provee una nueva capacidad, es slo una mejora a la claridaddel programa.

    3. Argumentos de la Lnea de Comandos para la funcinmain O .Se sabe que la funcin main S el punto de entrada al programa. En los ejemplospresentados hasta ahora se ha usado el main sin argumentos. Es posible que rnaintome parmetros de entrada desde fuera. Esto se logra teniendo dos argumentos en lafuncin main l lamados argc y argv. argc es un variable entera.

    argv es un arreglo de punteros a caracteres, o un arreglo de cadenas de caracteres(str ings).Aqu, cada cadena de caracteres en el arreglo representa un parmetro que est siendopasado ? main. argc indica el nmero de parmetros pasados de esta forma. Elprototipo de la funcin main tiene estos dos parmetros y se muestra a continuacin.

    m a i n ( i n t a r g c , c h a r * a r g v [ ] ) {

    l

    Se puede ejecutar un programa C desde dentro de un men de compilador para C(como en Windows), o desde el nivel de SO como un comando (como en Unix). Porejemplo, en Unix, se puede ingresar el programa paru ser ejecutado como sigue:

    Unidad 3: Caracterst icas Adicionales de C Volumen 6: Tpicos Avanzados 126

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Int roduccin a la programacin con C

    m i p r o g

    El programa ejecutable, aqu, se l lama rnipros, el cual puede tambin ser ejecutadocomo:

    m i P r o g c o l g a t e a n c h o r

    Se puede pasar argumentos para un programa a travs de la l nea de comandos, comose muestra a continuacin:

    m r P r o g c o l g a t e a n c h o r

    La versin generalizada del cdigo anterior es como sigue:nombre -de1 -p rog rama pa rame t ro l pa rame t ro2 . . . pa rame t ron

    En el caso anterior, los parmetros son asignados a los argumentos como se muestraen l a Tab la 3 .1 .

    Argumentos Valoresa r g c 3a r g v [ 0 ] m i D r n a r r l ' 1 I

    a r g v [ 2 ] ancho rTabla 3.1: Parmetros Asignados a los Argumentos en la Funcin main.

    Los argumentos pasados a un programa a travs de la l nea de comandos usualmentese delimitan con espacios en blanco o tabulaciones. A continuacin se presentanalgunos ejemplos para entender el uso de la l nea de comandos con argumentos.Ejemplo 3.3: Usar argc, argvEl cdigo C comienza aqu . . .1 . / * a r c h i v o d e c a b e c e r a * /2 . # i n c l u d e < s t d i o . h >3 . / * l , a f u n c i n m a i n c o m i e n z a a q u * /

    4 . m a i n ( i n t a r g c , c h a r * a r g v [ ] ) {5 . i n t k ;6 . p r i n t f ( " E l v a l o r d e a r g c e s ? d \ n " , a r g c ) ;7 - f o r ( k = 0 ; k < a r g c ; k + + )B . n r i n t - f ( t t a v t r ? d e S ? S \ n " , k , a f g v [ k ] ) ;e . )El cdigo C finaliza aqu

    Volumen 6: Toicos Avanzados Unidad 3: Caracterst icas Adicionales de C 127

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacirin con C Gua del Estudiante

    Se sabe que argc contiene el nmero de parmetros pasados en la l nea decomandos, as que se configura una estructura iterativa que ayude a imprimir losargumentos.

    Fin del Ejemplo 3.3Ejemplo 3.4: argc, argv en un Aplicacin Tpica

    En este ejemplo se i lustra el uso de argc y argv en una aplicacin tpica que copia unarchivo a otro. Sin embargo, no se escribir la lgica (o las sentencias que hacenrealmente la copia) sino que simplemente se presenta la estructura para pasarargunrentos a travs de la l rrea de comandos. Hay que recalcar que en un SO comoUnix, se puede decir lo siguiente:

    cp a rch i vo l a r ch i vo2

    Se debe tener la posibi l idad de leer los dos nombres de archivo como argumentos. Elsiguierrte fragmento de programa hace eso:

    El crl igo G comienza aqu...1 . / * A r c h i v o d e c a b e c e r a * /

    2 . # i n c l u d e < s t d i o . h >

    3 . / * L a f u n c i n m a i n i n i c i a a q u * /

    4 . r n a i n ( i n t a r g c , c h a r * a r g v [ ] ) {5 . / * B u f f e r s p a r a d o s a r c h i v o s * /

    6 . F I L E * i n _ f i f e , * o u t _ f i l e ;' 7 . / * A b r i r u n a r c h i v o p a r a l e c L u r a * /

    B . i n _ f i l e = f o p e n ( a r g v [ 1 ] , " r " ) ;f . i f ( i n _ f i l e = = N U L L )1 0 . p r i n t f ( " O c u r r i o u n e r r o r a b r i e n d o e l a r c h i v o \ n " ) ;1 1 . e l s e {12 ou t_ f i l e = f open (a rgv [ 2 ) , , , \ ^ / , ) -1 3 . i f ( o u t _ f i l e = = N J L L )7 4 . p r i n t f ( " E r r o r e n e l a r c h i v o d e s a l i d a \ n " ) ;l s . e f s e {16 / * Cop ia r e l a r ch j - vo de en t rada a I a r ch i vo

    d e s a l i d a * /

    7 7 . . }

    1 8 . )1 9 . / * C e r r a r e l a r c h i v o * /

    2 0 . f c l o s e ( i n f i l e t ;2 L . )

    rJnid;d 3: Caracterstic:as Adicioales de C Volumen 6: Tpicos Avanzados 128

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialrnente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la proqramacin con C

    El cdigo C termina aqu

    Fin del Ejemplo 3.4

    4. Directivas del PreprocesadorEl pre-procesamiento es el paso que precede a la compilacin. Existen ciertasdirectivas, llamadas directivas del compilador, provistas en C, las cuales puedencontrolar el cdigo objeto producido. La siguiente es una l ista de estas directivas:

    . #definer #undef. #if. #elif. #else. #endifo #ifdefo #ifndef. # l ine. #include

    El preprocesador incluye los siguientes operadores especiales:. defined. # #

    Estas directivas pueden aparecer en cualquier lugar dentro del programa. Sin embargo,se usan generalmente al comienzo de un programa, por compilacin condicional delcdigo.

    A continuacin se discuten las directivas del preprocesador agrupadas en macros,instrucciones de inclusin condicional e instrucciones de inclusin de archivos.

    4.1. Inst ruccones de Inc lus in de Archivos

    Cualquier l nea en el cdigo fuente de la forma:# inc lude "nombre "

    o

    # i n c l u d e < n o m b r e >

    Reemplaza a 'nombre' con el contenido del archivo al que se refiere.

    Volumen 6: Tpicos Avanzados Unidad 3. Caracterst icas Adicionales de C 129

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del EstutJiante

    La inclusin de archivos facilita el manejo de definiciones de macro y definiciones devariables globales entre archivos de un mismo programa fuente.

    Si el nombre del archivo a incluir se encierra entre comil las dobles (""), la bsqueda delarchivo comienza donde se encuentre el archivo que t iene la sentencia #incl-ude; sino se encuentra el archivo, o si el nombre se delimita por (< >), la bsqueda sigtle laruta predefinida por la implantacin del compilador para encontrar recursos al monlentode hacer algn enlace (esta ruta es la usada cada vez que se incluye una biblioteca).

    La inclusin de archivos es la mejor forma de enlazar declaraciones para un p'ogramagrande. Garantiza que todos los archivos fuente se suplirn con las mismas definicionesy declaraciones de variables. La ubicacin de las sentencias #include es por logeneral al principio de los archivos fuente que la uti l izan. Un archivo incluido puedecontener l neas #include .

    4.2. Macros

    Recuerde como se us anteriormente la siguiente sentencia para definir constantessimblicas:

    # d e f i n e P I 3 . 1 4

    Tpicamente en los programas se encuentra un fragmento de cdigo simple, el cual sepuede usar para ejecutar una tarea part icular. Por ejemplo, el clculo del rea de uncrculo puede ser este segmento de cdigo simple. Lenguaje C provee una forma demanejar estos segmentos de cdigo simples usando las macros para definir unaexpresin o un grupo de expresiones como un solo identif icador. La funcionalidadprovista por las macros es la misma que las funciones en C, aunque la forma en que elcompilador las maneja es un poco diferente a la forma como maneja las funciones.Cuando la macro es referenciada, la referencia se reemplaza por definicin completa dela macro. De otra forma las funciones y las macros t ienen la misma funcionalidad.

    Una vez presentadas, es importante notar las ventajas de las macros con respecto a lasfunciones. Las macros proveen una mejor velocidad de ejecucin en comparacin conlas funciones. El costo adicional de las l lamadas a una funcin con respecto al manejode la pi la, la l lamada y el retorno no estn presentes en las macros. Sin embargo lasmacros incrementan el tamao del cdigo objeto. Cuando se usan las macros, losprogramadores deben decidir entre el tamao delejecutable y la velocidad de ejecucin.Las referencias a macros tienen tambin ciertas desventajas. Sin embargo, se necesitaentender las macros bien antes de discutir las. Vase a continuacin algunos ejemplosdel uso de las macros.

    Unidad 3: Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 130

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la proqramacin con C

    Ejemplo 3.5: Una Macro para elrea de un CrculoEl cdigo C in ic ia aqu . . .1 . / * A r c h i v o d e c a b e c e r a * , /

    2 . # i n c l - u d e < s t d i o . h >3 . # d e f i n e a r e a d e f c i r c u l o 3 . 1 4 1 * r a d i o * r a d i o4 .

    5 . / * L a f u n c i n p r i n c i p a l s e i n i c i a a q u * /

    6 . m a i n O {l . f l o a t r a d i o ;B . d o {9 . p r i n t f ( " I n g r e s a r e f r a d i o [ O - l Z l 6 ' 7 I : , ' ) ;1 0 . s c a n f ( " e f " , & r a d i o ) ;1 1 . ) w h i l e ( r a d i o < 0 l l r a d i o > 3 2 1 6 " / ) ;1 2 . p r i n t f ( " E l a r e a d e f c i r c u l o e s = % f \ n " , \1 3 . a r e a d e l c i r c u l o ) ;1 4 . )El cdigo C f ina l iza aqu

    Aqu area_def_c i rcu lo es una macro que def ine una expres in : . r+ l * rad io *radio. Durante el proceso de compilacin, area def circulo se sustituye por laexp res in 3 .141 * rad io * rad io .F in del E jemplo 3.5Considere un caso, donde un grupo de sentencias realiza un trabajo. El conjunto deexpresiones se pudo escrbir en ms de una lnea. Cmo se hace para representar losmismos con una macro? En este caso, cada lnea de la macro debe terminar con elcarcter barra oblicua (back-slash).Ejemplo 3.6: Macros Mult i- l neaA continuacin se escribe una macro que calcula el MCD de dos enteros posit ivos. Noteque la macro requiere mlt iples l neas.

    El cdigo C in ic ia aqu . . .1 . / * A r c h i v o d e c a b e c e r a * /

    2 . # i n c l u d e < s t d i o . h >3 . / * \ l n a m a c r o m u l t i - l n e a p a r a M C D * /

    4 . # d e f i n e M C D w h i l e ( x l = O & & y l = 0 ) \5 . i f ( x > = y ) x = x % y ; \

    Volumen 6: Tpicos Avanzados Unidad 3. Caracterst icas Adicionales de C 13'1

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    6 . e l s e y = y % x ; \7 - i f ( x = = 0 ) r e s p u e s t a = ] - , \B . e l s e r e s P - . i e s t a = x ;9 .1 0 " / * L a f u n c i n m a i n s e i n i c i a a q u * /

    , l t lr r . m a f n ( l fL 2 . i n t x , y , r e s p u e s L a , a , b , '

    1 3 . / * L a e n t r a d a x y y a q u * /1 4 . d o {1 5 . p r i n L f ( " \ n r n g r e s a r u n e n t e r o [ 1 - 3 2 ' 7 6 7 1 : " ) ;1 6 . s c a n f ( t ' ? d " , & x ) ;1 7 . ) w h i l e ( x < 1 | | x > 3 2 7 6 ' 7 \ ;1 8 . d . r {1 9 . p r i n t f ( " \ n r n g r e s a r o t r o e n t e r o [ 1 - 3 2 7 6 7 ] : " ) ;2 0 . s c a n f ( r r e d r ' , & y ) ;2 L . ) w h i 1 e ( y < 1 l l y > 3 2 7 6 1 ) ;2 2 - a = x - ;

    2 3 . b = ) ' i2 4 . M C I ) / * R e f e r e n c i a d e m a c r o * /2 5 . p r i n t f ( " M C D d e % d y ? d e s ? d | " , d , b , r e s p u e s t a ) ;2 6 . )

    El cdigo C f inal iza aqu

    Como se puede ver en la macro, las mltiples lneas finalizan con el carcter \, exceptola lt ima lnea. Esta se trata como una sentencia compuesta. Tambin note que en lafuncin main, se ha escrito MCD sin la coma. Cuando el compilador lee esta referenciade macro, esta referencia se susttuye con el cuerpo de la macro.

    El alcance de un nombre definido con #def ine va desde su punto de definicin hastael f in del archivo fuente que se est compilando. Una definicin puede empleardefiniciones previas. Las substituciones se realizan slo para elementos y no dentro decadenas constantes delimitadas por comil las

    El cdigo C in ic ia aqu . . .1 . / * A r c h i v o d e C a b e c e r a * /

    2 . # i n c l u d e < s t d i o . h >

    3 . / * M a c r : o m u f t i - l n e a p a r a M C D * /

    4 . / * L a f u n c i n m a i n i n i c i a a q u * /

    Unidad 3: Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 132

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C] , I5 . m a r n ( ) t

    6 .

    7 .

    8 .

    9 .

    1 0 .

    1 3 .

    L 4 .

    i n f ' ! a \ / r o q n r r < | - A h ., , ,

    . J ' r v q r s t p ,

    / * E n t r a d a x y y a q u * /o o t

    p r i n t f ( " \ n f n g r e s e u n e n t e r o L a - 3 2 7 6 ' / l : " ) ;S c a n t ( r r e d ' r , & x ) ;

    1 1 . ) w h i l e ( x < 1 | | x > 3 2 7 6 7 ) ;1 2 . d o {

    p r i n t f ( " \ n I n g r e s a r o t r o e n t e r o l t - 2 2 7 6 7 I : " ) ;q c n f ( r 9 l r f , . r \ .

    , s I t ,

    1 5 . ) w h i 1 e ( y < 1 I I y > 3 2 7 6 7 ) ;7 6 . a - x iI 7 . b = y ;1 8 . w h i l e ( x ! - - 0 & & y l = 0 )

    i f ( x > = y )x - X 9 " y i

    e l s e

    y = y Z x ;2 3 . i f ( x = = 0 )2 4 . r e s p u e s t a - y ;2 5 . e l s e2 6 . r e s p u e s t = X i2 7 . p r i n t f ( " M C D d e % d y % d e s % d r " , d , b , r e s p u e s t a ) ;2 8 . i f ( x : : 0 & & y : : 0 )

    p r i n E f ( " \ n A m b o s e n t e r o s i n g r e s a d o s s o n 0 " ) ;

    1 9 .2 0 .2 r .2 2 .

    2 9 .3 0 . )El cdigo C f inal iza aqui

    Fin del Ejemplo 3.6Una referenca a una macro dentro de un programa seala al compilador reemplazar lareferencia por las sentencias contenidas dentro de una definicin de macro. Unadefinicin de macro puede tambin contener argumentos encerrados dentro deparntesis, como se muestra a continuacin:

    # d e f i n e M C D ( v a r x , v a r y ) w h i l e ( v a r x l = 0 & & v a r y l = 0 )\

    i f ( va r_x >= va r_y ) va r_x = vd l_X ? va r_y ; \e l se va r va r_y Z va r x ; \

    Volumen 6: Tpicos Avanzados Unidad 3: Caracterst icas Adicionales de C ' , |33

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    i f (var_x == 0) var_respuesta = var -y ; \e lse var_respuesta = var_x ;

    En este caso, la referencia a la macro se asemeja a la l lamada a la funcin, comoM C D ( x y ) .

    Ahora, que se ha entendido bien el concepto de macros, se vern las dificultades deusar macros dentro de los programas. Conocer tanto las desventajas y ventajas de lasmacros, ayuda al programador a decidir la conveniencia de usarlas-

    El uso de los parntesis dentro de las macros puede resultar en efectos secundariosaltamente indeseables. El siguiente es un excelente ejemplo del efecto secundario deuna macro:

    #de f i ne ra i zcuadrada ( x , y ) sq r t ( x *x + y *y )Si se usa este como:

    r a i z c u a d r a d a ( x + 1 , v + 2 )se debera tomar:

    s q r t ( ( x + 1 ) * ( x + 1 ) + ( y + 2 ) * ( y + 2 ) )Pero por la sustitucin de la macro, se obtiene lo siguiente:

    s q r t ( x + 1 * x + 1 + y + 2 * y + 2 )

    La cual no es lo que se desea. Este efecto secundario ocurre principalmente cuando sepasan argumentos a las macros. Tambin se considera el ejemplo 3.6 del MCD usandomacros. Si un programador quiere usar recursin, las macros son una mala seleccinya que no pueden l lamarse as mismas recursivamente.

    Sustituir todas las funciones en un programa con macros no ser posible por susl imitaciones inherentes. Las macros, a diferencia de las funciones, verif ican slo elnmero de argumentos pasados, no sus t ipos, lo cual implica que las val idaciones delas entradas errores se hace mejor en las funciones.

    Los nombres definidos con #def ine se pueden hacer' indefinidos' con la instruccin#undef . Las razones por las cuales se puede uti l izar esta instruccin son:

    . Asegurarse que una rutina es realmente una funcin y no una macro.

    . Deshabil i tar en uh ArchivoA. c una macro que posiblemente sea definida en unArchivoB.c, donde ArchivoA.c y ArchivoB.c forman un mismo cdigofuente y no puede cambiarse directamente el contenido de ArchivoB. c.

    Unidad 3: Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 134

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la programacin con C

    4.3. Inst rucc iones de lnc lus in Condic ional

    4.3.1. #ifdef - #endif

    r #irdet signif ica 's esta definido' ( i f defined). #irdet hace que un bloque de cdigo se procese si el nombre de la macro

    est definido.El s igu iente es la forma genera l de # i f def ! #endi f :

    # i fde f nombre de 1a mac ro

    / * " " " " " " a t a

    d e u n a o m s s e n L e n c i a s * /

    # e n d i f

    4.3.2. #ifndef - #endif. # i fnder s ign i f ica 's i no esta def in ido ' ( i f not def ined) . Exactamente opuesto

    a # i f d e f .

    r #e lse es s imi lara l e lse en la est ructura de contro l i f -e tse en C.

    El siguiente es la forma general:

    # i fnde f t rRROR / *eR I tOR es e l non re de 1a mac ro * /

    / * c d i g o p a r a p r o v e e r s a l i d a c o r r e c t a * /

    # e 1 s e

    / * c d i g o p a r a p r o v e e r u n m e n s a j e d e e r r o r * /#end i f

    Tanto las directivas #i f def como #i rndef sirven para asegurarse que ciertocontenicro de un archivo header se incluya una sola vez en un programa fuente,independientemente de las veces que sea incluido el . h en cada archivo que locomponen. Estas son formas especial izadas que prueban si el nombre de una macroest definido.

    4.3.3. #atLa directiva #i-f se puede usar para probar si el valor de una expresin es dist into decero o no.

    Lo siguiente es la forma general:

    # i f exp/ * s e n t e n c i a s ( s ) * /

    # end i f

    Volumen 6: Tpicos Avanzados Unidad 3: Caracterst icas Adicionales de C 135

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    4.3.4. #eli f

    La directiva #etif se puede usar para verif icar mlt iples condiciones en secuencia(rerJuce el nmero de #endif s).

    La forma general se da a continuacin:# i f exP l

    / * s e n t e n c i a ( s ) * /# e l i f e x p 2

    / * s e n t e c i a s ( s ) * /# e n d i f

    4.4. Operadores del Preprocesador

    Las directivas del preprocesador proveen operadores con funcionalidades similares y/ocomplementarias a las directivas condicionales explicadas anteriormente.

    El operador def ined de acuerdo a la siguiente construccin:

    # i f ! d e f i n e d ( M C D )# d e f i n e M C D w h i l e ( x ! = 0 & & y ! = 0 ) \i f ( x > = y ) x = x ? y ; \

    e l s e y = y % x ; \j - f ( x = = . 0 ) r e s p u e s t a = y ; \

    e l s e r e s p u e s t a = x ;# e n d i f

    Este operador permite determinar si la macro MCD fue previamente definida en elprograma fuente. Si la macro no ha sido definida previamente la instruccin #def inerealizar una definicin para dicha macro.

    Al incorporarse estas sentencias a un cdigo fuente completo donde segundo. ccontiene el cdigo anterior y primero. c contiene:

    # i r r c l u d e < s t d i o . h >

    #de f i ne l 4CD respuesLa= 10 ;ma in O {

    i n t x = 3 , y = 2 , r e s p u e s t a , .MCDp r i n t f ( " E I m a x i m o c o m u n d i v i s o - e q . 2 r l \ n r r - o s p u e s t a ) ;

    Unidad 3: Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 136

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Pr

    La salida al compilar, enlazar y ejecutar el fuente formado sera 10, debido la primeradefinicin de MCD esta en el archivo que contiene ra funcin main.

    El operador ## proporciona una forma de concatenar argumentos reales durante laexpansin de una macro. Si un parmetro est en el texto de reemplazo y es adyacentea un ##, dicho parmetro es reemplazado por el argumento real, se el imina el ## y losespacios en blanco que lo rodeen. Vase el siguiente fragmento de cdigo para elpreprocesador:

    # d e f i n e p e g a r ( a d e l a n t e , a t r a s ) a d e l a n t _ e # # a t r sas:

    p e g a r ( e s t u d i a n t e , l )

    crea el token:

    e s tud ian t .e 1

    5. Operacones de Manejo de BitsSe va a estudiar el siguiente ejemplo para entender los operadores de manejo de bits.Considere una unidad de hardware, la cual puede estar conectada a cuatro disposit ivosde hardware. Usando un entero simple que consiste de cuatro dgitos, se puederepresentar la existencia o no de estos disposit ivos de hardware. Si el dgitocorrespondiente al disposit ivo de hardware es 1 esto indica la presencia de undisposit ivo, y 0 indica la ausencia del disposit ivo.

    Los disposit ivos y las posiciones de los dgitos se muestran en la Tabla 3.2.

    Teclado Disposit ivo deCD ROM

    Ratn Puerto serial paraimpresora

    Digito 3 Digito 2 Digito 1 Digito 0

    Tabla 3.2: Posiciones de los Dgitos y de los Disposit ivos

    Para l legar a la conclusin de la presencia de los disposit ivos claramente se necesita lamanipulac in de b i ts .

    La manipulacin de bits es una de las caracterst icas nicas de C. Esto se puedeaplicar solamente a operadores integrales como char y inr, con signo o sin signo.

    5.1 Operadores Lgicos de Manejo de BitsLos siguientes son los operadores lgicos de manejo de bits:

    o $ AND de manejo de bits

    Volumen 6: Tpicos Avanzados Unidad 3: Caracterst icas Adicionales de C 137

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    r I OR inclusivo de manejo de bits.

    A OR exclusivo de manejo de bitsEl operador de manejo de bits amo (a) se usa frecuentemente para enmasrar unconjunto de bits. Sea el siguiente ejemplo:

    a = 3 ' 7 = 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1

    b = B B = 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0

    a & b = 0 4 = 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0

    El operador de manejo de bits oR (l ) se usa para cambiar los bits.a l n = n 9 = o o o o o o o o 0 1 1 1 0 1 1 1

    El operador de manejo de bits oR excrusivo (^) coloca un 1 en cada posicin dondesus operandos t ienen bits diferentes y 0 donde los operandos son los mismos.

    a ^ b = 1 1 5 = o o o o o o o o 0 1 1 1 o o 1 1

    5.2 Operadores de Desplazamento de Bits

    Los siguientes son los operadores de desplazamiento de bits:

    . - desplazamiento a la derechaLos operadores de desplazamiento .< y

    " desplazan al operando, a la izquierda y

    derecha, el nmero de posiciones de bits dado por l operando de la derecha, el cualdebe ser posit ivo. Por ejemplo:

    . x > z desplaza los bits en x, z posiciones a la derecha y asigna 0 a los bitsdesplazados.

    x = 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1x < < 3 = 0 0 1 1 0 1 0 1 1 0 1 1 1 q q 0 _x > > 2 = 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1

    Por ejemplo, en un patrn de 8-bits (1 byte), asuma que cada bit representa algunainformacin acerca del hardware de una computadora. Asuma que el bit 5 (a partir de laderecha, comienza en 0) representa si la computadora tiene una impresora instalada ono. Si est instalada, el bit 5 de este byte representa un 1, de otro modo un 0. Paradeterminar esto, se puede desplazar el byte dos posiciones a la izquierda. De maneraque, el lt imo bit de este byte, despus del desplazamiento, ser un 1 o un 0. Se puedebuscar si este es 1 o 0 para verif icar siel byte es un nmero posit ivo o negativo.

    Unidad 3: Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 138

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la progrqmacin con C

    5.3 Operadores de Manejo de Bi ts - ComplementoLos siguientes son los operadores de complemento de bits:

    - e l complemento de uno (unar io )

    El operadorunario (-)convierte cada 1-bit a un O-bit, y un O-bit a 1-bit.a = 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1- a = 1 1 0 1 0 1 0 0 I 0 1 0 1 0 0 0

    5.4 Operaciones de Manejo de Bi ts: Un EjemploSea el siguiente segmento de cdigo:/ * L a f u n c i n r o t - a c i t r a l a d e r e c h a s e i n i c i a a q u * /u n s i g n e d i n t r i g h L r o t a t e ( u n s i g n e d i n t x , u n s i g n e d i n t n ) {

    u n s i g n e d i n t s e t , i ;p r i n t f ( " T a m a n i o % d \ n " , s i z e o f ( u n s i g n e d i n t ) * B - f ) ;f o r ( i - I ; i < = n ; i + + ) {

    s e t = ( x & 1 )X = X > \ - L ;

    x = x I s e t ;

    )r e t u r n x ;

    )La funcin anter ior toma x, y el nmero de posiciones a ser desplazadas a la derecha, yreal iza la rotacin. La funcin puede ser probada para un valor entero especf ico yp e q U e O , t a l C O m O : x = B V n - I , 2 , 3 x = 4 n = I , 2 x - 2 n = f , . . . .

    Hay muchas formas prct icas relacionadas a las operaciones de manejo de bi ts, lascuales van ms al l del alcance de esta unidad.

    Volumen 6:Tpicos Avanzados Unidad 3: Caracterst icas Adicionales de C 1:9

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    ResumenAhora que /'ra completado esta unidad, usted debe ser capaz de:

    . Declarar y usar las enumeraciones en C.

    . Describir los argumentos de la l nea de comandos para la funcin mainO.

    . Definir las directivas del preprocesador y usarlas en los programas.

    Unidad 3: Ceiacterst icas Adicionales de C Volumen 6:Tpicos Avanzados 140

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin q la programacin con C

    Unidad 3: Examen de Autoevaluacin1) Qu es una directiva del preprocesador?

    a) Una instruccin del compilador al usuario.b) Una instruccin del programador al preprocesador.c) Una instruccin del programa fuente al programa objeto.d) Todas las anteriores.

    2) una macro debe ser restr ingida a una definicin de una sola l nea.a) Verdadero.b) Falso.

    3) No se puede ejecutar operaciones de E/s con constantes enumeradas.a) Verdadero.b) Falso.

    4) Si se t iene un identif icador l lamado scooby, se puede tener tambin una constanteenumerada l lamada scooby.a) Verdadero.b) Falso.

    5) Se puede pasar valores enumerados a una funcina) Verdadero.b) Falso.

    6) En una macro, slo el nmero de argumentos se verif ica pero no sus t iposa) Verdacjerob) Falso.

    7) La macros son realmente identif icadores en esencia. As que, se pueden pasar alas funciones como argumentos.a) Verdadero.b) Falso.

    Volumen 6: Tpicos Avanzados Unidad 3: Caracterst icas Adicionales de C 141

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • lntroduccin a la Programacin con C Gua del Estudiante

    8) En el manejo de archivos de datos, FrLE se usa para crear un puntero a un buffer.Qu es FILE?.a) Un puntero.b) Una funcin.c) Un entero.d) Ninguna de las anteriores.

    9) Las macros pueden definirse y utilizarse en forma recursiva.a) Verdadero.b) Falso.

    10) La definicin de macro se puede hacer de manera anidada.a) Verdadero.b) Falso.

    Unidad 3: Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 142@ Copyright IBM Corp. 2006

    Los materiales del curso no pueden ser reproducidos totalo parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Proqramacin con C

    Respuestas a la Unidad 3: Examen de Autoevaluacin1 ) b2 ) b3) a4 ) b5 ) a6 ) a7 ) aB) de) b

    1 0 ) b

    Volumen 6: Tpicos Avanzados Unidad 3: Caracterst icas Adicionales de C 143

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialnrente sin el permiso previo escr i to de IBM

  • Gua del Estudiante Introduccin a la programacin con C _ 2

    Unidad 4: Laboratorio de GaractersticasAdicionales de G

    Objetivos de Aprend izaeAlfinal de esta unidad, usted ser capaz de:

    ' Leer una descripcin compleja de un problema y entender sus implicaciones.' Usar algoritmos para todas las formas de complej idad considerando todas las

    tcnicas de programacin aprendidas hasta ahora.' lmplementar los algoritmos en C usando cualquiera de las caracterst icas

    aprendidas en el curso.r Probar y entregar un programa completamente funcional que resuelve el

    problema dado.

    Volumen 6: Tpicos Avanzados Unidad 4. Laborator io de Caracterst icas Adicionales de C 145

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total o

    parcialmente sin el previo permiso escr i to de lBM.

  • Introduccin a la Programacin con C - 2 Gua del Estudiante

    Ejercicios de Laboratorio1) Escribir un programa completo en C que haga las siguientes tareas:

    a) Tomar un archivo de texto como entrada que como contenido tenga un textocompleto en espaol, con los signos de puntuacin permit idos.

    b) Modificar el contenido del archivo de texto y crear un archivo separado con lassiguientes caractersticas:

    . Todas las palabras al inicio de la sentencia deben estar en maysculas

    . Los espacios en blanco deben ser removidos.

    . lmprimir las estadsticas del texto, como se menciona a continuacin:- Nmero de caracteres.- Nmero de palabras.- Nmero de espacios en blanco.

    Unidad 4: Laboratorio de Caractersticas Adicionales de C Volumen 6: Tpicos Avanzados 146

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total o

    parcialmente sin el previo permiso escrito de lBM.