1era Parte

Embed Size (px)

DESCRIPTION

IBM

Citation preview

  • Introduccin a laProgramacin con CCdigo del Curso: CY320Versin 3.0

    Gua del Estudiante

    Libro 2: Introduccin ala Programacin con C

    IBM lT Education ServicesWorldwide Certified Material

  • Infr:rrmacin Sobre la Publicacin

    Esta publicacin ha sido producida usando Microsoft Word 2000 y Microsoft PowerPoint20C0 para Windows.

    Malcas Registradas

    lBt\ l@ es una marca registrada por International Business Machines Corporation.

    Otras compaas, productos, y nombre de servicios pueden ser marcas registradas omarcas de servicios de otros.

    Traclemarks of International Business Machines Corporation

    DB;

    l-otus Script

    lnformix

    Net.data

    Marcas Registradas de otras Compaas

    Winrlows, Microsoft Visual Studio

    Sybilse

    Edicin iayo 2007

    Microsoft Corporation

    Sybase Inc.

    La informacin contenida en este documento no ha sido sometida a ninguna pruebafornral de IBM y es distr ibuida bsicamente "como es" sin ninguna garanta ya seaexpresa o implcita. El uso de esta informacin o la implementacin de cualquiera deestas tcnicas es responsabil idad del comprador y depender de la habil idad de stepara su evaluacin e integracin en el ambiente operacional del comprador. A pesar deque cada tema ha sido revisado por IBM para su exactitud en una situacin especf ica,no hay garanta de que obtener el mismo resultado o uno similar a ste en otrasituacin. Los compradores que intenten adaptar" estas tcnicas a sus propiosambientes lo hacen bajo su prooio r iesgtr.Copyright International Business Machines Corporation, 2006. Atl r ights reserved.Este documento no puede ser reproducido en su totalidad o en parte sin el previopermiso escrito de lBM.

    Instrucciones Especiales para la lmpresin de este Gurso:

    No el imine pginas en blanco que puedan aparecer al f inal de cada unidad entreunidades. Estas pginas fueron insertadas intencionalmente.

  • Gua del Estudiante Introduccin a la Prooramacin con C

    Gontenido

    Objetivos de Aprendizaje 71. Introduccin B2. Programar Funciones en C I3. Definicin y Uso de Funciones en la Solucin de Problemas I4. Clases de Almacenamiento5. Archivos de Encabezamiento (header)ResumenUnidad 1: Examen de AutoevaluacinRespuestas a la Unidad 1: Examen de Autoevaluacin

    Unidad 2: Laborator io de Funciones.. . . . . . . . . . . . . 39Objetivos de Aprendizaje

    Ejercicios de Laboratorio

    Objetivos de Aprendizaje1. Introduccin2. Escribir Funciones Recursivas3. Recursin vs. l teracinResumenUnidad 3: Examen de AutoevaluacinRespuestas a la Unidad 3: Examen de Autoevaluacin

    Unidad 4: Laborator io de RecursinObjetivos de AprendizajeEjercicios de Laboratorio

    Objetivos de Aprendizajes1. Fundamentos de Punteros2. Uso de Punteros para Pasar Argumentos a FuncionesResumenUnidad 1:Examen de AutoevaluacinRespuestas a la Unidad 1: Examen de Autoevaluacin

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

    parcialmente sin el previo permiso escr i to de lBM.

    o3 14

    3537

    3940

    4 142434 0

    474B50

    5 152

    555658676B70

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

    Unidad 2: Laborator ios de Punteros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Objetivos de AprendizajeEjercicios de Laboratorio

    Unidad 3: Punteros Avanzados... . . . . . . . . . . . . . . . . . . . .73Objetivos de Aprendizaje1. Introduccin2. Aritmtica de Direcciones3. Puntero a Puntero4. Arreglo de Punteros5. Puntero a Estructura6. Puntero a una FuncinResumenUnidad 3:Examen de AutoevaluacinRespuestas a la Unidad 3: Examen de Autoevaluacin

    Unidad 4: Laborator io de Punteros Avanzados.. . . . . . . . . . . .95Objetivos de AprendizajeEjercicios de Laboratorio

    Volumen 6 : Tp icos Avanzados. . . . . , . , , . . . . . . . . . . . .97Unidad 1: Manejo de Archivo en C . . . . . . . . . . . . . . . . . 99

    7 172

    73747479BOB6879 19294

    9596

    Unidad 2: Laborator io de Manejo de Archivos en C . . . . . . . . . . . . . . . . . . .121

    Objetivos de Aprendizaje1. Introduccin2. Uso de Archivos de Datos en C3. Archivos de Texto y Binarios4. Manipular Archivos de Datos Sin FormatoResumenUnidad 1: Examen de AutoevaluacinRespuestas a la Unidad 1: Examen de Autoevaluacin

    Objetivos de AprendizajeEjercicios de Laboratorio

    991001011 1 31 1 41171 1 8120

    1211 2 2

    1231 2 4124

    Unidad 3: Caracterst icas Adic ionales de C.. . . . . . . . . . . . . . . .123Objetivos de Aprendizaje1. lntroduccin2. Enumeraciones

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

    parcialmente sin el previo permiso escrito de lBM.

  • Gua del Estudiante Introduccin a la Programacin con C

    3. Argumentos de la Lnea de Comandos para la funcin main O . 126129137140141143

    de C. . . . . . . . . . . . . . . . . . . . . . . 145145146

    4. Directivas del Preprocesador5. Operaciones de Manejo de BitsResumenUnidad 3: Examen de AutoevaluacinRespuestas a la Unidad 3: Examen de Autoevaluacin

    Unidad 4: Laboratorio de Caracterstcas AdicionalesObjetivos de AprendizajeEjercicios de Laboratorio

    iO Copyright IBM Corp. 2006

    Los materiales del curso no pueden ser reproducidos totalparcialmente sin el previo permiso escr i to de lBM.

  • Gua del Estudiante Introduccin a la Proqramacin con C

    Volumen 4: Funcones en C

    Volumen 4: Funciones en C Unidad 1: Funciones en C 5

    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

    Unidad 1 : Func iones

    Objetivos de Aprend izaje. Al f inal de esta unidad, usted ser capaz de:. Explicar la naturaleza y usos de las funciones.

    I

    . Describir como se uti l izan algunas funciones incorporadas de C

    . ldentif icar las diferentes partes del encabezado de una funcin.

    . Describir los diferentes t ipos de argumentos.

    . Definir los prototipos de funciones y sus usos.

    . Explicar cmo usar las funciones para solucionar problemas.

    Volumen 4: Funciones en C Unidad 1: Funciones en C 7

    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

    1. lntroduccinEn el Volumen 2 Estructuras de Control en C, se estudiaron los tipos de datosestructurados y se aprendi acerca de los arreglos y estructuras. En esta unidad, sediscutir la necesidad y el uso de las funciones en un programa en C.Una funcin es un programa autocontenido que lleva a cabo una tarea especfica. Unprograma en C es realmente una coleccin de una o ms funciones. El main es, enefecto, una funcin. Todos los programas en C deben tenirr una funcin main. Laejecucin de un programa C inicia con la ejecucin de la funcin main.Una funcin toma cero o ms entradas (tambin denominadas parmetros), l leva a cabouna tarea especfica y retorna un solo valor como resultado. En esta unidad, se estarusando las palabras 'entradas' y 'parmetros' indist intamente.El lenguaje C soporta algunas funciones incorporadas. Las funciones incorporadas sonaquellas que son parte de la librera estndar de C. Estas son diferentes a las funcionesdefinidas por el usuario. Las funciones definidas por el usuario son aquellas que sondiseadas y escritas por el programador para un uso especf ico en las aplicaciones.Las siguientes son algunas de las funciones incorporadas de C que se han visto yusado en los volmenes anteriores:

    o printf. scanf. toupper' sqrt

    La funcin printf, que se ha usado anteriormente, toma una o ms entradas. Una delas cosas comunes entre main y printf es que ambos l levan a cabo una tareaespecfica y retornan un valor nico como salida (Se aprender acerca de esto msadelarrte en la unidad).Ahora se sabe que una funcin t iene las siguientes caracterst icas:

    o Tiene un nombre nico (un identificador).o Trabaja con cero o ms entradas.

    Las funciones tambin se pueden invocar desde dentro de otras funciones. Esto seconoce como llamar (calling) a una funcin y la funcin invocada desde otra funcin esconocido como la funcin llamada (called).La funcin llamada ejecuta las sentencias que son parte de la funcin, llevando a cabola tarea Ceseada. Luego la funcin retorna a la funcin que la invoc. La ejecucin sereanuCa en la sentetrcia que sigue inmediatamente despus a la l lamada de la funcin.

    UnirJad 1: Funciones Volumen 4: Funciones en C B

    @ 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

    2. Programar Funciones en CLenguaje C permite a los programadores definir sus propias funciones para l levar acabo una tarea bien definida. Esto se conoce como funciones definidas por el usuario.Algunas de las caracterst icas de C con relacin a las funciones son:

    . Permite a los usuarios definir funciones definidas por el usuario.o Ofrece un mecanismo para pasar entradas a la funcin.. Esta hecha para aceptar las entradas recibidas y luego procesarlas.. Ofrece un mecanismo para retornar un solo valor como resultado.. Ofrece un procedimiento para tomar en cuenta numerosas tareas internas que

    pueden estar involucradas en el proceso de invocar una funcin, transferir elcontrol a la funcin, ejecutar la funcin y retornar a la funcin que la invoc.

    Pero permanece la pregunta, Por qu se deben usar las funciones?. Las funcionestienen numerosas ventajas, algunas de el las son.

    o Permite descomponer un programa grande en partes ms pequeas,manejables y autocontenidas. Esto se llama modularizacin. La modularizacinse puede lograr en C slo a travs de las funciones, las cuales proporcionanuna claridad lgica a los programas al descomponer un programa grande enpequeas unidades.

    . Ayudan a evitar repetir la programacin de las mismas instrucciones quenecesitan otros programas o partes de un programa.

    . Ayuda a los programadores a construir sus propios conjuntos de funciones enuna l ibrera personalizada.

    . Permiten que porciones del programa que son dependientes de la mquina seanseparadas de las otras, para faci l i tar la portabil idad de los programas.

    Una vez entendido el por qu las funciones son necesarias, se va a continuacin a daruna definicin de funciones y aprender a usarlas en la resolucin de problemas.

    3. Def in ic in y Uso de Funciones en la Solucin deProblemasPrimero se aprender en qu consiste una funcin, de manera que se pueda definir unafuncin. Una funcin contiene dos partes principales:

    . Encabezado de la funcin.

    . Cuerpo de la funcin.Un encabezado de funcion contiene lo siguiente:

    . Especif icacin del t ipo del valor a ser retornado por la funcin.

    . Un nombre de funcin (siguiendo las reglas para crear un identif icador).

    . Un conjunto de argumentos (dato pasado como una entrada a una funcin) queestn separados por comas.

    Volumen 4: Funciones en C Unidad 1 : Func iones en C 9

    @ 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 Estuctiante

    El conjunto de argumentos en un encabezado de funcin es opcional. Cada argumentoes preceddo por su declaracin de tipo.

    Lipo_de_dato nombre_de_funcion ( t ipo argt , t ipo arg2,. . . ) ;

    Si una funcin no toma ninguna entrada, el encabezado tendr un nombre de funcinseguido por O . Por ejemplo, considere el siguiente encabezado de funcin:

    i n L m a x ( i n t x , i n t y ) ;Se pudo haber omit ido el t ipo de dato inr pr el encabezado de funcin ya que Casume que todas las funciones retornan inr por defecto. Sin embargo, nunca se debeomitir, ya que esto se considera un estilo terrible de programacin. Los argumentos enef encabezado de la funcin son x e y, estos se denominan argumentos formales. Seles l lama as porque estos representan los identif icadores de las entradas transferidasdesde el programa que hace la l lamada a la funcin l lamada. Tambin se les conocecomo parmetros, en este caso, parmetros formales. Los identificadores x e y en elencabezado se consideran 'locales', y no son reconocidos por aquellos que estn fuerade la funcin.

    El cuerpo de la funcin es el conjunto de sentencias encerradas entre llaves { }. Esteconjunto de sentencias define la tarea que lleva a cabo la funcin. El cuerpo de lafuncin, como cualquier otro grupo de sentencias compuestas, puede conlenercualquiera de los siguientes t ipos de sentencias:

    o Sentencias de asignacin.. Sentenciascompuestas.. Llamadas a funciones.. Cualquier sentencia vl ida.

    El cuerpo puede contener cero o ms sentencias return. Las sentencia rerurnayudan a pasar el valor del resultado nico al programa que hizo la l lamada.La forma general de la sentencia rerurn

    s el siguiente:r e t u r n ( e x p r e s i n ) ;

    Esta contiene la palabra reservada rerurn seguido por una expresin opcional. El valorde la expresin se retorna a la parte que lo invoca del programa. Dado que unaexpresin puede resultar en un solo valor, una funcin puede tambin retornar slo unvalor. Si la expresin se omite, la sentencia return no transfiere ningn valor alprograma que lo l lama, solamente transfiere el control al programa que lo invoc.Algunas funciones se definen como void.

    v o i d n o m b r e F u n c i o n O {s e n t e n c i a s ;r e t u r n ;

    Unidad 1: Funciones Volumen 4: Funciones en C 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 Prooramacin con C

    A pesar que las funciones con t ipo void no necesitan tener la sentencia returnexplcitamente, se mantiene por dos razones:

    o La sentencia return se usa cuando hay mlt iples condiciones verif icadas enuna funcin y la funcin debe f inal izar su ejecucin, cuando una de suscondiciones se satisface. El siguiente segmento de cdigo ayudar a entenderesto claramente:vo id nombre_de_1a_Func ion ( inL x , i nL y , i n t z \ {

    i f ( x ' y ) {s e n t e n c i a s ;re tu rn ;

    ]e l s e i f ( x r z ) {

    s e n t e n c i a s ;r e t u r n ;

    lI

    ]. Se considera una buena prctica de programacin insertar una sola sentencia

    return antes que la func in termine.La sentencia reLurn causa que el programa que l lama a la funcin continu laejecucin luego de la sentencia que sigue inmediatamente despus de dicha rutina. Acontinuacin se presentan algunos ejemplos de funciones que usan un slo return.Ejemplo 1.1: Determinar el Mximo de Dos Nmeros Enterosi n t m a x ( j n L x , i n t y ) {

    i n t s a l i d a ;i f ( x ' = y )

    s a f i d a : x ;

    e f s es a l i d a = y ;

    r e t u r n ( s a l i d a ) ;]Se define una funcin l lamada max que retorna un int como resultado.El cuerpo de la funcin es bastante simple, dado que slo verif ica cul de las variableses mayor y retorna el valor.

    F in del E jemplo 1.1

    Volumen 4: Funcicnes en C Unidad 1 : Func iones en C 11

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

    o parcialmente sin el permiso previo escr i to de IBM

  • IntrrJuccin a la Proqramacin con C Gua del Estudiante

    Ejenrplo 1.2: Determinar si un Entero es lmpari n : - e s l m p a r ( i n t x ) {

    i n t s a l i d a ;

    i f ( x % 2 ! = 0 )s a l i d a = 1 ; / * V E R D A D E R O s i e s i m p a r * /

    C I S E

    sa l i da=0 ; / * FALSO s i no es impar * /re tu rn ( sa f i da ) ;

    )Est,: programa slo verif ica si el residuo de la divisin entre 2 es 0. S el residuo no es 0,entrnces ste es un nmero impar y se retcrna un valor verdadero. Recuerde que en Cel vrlor de 1 se considera vERDADERo y el valor 0 FALSo.

    Fin del E jemplo 1.2Ejemplo 1.3: Convert ir un Carcter de Minscula a Maysculac h a r m i n _ a _ m d y ( c h a r e n ) t

    c h a r s a l i d a ;

    / * t / e r i f i c a s i e n e s t e n L r e a y z * /i f ( e n > = ' a ' & & e n < = ' 7 ' ) {

    s a l - i d a = e n - ' a ' + r A ' , .

    )e l s e {

    s a l i d a = e n ; / * R e L o r n a e n c o m o e s t * /

    )r e t u r n ( s a l i d a ) ;

    )La funcin trabaja basado en que a los caracteres sc le asignan cdigos nicos ASCll,los cuales pueden ser tratados ctr ir rrumeros. Si en realmente t iene el carctel a' ,entonces en - 'a' ser cero, de este modo se retornar return ( in - 'a' +' A ' ) ; r e t o r n a r s l o ' A ' . S i e n t i e n e e l c a r c t e | B ' , e n t o n c e s e l v a l o r r e t o r n a d o s e r ' A ' + l , e l c u a l e s ' B ' d a d o q u e l o s v a l o r e s A S C l l s e d a n p a r a t o d o e l a l f a b e t o , e nsecuencia. Una vez dicho esto, recuerde que ya se ha usado una funcin incorporadaen C llamada t.oupper en el Volumen 2, llnidad 3 - Construcciones lterativas quehace la misma tarea.

    Fin del Ejemplo 1.3

    Unidad 1: Funciones Volumen 4: Funciones en C 12

    @ 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

    Ejemplo 1.4: Determinar el Mximo Gomn Divisor de Dos Enterosi n t m c d ( i n t x , i n t y ) {

    i n t s a l i d a ;

    w h i l e ( x l = 0 & & y t - 0 ) {i f ( x > = Y )

    x = xeoy i

    e 1 s e

    Y = Yo ,x ;

    )i f ( x = = 0 )

    s a l i d a = y ; / * y e s m c d * /e 1 s e

    s a l i d a = x ; / * x e s m c d * /r e t u r n ( s a l i d a ) ;

    ]Fin del Ejemplo 1.4Ejemplo 1.5: Determinar el Mnimo Comn Mlt iplo de Dos Enterosi n l m c m ( i n t x , i n t y ) {

    r e t u r n ( ( x * y ) / m c d ( x , y ) ) ;)Como se observa, esta es una funcin muy compacta. La funcin explota el hecho deque el MCM de dos enteros es el producto de los dos nmeros enteros dividido entre suMCD. Se defini previamente una funcin l lamada mcd. Simplemente se usa esafuncin aqu. En el ejemplo anterior, la funcin mcd aparece en la expresin.

    ( ( x * y ) / m c d ( x , y ) )La presencia de la funcin en la expresin implica que se invoca a la funcin y staretorna el valor de la funcin a ese punto en la expresin. As, si mcd (x, y) retorna unvafor z, entonces mcd (x, y) ser remplazado con el valor z en la expresin.Fin del Ejemplo 1.5Ejemplo 1.6: Determinar el Factorial de un Enteroi n t f a c t o r i a l ( i n t x ) {

    i n t k , f a c L , s a l i d a ; / * v a r i a b l e s f o c a f e s * /F a f - 1

    i f ( x = = 0 l l X : = 1 )s a l i d a = 1 ; / * l - e s e l r e s u l t a d o * /

    Volumen 4: Funciones en C Unidad 1: Funciones en C 13

    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

    e l s e {f o r ( k = Z ; k < = x ; k + + )

    f a c t = f a c t * k ;

    s a l i d a = f a c L ;

    )r e t u r n ( s a l i d a ) ;

    I

    Fin del Ejemplo 1.6A continuacin se discute cmo invocar y usar las funciones definidas por el usuario.Una funcin puede ser invocada especif icando el nombre de la funcin seguida por lal ista de argumentos separados por comas. Esto tambin se denomina una l lamada a lafuncin o llamada a funcin. Si una funcin no requiere de argumentos, se puedesimplemente escribir el nombre de la funcin seguida de O . La l lamada a la funcinpuede suceder en una expresin simple o como parte de una expresin compleja. Losargumentos en la llamada a la funcin se llaman argumentos actuales o parmetrosactuales. Existe una correspondencia uno-a-uno de la lista y del tipo de los argumentosformales con los argumentos actuales. El valor de cada parmetro actual ser pasadocomo entrada a la funcin llamada a travs del correspondiente parmetro formal.

    Ya se ha hecho uso de una funcin, como se mostr anteriormente.r e t u r n ( ( x * y ) / m c d ( x , y ) ) ;

    Una funcin que no retorna nada puede aparecer como una sentencia independiente,como por e jemplo un pr in t f ( . . . ) .Ejemplo 1.7: Generar Nmeros PrimosEl problema aqu es aceptar un nmero entero positivo grande NUM, y generar todos losnmeros primos entre 2 y NUM. El siguiente algoritmo resuelve ese problema:

    e Paso l: Definir una funcin primo (int x) que verif ica six es primo o no. Paso 2: Ingresar y val idar ww' Paso 3: para (todo k desde 2 a NUM)

    si (Primo(k) == VERDADERO)imprimir k;

    Basado en este algoritmo, se puede escribir el programa para generar los nmerosprimos entre z y mtJM, como sigue:

    El cdigo C inicia aqu...1 . # i n c l u d e < s t d i o . h >2 . #de f i ne VBRDADERO 13 . # d e f i n e F A L S O 0

    Unidad 1: Funciones Volumen 4: Funciones en C 14

    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

    4 .5 . / * V e r i f i c a r s i u n n r n e r o d a d o e s p r i m o o n o * f

    6 . i n L p r i m o ( i n t x ) {7 .

    8 .

    9 .

    1 0 .

    1 1 .

    1 2 .

    1 3 .

    1 4 .

    1 5 .

    1 6 .

    I 7 .

    1 8 .r s ]

    l

    2 0 .2 I . / * L a f u n c i n m a i n e m p i e z a a q u " /2 2 . m a i n O {2 3 .

    2 4 .

    2 5 .

    2 6 .

    2 7 .

    2 8 .) c )

    3 0 .

    3 1 .

    3 2 .

    3 3 .

    3 4 .

    3 5 .

    3 6 .

    3'7 .

    3 8 .

    3 9 .

    i n t k = 2 , c o n t i n u a r ;

    con t i nua r = VERDADERO;, ' - ^ L : h ^ \ f\ ^ / l1 l - Ie (k

  • Introduccin a la Proglamacin con C Gua del Estudiante

    4 0 .4 I . r e t u r n ( 1 ) ;4 2 . \ / " L a f u n c i n m a i n t e r m i - ^ a n r r * /

    El cdigo C termina aqu

    La funcin es fci l de entender. Simplemente evala si un nmero dado de entrada esprimo o no y retorna por consiguiente vERDADERo o FALSo. El program? mainimplenrenta un bucle para considerar cada uno de los enteros desde 2 a NuNr, y verificasi estos son primos o no. Si el nmero es primo, este se imprime.

    Fin del E jemplo 1.7Ejemplo 1.8: Determinar si un Entero es un PalndromeSe va a escribir una funcin para determinar si un entero dado como entrada espalndrome. Se sabe que un entero posit ivo es un palndrome si los dgitos del nmeroledos de izquierda a derecha son los mismos si se leen de derecha a izquierda.

    El cdigo C inicia aqu...1 . # i n c l u d e < s t d i o . h >'2 . #de f i nc VERDADERO 13 . # d e f i n e F A L S O 04 .h i n f n . l i n d r o m o ( - , n f v ) tv r r r v \ r r r L r L / t6 . i n L i z q u i e r d o , d e r e c h o , d i g i t o , g u a r d a r , p o s w t ;' 1

    . i n t k , co i r t i nua r , .

    8 . / * C o n t a r e l - n m e r o d e d g i t o s e n x * /

    9 . d i g i t o = = 0 ;1 0 . g u a r d a r = x ; / * t e n e r u n a c o p i a d e x * /

    1 1 . W h i l - ^ l a r r r r r : l r r l - " ) {

    L 2 .1 3 .7 4 . )

    d i g i t o + + ;gua rda r = gua rda r / 10 ;

    1 5 . / * L a v a r i a b l e d i g i t o e s e l n m e r o d e d g i t o s * /1 6 . , i * B u s c a r e 1 p e s o p o s i c i o n a f a l e x t . r a e r e IL 7 . d g i t o i z q u i e r d o c o m o l 0 n d i g i t o - 1 * /

    1 8 . p o s w t = 1 , .1 9 . f o r ( k = I ; k < = ( d i g i C o - 1 ) ; k + + )2 0 .

    2 T ,

    p o s w L = p o s w t * 1 0 ;

    Unidad 1: Funciones Volumen 4: Funciones en C 16

    @ 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

    2 2 .

    2 3 .

    2 4 .

    2 5 .

    2 6 .

    2 ' / .2 8 .

    2 9 .

    3 0 .

    3 1 .

    3 2 .

    3 3 .

    J t .

    3 5 .

    3 6 .

    3 1 .

    3 8 .t ,3 9 . l / * F i n d e l a f u n c i n p a l i n d r o m e * /

    4 0 .

    4 1 . m a i n ( v o i d ) {

    / * ApL i ca r e l p roceso de comparac t -n * /

    g u a r d a r = x ; / * T o m a r u n a c o p i a d e x * /

    cont inuar = VERDADERO;w h i l e ( g u a r d a r l = 0 & & c o n t i n u a r : = V t r R D A D E R O ) {

    / * D g i t o i z q u i e r d o * /

    i z t t i a r r l n - a r r r r l r - / n ,z ' JSWt ' '

    / * D g iLo de recho * /

    de recho = gua rda r ? 10 , .i f ( i z q u i e r d o = = d e r e c h o ) {/ * Nuevo x como i zqu ie rdo , de recho sacado* , /

    g u a r d a r = ( g u a r d a r ? P o s w t ) / t O ;p o s w t = p o s w t / t o o ;

    j / . F i n d e f i f * /e f s e

    con t . i nua r = FALSO;j / * F i n d e l w h i l e * /r e t u r n ( c o n t i n u a r ) ;

    4 2 .

    4 3 .

    4 4 .

    A E= J .

    4 6 .

    4 7 .

    4 8 .

    4 9 .

    5 0 .

    5 1 .

    5 2 .

    5 3 .

    5 4 .

    5 5 .

    5 6 .

    i r r l _ n r r m c n n l - i n r. . . J a r , '

    , / * Tomar l a en t rada de pa r te de l usua r i o * /p r i n L f ( " I n g r e s a r u n n u m e r o e n t e r o p o s i t i v o m e n o r q u e3 ' 2 ' 7 6 7 : " ) ;s , : a n - f ( " 9 d " , & n u m ) , '/ r v e r i f i c a r q u e e l n t i m e r o d a d o e s p o s i L i v o o n o * /

    i F ( n u m < = O l l n u m > 3 2 7 6 7 ) {p r i n t f ( " ? d n o e s u n n u m e r o e n L e r o \p o s i t i v o " , n u m ) , 'p r i n t f ( " \ n o % d e s m a y o r q u e 3 2 " / 6 ' / \ n " , n u m ) , '

    ll

    e l s e {/ * I n v o c a r l a f u n c i n p a l i n d r o m e p a r a v e r i f i c a rs i una en t rada dada es pa1 nd rome o no * fcon t i nua = pa l i nd rome (num) ;i f ( con t i nua r == VERDADERO)

    n r i n f f ( t 2 d q r r n n I i n d r n m o \ n l l n r r m ) .y ! f r r u ! \ u r r y q f \ , t L s t t t t t

    Volumen 4: Funciones en C Unidad 1 : Func iones en C 17

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

    o parcalmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    5 7 . ^ t ^ ^C I D g

    5 8 . p r i n t f ( " % d n o e s u n p a l i n d r o m e \ n r r , n u m ) ;5 9 . \ / . F i n d e l e f s e * /

    6 0 . ) / * F i n d e l m a i n * /

    El cdigo G termina aqu

    Para verif icar si un entero es un palndrome, se t iene que extraer el dgito ms a laizquierda y verif icar por igualdad con el dgito ms a la derecha. Sin embargo, ya queno se sabe cuntos dgitos tiene el entero dado, se requiere primero contar el nmerode dgitos usando ndigitos. Slo cuando se hace eso se puede extraer el dgito msa la izquierda. El peso posicional de este dgito es lOndisitt y dividiendc el nmero entrelgndisit-1 se obtiene el nmero ms a la izquierda. Dividiendo el resto entre 10 se obtieneel dgito ms a la izquierda. Si los dos dgitos coinciden, entonces el nmero t iene laposibi l idad de ser un palndrome, de otro modo no. Para seguir adelante, se debe crearun nuevo nmero descartando el actual dgito ms a la izquierda y el dgito ms a laderecha. Para los pasos subsiguientes, el peso posicional se usa para extraer el dgitoms a la izquierda debe ser dividido entre 100 (recordando que se han descartado dosdgitos).A continuacin se presenta otra solucin al problema al usar arreglos para encontrarpalndromes.

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

    2 . #de f i ne VERDADERO 13 . # d e f i n e F A L S O 0

    i n t p a l i n d r o m e ( i n t x )i n t a r r a y [ 1 0 0 ] ,d i g i t o = 0 ;i = 0 , .

    {i , ) , d i g i t o , c o n t i n u a r ;

    / * E x t r a e r c a d a d g i t o y a f m a c e n a r f o e n u n a r r e g ) o * /w h i ] e ( x ! = 0 ) {

    d i g i t o + + ;a r r a y [ i + + ] = x ? 1 0 ;x = x / 1 0 ;

    ) / * F i n d e l b u c t - e * /cont inuar = VERDADERO;. i

    - n .

    / * Compara r e1 p r imer d g i t o de l - a r reg lo con e l l L i r nod g i t o * 7

    Unidad 1: Funciones Volumen 4: Funciones en C 1B

    @ 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 8 . f o r ( j = d i g i t o - 1 ; ( i < d L g i L o / 2 ) & & c o n L i n u a r ; ) t1 9 . i f ( a r r a y [ i J ! = a r r a y [ j ] )2 0 . c o n t i n u a r = F A L S O ;2 I . i + + ; J ;

    I ' , . . -2 2 . l / * F i n d e 1 f o r * /2 3 . r e t u r n ( c o n t i n u a r ) ;2 4 . ) / * F i n d e p a l i n d r o m e * /

    , t , ( 5 . m a l n ( ) 126 . i r , , r r - , * , con t rnua r ;

    2 ' 7 . / * T o m a r l a e n t r a d a d e l u s u a r i o * /

    2 8 . p r i n t f ( " l n g r e s a r u n n u m e r o e n t e r o p o s i t i v o : " ) ;2 9 . s c a n f ( r ' e d t r , & n u m ) ;3 0 . / * Y e r i f i c a r s i e l - n m e r o d a d o e s p o s i t i v o o n o * /

    3 1 . i f ( n u r n > O & & n u m < 3 2 7 6 8 ) {3 2 . / * I n v o c a r l a f u n c i n p a l i n d r o m e p a r a v e r i f i c a r

    s i u n a e n t r a d a d a d a e s p a l n d r o m e o n o * /

    3 3 . c o n t i n u a r - p a l i n d r o m e ( n u m ) ;3 4 . i f ( c o n t i n u a r = = V E R D A D E R O )3 5 . p r i n t f ( " % d e s u n p a l i n d r o m e \ n " , n u n l ) ;3 6 . e l s e

    3 7 . p r i n L f ( " ? d n o e s p a l i n d r o m e \ n " , n u m ) ;3 8 . I / * F i n d e l i f * /

    3 9 . e l s e

    4 0 . p r i n t f ( " T n g r e s a r u n n u m e r o > O y < 3 2 7 6 8 \ n " ) ;4 I . \ / . F i n d e f a f u n c i n m a i n * /

    El cdigo C termina aqu

    Fin de Ejemplo 1.8Ejemplo 1.9: Control de Gastos para una PersonaSe desea elabora un programa que permita l levar el control de gastos de una personadurante un ao. Los rubros que se almacenarn son: Vivienda, al imentacin yeducacin.

    Se deben controlar los gastos del individuo por mes y al f inal obtener un reporte generaldonde se calcule: Promedio de gastos total al ao por rubro y mes donde se presento elmayor volumen de gastos para cada variedad.

    Volumen 4: Funciones en C Unidad 1: Functones en C 19

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

    o parcialmente srn el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    El cdigo C comienza aqu...1 . # i n c l r : d e < s t d i o . h >

    2 . # d e f i n e M E S E S t 23 . / * P r o t o t i p o s d e l a s f u n c i o n e s * /

    4 . f l o a t p r o m e d i o A n i o ( i n t ) ;5 . i n t mesGasLo ( i n t ) ;6 . i n l g a s L o 3 1 [ M E S E S J ;

    t \ f/ m a ] . n U f8 .9 .

    1 0 .

    1 1 .

    1 2 .

    1 3 .

    L 4 .

    1 5 .

    1 6 .

    r 7 .1 8 .

    1 9 .

    2 0 .

    2 r .2 2 .

    2 3 .' 2 4 .

    2 5 .

    2 6 .

    2 1 .

    2 8 .

    2 9 .

    3 0 .? - l \

    i n t i , j ;f o r ( i = 0 ; i < 3 ; i + + )

    f o r ( j = 0 ; j < 4 E S E S ; j + + ) {p r i n L f ( " I n t r o d u c i r m o n t o g a s t a d o p a r a \r u b r o % d e n e l m e s ? d : " , i + 1 , j + 1 ) ;s c a n f (

    " q d " , & g a s L o t i l t j I ) ;)

    / * P romed io pa ra cada rub ro * /p r i n L f ( " E l p r o m e d i o a n u a l d e g a s t o s e n v i v i e n d a \e s : ? f \ n " , p r o m e d i o A n i o ( 0 ) ) ;p r i n t f ( " 8 1 p r o m e d i o a n u a l d e g a s t . o s e n a l i m e n L a c i n \e s : % f \ n " , p r o m e d i o A n i o ( 1 ) ) ;p r i n t f ( " J 1 p r o m e d i o a n u a l d e g a s t o s e n e d u c a c i n \e s : % f \ n " , p r o m e d i o A n i o ( 2 \ ) ;

    / * M o c - ^ r r d ^ c F n m c I F - - ^ - - , ' l - - ^ + /-o mas a l t o pa ra cada rub ro * /

    p r i n t f ( " 8 1 m e s c o n m a s g a s t o e n v i v i e n d a \e s : ? d \ n ! ' , m e s c a s t o ( 0 ) ) ;p r i n t f ( " [ i l mes con mas gas to en a f imen t .ac in \e s : ? d \ n " , m e s G a s t o ( 1 ) ) ;p r i n t f ( " E l m e s c o n m a s g a s t o e n e d u c a c i n \e s : % d \ n " , m e s G a s t o ( 2 ) ) ;

    3 2 . I l o a L p r o m e d i o A n j o ( i n t r u b r o ) { n L i ;f l o a t a c u = 0 , .f o r ( i = 0 ; i < N l E S E S ; i + + )

    ac l r+ - -gas to [ r ub ro ] t i l ;

    3 3 .3 4 .3 5 .3 6 .

    Uniciad 1: Funciones Volumen 4: Funciones en C 20

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

    o parcialmente sn el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Proqramacin con C

    4 0 .

    41_ .

    4 2 .

    4 3 .

    4 4 .

    4 5 .

    4 6 .

    3 7 . r o i - r r r n l r r / M E Q F Q \ .\ 9 v g /

    3 8 . )3 9 . i n t m e s G a s t o ( i n t . r u b r o ) {

    i n t . m o n t o = g a s t o I r u b r o ] [ 0 ] , i = 0 , m e s = 0 , .

    f o r ( i = 1 ; i < M E S E S ; i + + )i f ( g a s L o I r u b r o J I i ] ' m c n c o ) {

    m o n t o = g a s t o [ r u b r o ] [ i ]f l l ( = 1

    4 7 . r e t u r n ( m e s + 1 ) ;4 8 . )El cdigo C termina aqu

    Este programa result muy simple ya que se contaba con tres funcionespromedioAr io , mesGasto y cargarData. Una soluc in a l terna en prx imasversiones podra considerar la posibi l idad de que ms de un mes coincida como el dems alto gasto en el ao por cada rubro o variedad.

    La matriz uti l izada en el ejercicio con nombre gasto es una variable con t ipo dealmacenamiento global. En sta unidad se ampliarn detalles sobre estos conceptos.

    Fin del Ejemplo 1.9Hasta el Ejemplo 1.8 todas las funciones definidas por el programador precedan a lafuncin main. Esto era para permit ir que el compilador tuviera definida las funcioneshechas por el programador mucho antes de que la funcin main se ejecutara. En estemtodo, primero se desarrol la y se colocan las funciones que se necesitan y despus seenlazan. Esto se llama enfoque bottom-up (de abajo-hacia arriba) de solucin deproblemas.

    Existe otro enfoque para resolver problemas, denominado enfoque top-down (de arriba-hacia abajo). En este mtodo, la funcin main p?rece delante de todas las otrasfunciones definidas por el usuario. Mientras esto es bueno para los desarrol ladores, nopermite que un compilador trabaje a menos que sea informado con antelacin que talesfunciones definidas por el usuario van a ser ejecutadas y que van a ser definidasposteriormente. El compilador es informado a travs de un prototipo de funcin.

    Los prototipos de funcin se especif ican al comienzo de un programa en C, inclusiveantes de la funcir main. El prototipo de una funcin se escribe en forma general comosigue:

    t i p o - d e - d a t o n o m b r e - f u n c i o n ( t i p o f a r g 7 , t i p o 2 a r g 2 , . . . ) ;Aqu el r ipo-de-daro es el t ipo de dato del elemento retornado por la funcin.nombre-funcion es el identif icador, es decir, el nombre de la funcin. Los elementos

    Volumen 4: Funciones en C Unidad '1: Funciones en C 21

    @ 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

    dentro de los parntesis definen los argumentos y sus tipos. Los argumentos sonjustamente nombres mudos (dummy names) reconocidos dentro del prototipo. Estospueden ser omitidos, aunque no es recomendable:

    i n t s u m ( i n t , i n t ) ;La sentencia anterior es aceptada, pero se recomienda el uso de los nombres tambin,tal como se muestra a continuacin.

    i n t s u m ( i n t x , i n t y ) ;Tambin es recomendable usar los mismos nombres de argumentos en el prototipo quelos nombres que sern usados en la l ista de los parmetros formales. Los t ipos de datosde los argumentos l istados en el prototipo deben coincidir con aquellos que aparecen enel encabezado de la funcin (como parte de los parmetros formales). Los parmetrosactuales en la l lamada deben tambin corresponder a estos. Los prototipos defunciones no son obligatorios en C. Sin embargo, faci l i tan la verif icacin de errores porel compilador.

    A continuacin se resuelve un problema adicional (con prototipos de funcionesdefinidos) antes concluir la unidad.Ejemplo l . l0: Localizar Fracciones Mixtas ExtraasEl problema consiste en generar fracciones mixtas extraas" Las propiedades quesatisfacen estas fracciones son:

    . Todas el las estn formadas slo por enteros de tres dgitos.

    . Todas ellas representan slo nmeros positivos.

    . Cada parte de la fraccin mixta, es decir, la parte entera, el numerador y eldenominador, son todos nmeros que son tanto primos como palndromes.

    Se escribir un programa en C que genere e imprima fracciones mixtas que satisfaganlas propiedades anteriores.

    Se sabe que se t ienen que formar todas las fracciones mixtas que se puedan a part ir deenteros positivos de tres dgitos. Pero no todas estas fracciones mixtas sern vlidas.Por lo que, lo primero que se debe hacer es verificar si la fraccin mixta formada esvlida. Si la fraccin mixta es vlida, entonces se debe verificar si todos suscomponentes (parte entera, numerador y denominador) son primos y palndromes. Sitodas estas condiciones se satisfacen entonces se t iene que imprimir la fraccin mixla,sino se debe proceder a formar la prxima fraccin mixta candidata.

    Claramente, se deben desarrol lar funciones para verif icar lo siguiente:. Si una funcin mixta es vlida.. Si un entero dado como entrada es un nmero primo. Si un entero dado como entrada es un palndrome

    Unidad 1 : Func iones Volumen 4: Funciones en C 22

    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

    El siguiente es el algoritmo para calcular esto:. Paso 1: para ( i = 100; i

  • I t t lrq"in, l , Ptogfatu. Gua del Estudiante

    2.1\ _

    2 L

    2 2 .

    2 3 .

    2 4 .

    2 5

    2 6 .

    2 7 .

    2 8 .

    2 9 .

    3 0 .

    3 1 .

    3 2 .

    3 3 .

    A . d e n o m i n a d o r = k ;

    / * v e r i f i c a r s i A e s v a l i d a r f m * /

    i f ( va l i da r_ f m (A . numerado r , \A . d e n o m i n a d o r ) )/ * V e r i f i c a r s i e s p r i m o ypa l nd rome* /

    i f ( p r imo ( i ) ea pa l i nd rome ( i ) \&& p r imo ( j ) cc pa l i nd rome ( j ) \a e p r i m o ( k ) e e p a l i n d r o m e ( k ) )

    p r i n t f ( " % d \ t ? d \ t? d \ n " , A . p a r t e _ c o m p l e t a , \A .numerado r , \A . d e n o m i n a d o r ) ;

    j / * F in de l buc l -e f o r con k * f\ / . F . l n d e l - b u c l e f o r c o n j * /

    \ / * l . - i n d c l h r r r - l e f r r c n n i * /l t /

    J t J .

    3 94 0 .4 I .

    3 4 . I / * F i n d e l m a i n * /

    3 5 .

    3 6 . i n t v a l i d a r _ f m ( i n t n u m , i n t d e n ) {3 7 . / * V e r i f i c a e f n m e r o d e l a f r a c c i n m i x t - a * /

    i f ( num < de rn )re tu rn (VERDADERO) ;

    e l s e

    r e t u r n ( F A L S O ) ;4 2 . j i " F i n d e l a f u n c i n v a t i d a r f m * f I J .

    4 4 .

    4 \ ' i n t n a ' l i n d r o m o I i n f v ' l I

    i n L i z q u i e r d o , d e r e c h o , d i g i t . o , g u a r d a r , p o s w r , .in t . l< , con t inuar , .

    / * Contar e l n inero de d g i tos en x * /d i g i L o = 0 ;guar< la r = x ; f * Hacer una cop ia de x * /w h i l - e ( g u a r d a r ! = 0 ) {

    d i g i t o + + ;guardar = guardar / 10 ;

    )

    4 6 .

    4 7 .

    4 8 .4 9 .

    5 0 .

    5 1 .

    5 2 .

    5 4 .

    Unidad 1: Funciones Volumen 4: Funciones en C 24

    @ 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 C

    5 5 .

    5 6 .

    5 7 .

    5 8 .

    5 9 .

    6 0 .

    6 7 .

    6 2 .

    6 3 .

    6 4 .

    6 5 .

    6 6 .

    6 "7 .

    6 8 .

    6 9 .7 0 .' 7 1 - .

    7 2 .' t 3 .

    7 4 .

    7 5 .

    1 6 .

    / * a q u d i g i t o e s e l n m e r o d e d g i t o s * /

    / * B u s c a r e 1 p e s o p o s i c j o n a l a l e x t r a e r e f d g i t o' i z m r i o r d n n m n ' 1 n d i a i l - n - - l * /

    ! l

    pos \ ^ / t - 1 ;f o r ( k = I ; k < = ( d i g i t o - 1 ) ; k + + )

    p o s w t = p o s w t * 1 0 ;

    / * I n i c i a r e l p r o c e s o d e c o n r p a r a c i t r * /

    g u a r d a r = x ; / * T o m a r u n a c o p i a d e x * /

    ConTinuar = VERDADERO;r^ ] r ' i I e l r r r r e rda r ' | = O && Con t i nua r == VERDADERO) {\ : J u u ! s u !

    / * D g i t o l z q u i e r d o * /i - n r r i a r r l n - r r r r f r / n rl . ZqU -Le r L r (J r yJSWt , '

    / * D ig iLo de recho * /

    d e r e c h o - g u a r d a r % 1 0 ;i f ( j - z q u i e r d o = = d e r e c h o ) {

    / * N u e v o x c o n i z q u i e r d o , d e r e c l l o a r r o j a d o * /g u a r d a r = ( g u a r d a r % P o s w t ) / 1 0 ;p o s w t = p o s w t / t O O ;

    ) / * F i n d e 1 i f * /e - L s e

    con t i nua r = FALSo ;

    ) / " F r n d e l w h i l e * /r e t u r n ( c o n t i - n u a r ) ;

    7 7 . ) / * F i n d e l a f u n c i n p a l n d r o m e * /" / 8 .' / s . i n t p r i r n o ( i n t x ) {8 0 .

    8 1 .

    8 2 .

    8 3 .

    8 4 .

    8 5 .

    8 6 .

    8 7 .

    B B .

    8 9 .

    9 0 .

    l n t k = 2 , c o n t i n u a r ;

    c o n t i n u a r = V E R D A D E R o ;

    w h i l e ( k < = x - 1 & & c o n L i r u d r - : V E R D A D E R O ) ii f ( x ? k = = 0 )

    con t i nua r = FALSo ;e 1 s e

    k + + , '

    )i f ( con t i nua r == VERDADERO)

    r e t u r n ( V E R D A D E R O ) ;e l s e

    Volumen 4: Funciones en C Unidad 1: Funciones en C 25

    @ 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

    9 1 . r e t u r n ( F A L S O ) ;e 2 . )El cdigo C termina aqu

    Fin del E jemplo 1.10A continuacin se discute uno de los conceptos ms importantes cuando se escribe unprograma que usa funciones, las clases de almacenamiento (sforage c/asses).

    4. Glases de AlmacenamientoEn C, una variable se define como sigue: nombre-variable ;Junto con el t ipo de dato de una variable, se puede tambin especif icar una clase dealmacenamiento en la definicin. Las clases de almacenamiento se usan en C paradefinir la visibi l idad y el t iempo de vida de las variables. La visibi l idad de una variable seconoce como alcance de una variable. La clase de almacenamiento ayuda a entendercmo C trata las variables definida dentro y fuera de una funcin.Una clase de almacenamiento se usa para especif icar al compilador el t ipo de memoriaque el programa necesita para sus variables. C t iene las siguientes clases dealmacenamiento:

    . Automatic

    . Statico Extern. Register

    4.1. La Clase de Almacenamiento automat ic

    Todas las variables definidaspor defecto corresponden a lapueden def in i r como sLat ic .

    i n t f 1 O {i n t ; / *s e n t e n c i a l ;s e n f c n i a ? .

    "a r r t a raa i -n ;)

    En el ejemplo anterior, la variable iauto se puede usar opcionalmente,

    dentro de una funcin, llamadas variables locales (local),clase de almacenamiento automatic. De otro modo. seSea el siguiente ejemplo:

    Var iab le au toma t . i c * /

    es una variable automatic. La palabra reservadacomo auto int i . Cualquier definicin dentro de

    Unidad 1: Funciones Volumen 4: Funciones en C 26

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

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante lntroduccin a la Proqramacin con C

    una funcin, donde no se especif ica la clase de almacenamiento es, por defecto,automatic. Las variables auLomatic definidas dentro de una funcin obtienen elespacio asignado slo cuando se invoca la funcin. El compilador l ibera el espacio tanpronto como la funcin retorna.

    4.2. La Clase de Almacenamiento regis ter

    La clase de almacenamiento register asigna memoria en los registros de alta-velocidad de la CPU. Esto es slo una solicitud al compilador. El compilador asignamemoria en los registros si tales registros estn disponibles para asignacin dememoria. Si no estn disponibles, estas variables se tratan como variables automatic.Las variables se definen normalmente como variables reqister slo cuando serequiere computaciones de alta velocidad"

    i n t f 1 ( r e g i s t e r i r r L a ) {r e g i s t e r i r - i t i ;

    )El fragmento de cdigo anterior muestra que slo las variables local, tanto argumentos yvar iab les automat ic , se pueden def in i r como var iab les regis ter .

    4 .3. La Clase de Almacenamento s tat ic

    La clase de almacenamiento static le informa al compilador que los valoresalmacenados en las variables estn disponibles entre l lamadas a funciones. Lasvariables automatic pierden los datos cuando la funcin retorna, ya que el espacioasignado a las variables se l ibera. Por ejemplo, si se define una variable dentro de unafuncin como static y se le asigna un valor 10, durante el curso de la ejecucin de lafuncin, el valor 10 se retiene cuando la funcin se invoca nuevamente. Cualquiercambio que se haga durante esta invocacin ser retenido durante la prximainvocacin de la funcin. Un buen ejemplo de su uso es cuando se crean nmeros deidentidad (secuencialmente) a travs de una funcin.# i n c l u d e < s t d i o . h >

    / * D e c l a r a c i n d e f u n c i n * /

    i n t - gene ra r l dno O ;/ * L a f u n c i n m a i n i n i c i a a q u * /ma in O {

    i n t i ;

    / * E l b u c l e i n v o c a l a f u n c i n g e n e r a r r d n o * /

    f o r ( i = I ; i < = 1 0 ; i + + )p r i n t f ( " E l i d n o e s ? d \ n " r g e n e r a r f d n o O ) ;

    ) / . L a f u n c i n m a i n f i n a l i z a a q u * /

    / * L d f u n c i r r g e n e r a r l d r r o i r r i c i a a q u i * /

    Volumen 4: Funciones en C Unidad 1: Funciones en C 27

    @ 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

    inL generar ldno O {s t a t i c i n t i d n o = 0 ;r e t u r n + + i d n o ;

    ) / * ra func in genera r rdno f i na l i za aqu * /

    Este es un uso simple de la clase de almacenamiento sLatic en una funcin. Sinernbargo, en un esfuerzo de programacin complejo, es muy importante el uso de laclase de almacenamiento sLaLic. Las variables definidas como staLic soninicial izadas cuando la funcin se l lama la primera vez. Las l lamadas subsecuentes a lafuncin no inicial izan la variable. As, cuando generarrdno es l lamada (cuando i es 1r1 nrain), la variable staLic idno S inicial izada en 0. Es entonces incrementada yretornada a la funcin que hizo la l la'nada. Cuando generarrdno se invocanuevamente, no se realiza ninguna inicial izacin. El valor anterior de idno se retiene yse incremerrta para retornar el prximo valor de i.

    4 .4. La Clase de Almacenamento extern

    Las variables cuya definicin est fuera de cualquier funcin pertenecen a la clase dealmacenamiento extern. Estas variables son visibles a travs del programa, a part irdel punto en que son definidas hasta elf inal del mbito establecido para el las. Cualquiercamb,o que se haga a estos valores afectan al resto del programa. Vase el siguienteejemplo:# i n c l u d e < s t d i o . h >

    / * D e c L a r a c i n d e f u l , c i o n e s * /

    i n r - f 1 ( ) ;c h a r f 2 O ;

    / * D e c l a r a c i ni n t k ;

    / * L a f u n c i nma in O {

    i n t 9 ;/ * P u e d e

    | / * La f unc in ma in cu lm ina aqu * /

    / * D e c l . a r a c i n d e v a r i a b l e e x t e r n * /i n t j ;

    / * Tmt r l cmcnFar - i . n de IaS f unC iones * /! u r t v + v r r u v /

    de una va r i ab le ex te rn * /

    ma in i n i c i a aqu * /

    / * V a r i a b l - e l o c a l d e m a i n *

    usa r so lo k dec la rado fue ra y q que es l oca l * /

    Unidad 1: Funciones Volumen 4: Funciones en C 28

    @ 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 C

    / * L a f u n c i n f 1 i n i c i a a q u * /

    v o i d f 1 O {/ * Puede usa r ambos k y j dec la rados fue ra * /

    l /l / * L a f u n c i n f 1 f i n a l i z a a g u * /

    / * L a f u n c i n f 2 i n i c i a a q u * /

    c h a r f 2 O {i n t k ; / * V a r i a b f e l o c a l d e f 2 O * /

    / * P u e d e u s a r l o c a l k y e x t e r n j x /I / .] / * L a f u n c i n f 2 f i n a l i z a a q u * /

    En el ejemplo anterior, se definieron dos variables extern k y j l< es visible fl main,f 1 y f2 . j es v is ib le s lo en f r y f2 . Toda var iab le extern es v is ib le en funconesslo desde el punto de su definicin. j est definida justo antes de la funcin f 1, y porlo tanto no es visible efl main.Porotra parte se declar una variable k en la funcin rz. sta es una variable local. Eneste punto, dos variables con el mismo nombre k son visible para f2. Recuerde que lavariable local, al tener el mismo nombre que una variable extern, siempre sobrescribela var iab le extern. Por lo tanto, la x v is ib le en f2 es la local y no la extern.A las variables extern se les conoce tambin como variables globales (global). Elespacio asignado a estas variables permanece durante una ejecucin del programa.Cualquier cambio que se le haga a una variable extern ser visible a todas las otraspartes del programa donde sea visible.Con respecto a las variables extern es importante tener clara la diferencia entredefinicin y declaracin de variable. Una declaracin expone las propiedades de unavariable (principalmente su t ipo de dato) mientras que una defnicin adems reserva unespacio de almacenamiento para dicha variable en memoria. Una definicin para unavariable j entera sera:

    i n t j ;Mientras que una declaracin para la misma variable sera,

    e x t e r n i n t j ;Al dec larar 'extern in t j ' antes delmain, j ser v is ib le en esa func in. La palabrareservada extern informa al compilador que aunque no se ha definido j en main oantes de main, dicha funcin t iene alcance sobre sta variable. Esta caracterst ica essimilar a la aplicada con los prototipos de funciones, ya que los prototipos de funcionesconceptualmente son declaracin de funciones en un programa. Esta caracterstica deC es bastante ti len la resolucin de problemas grandes.Continuando con esta discusin, es importante sealar que generalmente programasgrandes requieren de ms de un archivo C que formen el programa fuente.

    Volumen 4: Funciones en C Unidad 1: Funciones en C 29

    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

    E l cd igo C in ic ia aqu . . .

    / * e r c h i v o L . c * /f . in t - k ;2 . inL m, '3 . m a n O { / * m a i n e s c r i t o e n u n a r c h i v o s e n a r a c l o * /4 .s . )6 .

    7 . / * A r c h i v o 2 . c * /f . i n t k ;

    f . i n L ) ;1 0 . e x t e r n i n t - m ;

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

    1 2 . i n L f 1 O {1 3 .

    ] - 4 . )1 5 . r n t n , '

    1 6 . i n t f 2 O {1 7 .

    1 8 . )1 9 . / * a r c h i v o 3 . h * /

    20 . f * Los p roLo t - i pos de func iones es tn en s te a rch j - vo * /2 L i n t f 1 O ;2 2 . i n L i 2 O ;

    El cdigo C f inal iza aqu

    Existen tres archivos en el segmento de programa anterior. Se observan cJosdefiniciones de k. Ambas son vlidas ya que son locales al archivo en el cual el las sondefinidas, muy parecido a la manera que se t ienen variables locales dentro de unafuncin. La variable j es visible slo en las funciones definidas

    Archivo2t.c,mientras que n es visible slo en fz del Archivo2 . c. Sin embargo, la variable m esvisible tanto en Archivo2. c as como ert Archivol. c ya que se ha usado la palabrafeServada extern.Para usar j en archivol . c, se debe declarar dicha variable n Archivol . c comoextern. Entonces:

    Se puede tener una variable declarada como extern en otro archivo?La respuesta es s.

    Unidad 1: Funciones Volumen 4: Funciones en C 30

    @ 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

    Si por el contrario se desea l imitar en alcance de j slo ? Archivo2.c C provee lapalabrareservada stat ic . A l u t i l izar s taL ic en la def in ic in de la var iab le j , se ev i taque algn programador pueda declarar la mencionada variable como extern encualquier otro archivo que forme parte del programa fuente. As la definicin de lavariable j sera como sigue:

    s t a t i c i n t j ;Este es un concepto importante en programacin, llamado ocultamiento de informaciny ocasiona que j sea una var iab lo s tat ic extern.Algunas de las caracterst icas de las clases de almacenamiento (storage c/asses) semuestran a continuacin:

    . Slo la variables automatic se pueden declarar como register.

    . Slo debe exist ir una definicin de una variable extern entre todos los archivosque formen un programa fuente.

    . E l espacio para var iab les automat ic ! reg is ter se as igna en la p i la de ls is tema.

    o El espacio para las variables sLar-ic ! extern se asigna en los segmentos dedatos del proceso.

    5. Archivos de Encabezamiento (header)Se ha visto que el texto fuente de los programas hechos en C se pueden tener en variosarchivos y se pueden cargar rutinas previamente compiladas de bibl iotecas. Sinembargo el programador debe ocuparse de manejar todos los detal les relacionados adefiniciones y declaraciones compartidas entre esos archivos. Central izar definiciones ydeclaraciones segn sea posible, de modo que haya slo una copia por mantenermientras se desarrol la el programa.

    En el ejemplo anterior este contenido comn es ubicado Fr Archi-vo3 . h reconocidocomo un archivo header que ser incluido (#include "Archivo3 . h" ) en los archivosdonde sea necesario (arcir ivol . c y Archivo2 . c). El compromiso del programadoren todo caso es que cada archivo slo tenga acceso a la informacin que necesita.

    El mecanismo de cmo compilar y cargar un programa en C que reside en variosarchivos fuente vara de un sistema a otro. En UNIX, por ejemplo, el comando ccmencionado en el primer volumen realiza el enlace ejecutando:

    c c A r c h i v o l . c A r c h i v o 2 . c A r c h i v o 3 . h

    Volumen 4: Funciones en C Unidad 1 : Func iones en C 31

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

    o parcialmente sin el permiso previo escrito de IBM

  • lntroduccin a la Prooramacin con C Gua del Estudiante

    De sta manera los tres archivos son compilados generando el cdigo objeto resultanten Archivol . o Archivo2 . o uti l izando archivo3 . h, para luego cargarlos todos enun archivo ejecutable l lamado a. ouL.A continuacin un ejemplo de cdigo fuente conformado por varios archivos:Inicio del Ejemplo'1.11: Control de Gastos para una Persona- Usando variosarchivos que confc'rman el cdigo fuente.

    El cdigo C comienza aqu...1 . / * a r c h i v o C a b e c e r a s . h * /

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

    3 . # d e f i n e M E S E S L 24 f l o a t p r o m e d i o A n i o ( i n L ) ;5 . i n t m e s G a s t o ( i n t ) ;6 . i n t g a s t o [ 3 ] [ v E S E S l ;1 "

    B . / * A r c h i v o C u e r p o s F u n c i o n e s . c * /9 . # i n c l u d e r r c a b e c e r a . h ' l1 0 .

    1 1 . f l o a t p r o m e d i o A r r i o ( i n t r u b r o ) {1 2 . i n L i ;1 3 . f l o a t a c u = O , -L 4 . f o r ( i = O ; i < M E S E S ; i + + )1 5 . g 1 = g a s L o [ r u b r o ] t i l ;1 6 . r e t u r n ( a c u / u e s f s ) ;1 7 . )1 8 . i n t m e s G a s t o ( i n t r u b r o ) {1 9 . i n t m o n t o = g a s t o I r u b r o ] [ 0 ] , i = 0 , f f i e s = O , .2 Q .2 L . f o r ( i = 1 ; i < M E S E S ; i + + )2 2 . i f ( g a s t o [ r u b r o ] [ i ] > m o n r o ) {2 3 . m o n t o = g a s t . o [ r u b r o l [ i J ;2 4 . m s = i , .2 5 . )2 6 . r e t u r n ( m e s + 1 ) ; t - )

    2 8 .

    2 9 . / " e r c h i v o P r i n c i p a t . c * /

    Unidad 1: Funciones Volumen 4: Funciones en C 32

    @ 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 Programacin con C

    3 0 . # i n c l u d e " C a b e c e r a s . h "' | \ fJ _ 1 . m a l n ( ) f

    3 2 . i n t . i , j ;3 3 . f o r ( i - O ; i < 3 ; i + + )3 4 . f o r ( j = 0 ; j < M E S E S ; j + + ) {3 5 . p r i n t f ( " I n t r o d u c i r m o n t o g a s t a d o p a r a \ H3 6 . r u b r o % d e n e l m e s ? d : " , i + 1 , j + 1 ) ;3 7 - s c a n f ( ' r e d ' , , & g a s t o t i l t j I ) ;3 8 - )3 9 . / * P r o m e d i o p a r a c a d a r u b r o * /

    4 0 . p r i n t f ( " E 1 p r o m e d i o a n u a f d e g a s t o s e n v i v i e n d a \4 7 . e s : % f \ n " , p r o m e d i o A n i o ( 0 ) ) ;4 2 . p r i n L f ( " E 1 p r o m e d i o a n u a l d e g a s t . o s e n a l i m e r - r t a c i n \4 3 . e s : ? f \ n " , p r o m e d i o A n i o ( 1 ) ) ;4 4 . p r i n t f ( " t r 1 p r o m e d i o a n u a l d e g a s L o s e n e d u c a c i n \4 5 . e s : % f \ n " , p r o m e d i o A n i o ( 2 ) ) ;4 6 .

    4 ' 7 . / * M e s c o n g a s t o m a s a l L o p a r a c a d a r u b r o * /

    4 8 . p r i n t f ( " E l m e s c o n m a s g a s t o e n v i v i e n d a \4 9 . e s : ? c l \ n " , m e s G a s t o ( 0 ) ) ;5 0 . p r i n t f ( " E l m e s c o n n t a s g a s t o e n a l i m e n t a c i n \5 1 . e s : ? d \ n " , m e s G a s t o ( f ) ) ;5 2 . p r i n t f ( " E f m e s c o n m a s g a s t o e n e d u c a c i n \5 3 . e s : ? d \ n " , m e s G a s t o ( 2 ) ) ;5 4 . )El cdigo C termina aqu...

    F in del E jemplo l . l0

    El cdigo anterior puede ser compilado y enlazado con el comando cc para generar loscdigos objetos respectivos y obtener el archivo . out correspondiente. Es importanteresaltar que cada archivo de igual forma puede ser compilado por separado mientrascontemple las sentencias #include necesarias en cada caso.

    Volumen 4: Funciones en C Unidad 1: Funciones en 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

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

    . Explicar la naturaleza y uso de las funciones.

    . Describir algunas funciones incorporadas de C, y la forma en que el las sonusadas.

    . ldentificar las diferentes partes del encabezado de una funcin ldentif icar los diferentes t ipos de argumentos.. Definir prototipos de funciones y listar sus usos.. Usar las funciones para solucionar problemas.

    Unidad 1 : Func iones Volumen 4: Funciones en C 34

    @ 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 1: Examen de Autoevaluacin1) Elt ipo de retorno de una funcin es obligatorio en su definicin.

    a) Verdadero.b) Falso.

    2) Cules de las siguientes es caracterst ica del nombre dado a una funcin definidapor el usuario?a) Debera expresa la naturaleza de la tarea l levada a cabo por la funcin.b) Satisface las reglas para formar un identif icador en C.c) Aparece en el encabezado de la funcin.d) Todas las anteriores.

    3) El encabezado de la funcin t iene una l ista de identif icadores y sus t ipos definidos.separados por comas. Cmo se l laman estos parmetros?a) Parmetrosactuales.b) Parmetrosformales.c) Parmetros de prototipos.d) Parmetros normalizados.

    4) Cuando se define una funcin, no es necesario declarar los nombres de losargumentos en la l ista de argumentos formales.a) Verdaderob) Falso

    5) En la l ista de argumentos formales de un prototipo de funcin, no es necesariodeclarar los nombres de los argumentos.a) Verdaderob) Falso

    6) Teniendo bien ubicado el prototipo de una funcin, Dnde puede estar localizadala definicin de dicha funcin?a) Antes de la func i main.b) Despus de la func in mai ,n .c) Dentro de la funcin main.d) Arrbos (a) y (b)

    Volumen 4: Funciones en C Unidad 1: Funciones en C 35

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

    o parcialmente sin el permiso previo escr i to de IBM

  • lntr,>duccin a la Prooramacin con C Gua del Estudiante

    7) Dnde debe estar localizado el prototipo de funcin?a) Dentro de la funcin main.b) Antes de alguna instruccin del Preprocesador.c) Justamente antes de la definicin de la funcin en s misma.d) Antes de tcdas las funciones, incluyendo la funcin main.

    8) Cuando una funcin es invocada, el conjunto de entradas se pasa a la funcin atravs de la l ista de variables l lamadaa) Parmetrosformales.b) Parmetros actuales.c) Variables globales.d) Variables locales.

    9) Dentro del cuerpo de la funcin, es mandatorio tenera) Exactamente una sentencia return.b) A l menos una sentencia reLurn.c) Cero o ms senten