Capítulo 6 - Funciones.pdf

download Capítulo 6 - Funciones.pdf

of 18

Transcript of Capítulo 6 - Funciones.pdf

  • 7/25/2019 Captulo 6 - Funciones.pdf

    1/18

    ITSON Manuel Domitsu Kono

    Captulo 6

    Funciones

    Un programa es la implementacin de un algoritmo para resolver un problema mediante lacomputadora en un lenguaje de programacin. Un programa consta de una serie de datosy los procesos que se van a realizar sobre esos datos. En el Captulo 2: Algoritmos,Programacin estructurada, Diseo descendente, se estudi una tcnica que nos permitagenerar el algoritmo para la solucin de un problema. Esta tcnica, llamada diseodescendente consiste en, inicialmente describir la solucin del problema en forma general,

    mediante una serie de subtareas que sabemos que son necesarias para resolver elproblema, pero que no necesariamente tengamos en forma clara como realizarlas en estaprimera etapa. Posteriormente cada una de esas subtareas se analiza con ms detalle yde ser necesario se descompone a su vez, en una serie de subtareas. Este proceso secontina hasta que cada uno de los pasos para resolver el problema puede expresarsemediante instrucciones que la computadora puede realizar.

    Los dos principios fundamentales en la tcnica de diseo descendente son: Primero, unatarea compleja se subdivide en varias subtareas ms pequeas y fciles de llevar a cabo;y segundo, una tarea delega a sus subtareas la misin de realizar su cometido sinimportarle los detalles de cmo la realiza.

    C soporta la tcnica de diseo descendente mediante el concepto de funcin. En elCaptulo 4: Estructura de un programa en C, se mencion que un programa en C consistede una o ms funciones. Una funcin en C es un subprograma que realiza una tareaespecfica del programa. Una funcin consta de una serie de datos y el proceso arealizarse con ellos.

    Por ejemplo considere el siguiente problema:

    Crea un programa que calcule el rea bajo la curva y = x2y que se encuentra entre lasrectas x = xi y x = xf. Aproxime el rea bajo la curva como la suma de las reas de n

    rectngulos inscritos bajo la curva. El programa deber pedir los valores de xi y xf, ascomo el nmero de rectngulos a usarse.

    Una primera aproximacin a la solucin del problema est dada por el siguientepseudocdigo:

    l ee datoscal cul a r eaescr i be rea

  • 7/25/2019 Captulo 6 - Funciones.pdf

    2/18

    88 Funciones

    ITSON Manuel Domitsu Kono

    En lugar de proceder a refinar cada uno de los pasos anteriores, podemos pensar quecada una de las tareas anteriores puede realizarse mediante una funcin. Esto es,podemos tener una funcin para leer los datos, l eedat os( ) , otra para calcular el rea,cal cul aAr ea( ) y una tercera para escribir el rea, escr i beAr ea( ) . La funcinmai n( ) se encarga de llamar a las funciones en la secuencia adecuada para que la tarea

    se lleve a cabo.

    Las ventajas del uso de funciones en un programa son:

    1. Las funciones en un programa facilitan el partir un programa grande en unidadesms manejables y pequeas. Cada una de estas partes constituye un subprogramael cual puede implementarse y probarse por separado.

    2. Colocando la parte del cdigo del programa que se usa con ms frecuencia en unafuncin permite acortar el tamao de ste. Por ejemplo considere un programa enel cual se utilice varias veces la funcin pr i nt f ( ) . En el programa ejecutable, slo

    aparece una vez el cdigo de esta funcin an cuando en el programa la hayamosllamado 10 o 20 veces. Esto mismo es aplicable a funciones que nosotros creemos.

    3. Las funciones creadas para un programa pueden reutilizarse en otros. De nuevoconsidere la funcin pr i nt f ( ) , la cual podemos llamarla desde cualquierprograma que deseemos. C nos permite que el cdigo de una o varias funcionesque hayamos creado, sea incluido en cualquier programa.

    4. Una funcin encapsula (nos oculta) su cdigo y datos. Esto es, para poder usaruna funcin no es necesario tener el conocimiento de la operacin interna de lafuncin, slo debemos saber su interfaz (como llamarla, qu valor regresa y que

    informacin requiere para operar). De nuevo, para usar la funcin pr i nt f ( ) no serequiere conocer el cdigo de la funcin, slo su interfaz.

    Para poder emplear una funcin en C se requiere hacer lo siguiente: Declarar la funcin,definir la funcin y llamar a sta en el programa.

    Declaracin de una Funcin

    La declaracin de la funcin, tambin llamada prototipo de la funcin, sirve para

    informarle al compilador de la existencia, en algn lugar del cdigo, de una funcin y quela funcin tiene el nombre, regresa un valor del tipo y recibe los parmetros que aparecenen la declaracin. La sintaxis de la declaracin de una funcin es la siguiente:

    tipo nomFunc(tipo1 [ nomParam1] [ , tipo2 [ nomParam2] ] . . .);

  • 7/25/2019 Captulo 6 - Funciones.pdf

    3/18

    Captulo 6 Funciones 89

    ITSON Manuel Domitsu Kono

    Donde tipo,es un especificador de tipo, el tipo de la funcin, es decir el tipo del valor

    regresado por la funcin. Una funcin puede ser de cualquiera de los tipos enteros oflotantes. Inclusive la funcin puede no regresar valores en cuyo caso se dice que lafuncin es de tipo void.

    nomFunces un identificador, el nombre de la funcin.

    tipo1 [ nomParam1] [ , tipo2 [ nomParam2] ] es la lista de declaraciones deparmetros de la funcin. Cada declaracin de un parmetro consta de un especificadorde tipo seguido opcionalmente de un identificador. Aunque el nombre del parmetro esopcional se recomienda incluirlo ya que el nombre es indicativo del uso que se le da alparmetro. El tipo del parmetro es el tipo del valor que la funcin recibir al momento deser llamada. Una funcin puede tener cero, uno o ms parmetros. En el caso de que lafuncin no tenga parmetros, se utiliza la palabra voiden lugar de la lista de parmetros.

    El propsito bsico de la declaracin de una funcin es el de permitirle al compilador

    verificar que al llamar a la funcin, los tipos de los argumentos que le pasemos sean losmismos que los de los parmetros que se especificaron en la declaracin. Lo anterior nosda un nivel de proteccin contra el mal uso de las funciones.

    Una funcin debe declararse antes de ser llamada. Su posicin en el cdigo puede ocurriren varios lugares: Si la declaracin se hace externa a las funciones, el compilador lareconoce desde el momento en que aparece la declaracin hasta el final del cdigo. Si ladeclaracin forma parte de la lista de declaraciones dentro de una funcin, la declaracinslo es vlida dentro de la funcin en que fue hecha. La prctica ms comn es colocarlas declaraciones de las funciones al principio del cdigo, despus de las directivas alpreprocesador.

    En el caso de las funciones de la biblioteca estndar de C, las declaraciones de lasfunciones o prototipos se encuentran agrupadas por categoras en archivos texto,llamados archivos de encabezados, los cuales tienen la extensin ". h" y para incluir sucontenido a nuestro programa usamos la directiva del preprocesador #i ncl ude. Porejemplo los prototipos de las funciones de entrada y salida de la biblioteca estndar talescomo pr i nt f ( ) o scanf ( ) , se encuentran en un archivo de encabezados llamadostdio.h.

    La declaracin de la funcin le muestra al programador cul es la interfaz entre elprograma y la funcin, ya que puede determinar a partir del prototipo cmo usar la funcin.Esto es, al momento de declarar la funcin estamos estableciendo como va a interactuarla funcin con el resto del programa, sin necesidad de saber cmo la funcin realiza sutarea. Por ejemplo para hacer las declaraciones de las funciones del problema sobre elclculo del rea bajo una curva mencionado en la seccin anterior debemos establecerpara cada funcin, que valor regresa y qu datos requiere. Supongamos que en esteejemplo, diseamos el programa de tal manera que la funcin mai n( ) llama

  • 7/25/2019 Captulo 6 - Funciones.pdf

    4/18

    90 Funciones

    ITSON Manuel Domitsu Kono

    consecutivamente a las tres funciones. El diagrama de la figura 1 muestra cmo estninteractuando las funciones y la informacin que fluye entre ellas.

    Figura 7-1

    Podemos ver que la funcin l eeDat os( ) lee del teclado la abscisa inicial, x i, la abscisafinal xf y el nmero de rectngulos, n. Dado que la funcin cal cul aAr ea( ) requiereestos datos para calcular el rea, la funcin mai n( ) que es quien la llama debemandrselos. Para ello mai n( ) debe allegarse de esos datos primero. Desearamospues, que la funcin l eeDat os( ) le devuelva a mai n( ) los datos ledos. Sin embargouna funcin slo puede devolver un dato y no tres, por lo que una opcin para resolvereste problema es que la funcin l eeDat os( ) le regrese un valor y los otros dos los deje

    en localidades de memoria que sean accesibles a todas las funciones. Este tipo delocalidades se conocen como variables externas (ver las secciones: Clases deAlmacenamiento y Alcance Lxico). En el Captulo 8: Apuntadores, se estudiar unamejor manera de resolver este problema. Por lo pronto, la funcin l eeDat os( ) regresarel nmero de rectngulos, un nmero entero, y dejar en las variables xi y xf los valores dexiy xf. La funcin leeDatos no requiere de informacin para realizar su trabajo, por lo quesu declaracin tiene la forma:

    i nt l eeDat os( voi d) ;

    recuerde que la palabra void en la lista de parmetros indica que la funcin no tiene

    parmetros.

    La funcin cal cul aAr ea( ) por su parte debe regresar el valor del rea bajo la curva, unflotante. Esta funcin requiere para poder calcular el rea de los valores de las abscisasinicial y final y del nmero de rectngulos. Los valores de las abscisas los puede accesardirectamente de las variables externas xi y xf, pero el nmero de rectngulos lo deberecibir de la funcin mai n( ) , ya que es quien la llama. La declaracin decal cul aAr ea( ) queda como:

  • 7/25/2019 Captulo 6 - Funciones.pdf

    5/18

    Captulo 6 Funciones 91

    ITSON Manuel Domitsu Kono

    f l oat cal cul aArea( i nt n) ;

    Por ltimo la funcin escr i beAr ea( ) no regresa ningn valor ya que su trabajo es slode desplegar el resultado. La funcin escr i beAr ea( ) requiere que la funcin mai n( ) le

    mande el valor del rea, un flotante. La declaracin de la funcin queda como:voi d escri beAr ea( f l oat ar ea) ;

    Definicin de una Funcin

    Al definir una funcin estamos estableciendo el contenido de la funcin, esto es, qusentencias se ejecutarn al ser llamada.

    Las definiciones de las funciones, incluyendo la de la funcin mai n( ) pueden ocurrir encualquier orden, pero es una prctica comn que la funcin mai n( ) se coloque al principioy las siguientes en el orden en que van siendo llamadas.

    La sintaxis de la definicin de una funcin es la siguiente:

    tipo nomFunc(tipo1 nomParam1[ , tipo2 nomParam2] . . .) {[ declaracin local] . . .

    [ sentencia] . . .}

    La definicin de una funcin consta de dos partes: El encabezado de la funcin y el bloque

    de la funcin.

    Encabezado de una funcin

    El encabezado de una funcin tiene una sintaxis similar a la declaracin de la funcin conlas siguientes diferencias:

    1. La declaracin de una funcin termina en punto y coma (;). El encabezado de unafuncin no.

    2. En la lista de parmetros, el nombre de cada parmetro noes opcional.

    3. Los nombres de los parmetros en la declaracin no tienen que ser los mismos delos correspondientes parmetros de la definicin.

  • 7/25/2019 Captulo 6 - Funciones.pdf

    6/18

    92 Funciones

    ITSON Manuel Domitsu Kono

    Parmetros de una funcin

    Los parmetros son localidades de memoria en los que la funcin recibe valores almomento de ser llamada. Los parmetros se comportan como variables automticas(ver las secciones: Clases de Almacenamiento y Alcance Lxico).

    Bloque de una funcin

    Un bloque en un programa es una construccin de cdigo que contiene declaracioneslocales a ese bloque y una sentencia compuesta. la sintaxis de un bloque es:

    {[ declaracin local] . . .

    [ sentencia] . . .}

    Las llaves delimitan al bloque. Las declaraciones locales van en la parte superior delbloque.

    El bloque de una funcin es un bloque y contiene todo el cdigo que se ejecutar cuandose llame a la funcin.

    Las declaraciones locales son normalmente declaraciones de variables automticas;aunque podemos declarar localmente una funcin, tal como se mencion en la seccin:Declaracin de una funcin, (ver las secciones: Clases de Almacenamiento y AlcanceLxico).

    La sentencia return

    Cuando se llama a una funcin, el control del programa pasa de la funcin llamante a laprimera sentencia dentro del bloque de la funcin llamada y a partir de sta se ejecutan lasdems instrucciones en forma secuencial. Normalmente la funcin termina cuando se haejecutado la ltima instruccin en el bloque de la funcin y en ese momento el control estransferido a la funcin llamante. Sin embargo es posible terminar la funcin en cualquierlugar del cdigo utilizando para ello la sentencia return, cuya sintaxis es:

    return [expresin] ;

    La sentencia return genera un salto al final de la ltima instruccin dentro del bloque de lafuncin, terminando as la ejecucin de la funcin. Puede haber cero, una o mssentencias return dentro de una funcin, pero slo una de ellas se ejecutar.

    expresin debe ser una expresin del mismo tipo de la funcin. Si se ejecuta una

    sentencia returnque tiene asociada una expresin; antes de terminar la ejecucin de lafuncin se evala la expresin y su valor es el valor devuelto a la funcin llamante.

  • 7/25/2019 Captulo 6 - Funciones.pdf

    7/18

    Captulo 6 Funciones 93

    ITSON Manuel Domitsu Kono

    Si una funcin es declarada como de tipo voi d, puede haber sentencias returnpero nodeben estar asociadas con expresiones. De estarlo el compilador marcar error.

    Si una funcin regresa un valor, la funcin llamante puede utilizar, almacenar o descartar

    ese valor. El valor se descarta si no hay una localidad de memoria a la que se asignedicho valor.

    Si una funcin es de un tipo diferente a voi d y no contiene una sentencia return o lasentencia returnno tiene asociada una expresin, el valor que regresa la funcin estindeterminado.

    Considere el ejemplo ya mencionado sobre el clculo del rea bajo una curva. Unadefinicin de la funcin l eeDat os( ) puede ser:

    i nt l eeDat os( voi d) {i nt n;

    pr i ntf ( "\ nVal or de l a absci sa i ni ci al , xi : ") ;scanf ( "%f ", &xi ) ;pr i ntf ( "\ nVal or de l a absci sa f i nal , xf : ") ;scanf ( "%f ", &xf ) ;pr i nt f ( " \ nNmer o de rect ngul os a empl ear: n: ") ;scanf ( "%d", &n) ;

    r et urn n;}

    Recuerde que las variables xi y xfson globales. La variable nes declarada como local.La funcin cal cul aAr ea( ) tiene la siguiente definicin:

    f l oat cal cul aAr ea( i nt n) {f l oat x, base, sumaH;

    base = ( xf - xi ) / n; / * base del r ectngul o */sumaH = 0; / * Acumul ador de al t ur as */

    f or ( x = xi ; x < xf ; x += base) sumaH += x*x;

    r eturn sumaH * base;}

    Las variables x, base y sumaH son locales. Note que no es necesario tener en estafuncin una variable para almacenar el valor del rea. Por ltimo, la funcin

    escr i beAr ea( ) , tiene la siguiente definicin:

    voi d escri beAr ea( f l oat ar ea) {pr i nt f ( "\ El r ea baj o l a cur va es %. 8f ", ar ea) ;

    }

  • 7/25/2019 Captulo 6 - Funciones.pdf

    8/18

    94 Funciones

    ITSON Manuel Domitsu Kono

    Llamada a una Funcin

    La llamada a una funcin es la forma en que le indicamos a C que ejecute las sentenciasque componen a esta funcin.

    Como ya se mencion anteriormente, La llamada a una funcin puede ocurrir como partede una expresin o como parte de una sentencia de expresin. En C cualquier funcinpuede llamar a cualquier otra funcin.

    La sintaxis de la llamada a una funcin es la siguiente.

    nomFunc([ arg1] [ ,arg2] . . .)

    nomFunces el identificador usado para declarar y definir la funcin.

    [ arg1] [ ,arg2] . . . es la lista de argumentos de la funcin.

    Argumentos de una funcin

    Una funcin puede tener cero, uno o ms argumentos. En el caso de que la funcin notenga argumentos, se escriben los parntesis vacos. No se pueden omitir los parntesis.

    Los parmetros usados en la definicin de la funcin y los argumentos usados en lallamada a la funcin deben de coincidir en nmero, de otra manera ocurre un error decompilacin.

    Cada argumento es una expresin, su valor es el valor que la funcin llamante le pasa a lafuncin llamada. La funcin llamada recibe este valor en su parmetro correspondiente. Siel tipo del argumento no es el mismo que el tipo del parmetro, el compilador tratar deconvertirlo al tipo del parmetro. Si la conversin no es posible, ocurre un error decompilacin.

    Si el argumento es una variable, el valor de la variable fuera de la funcin no se veafectada por los cambios que sufra su copia dentro de la funcin, ya que a la funcin slose pasa una copia del valor que hay en la variable que constituye el argumento.

    En el ejemplo sobre el clculo del rea bajo una curva, la llamada a la funcinl eeDat os( ) es:

    nRect = l eeDat os( ) ;

    donde nRect es una variable entera en la que se almacena el nmero de rectngulos,valor regresado por la funcin. La llamada a la funcin cal cul aAr ea( ) es:

    ar ea = cal cul aArea( nRect) ;

  • 7/25/2019 Captulo 6 - Funciones.pdf

    9/18

    Captulo 6 Funciones 95

    ITSON Manuel Domitsu Kono

    areaes la variable en la que se almacena el valor del rea bajo la curva. Por ltimo, lallamada a la funcin escr i beAr ea( ) se escribe como:

    escr i beAr ea( ar ea) ;

    El programa completo se muestra a continuacin:/ ** Fi l e: area3. c* Aut hor : mdomi t su** Created on 24 de sept i embre de 2009, 11: 46 PM

    */

    #i ncl ude #i ncl ude / ** Est e pr ogr ama tabul a el area baj o l a cur va y = x 2, ent r e l as* absci sas x = xi y x = xf . Ut i l i za el mt odo del r ectangul o.

    ** Este pr ogr ama i l ust r a el uso de f unci ones.*/

    / / Var i abl es ext er nasf l oat xi , xf ;

    / / Decl ar aci on de f unci onesi nt l eeDat os( voi d) ;f l oat cal cul aArea( i nt n) ;voi d escri beArea( f l oat area) ;

    i nt mai n( voi d) {i nt nRect ;f l oat area;

    / / Lee xi , xf y nnRect = l eeDat os( ) ;

    / / Cal cul ar el ar eaar ea = cal cul aAr ea( nRect ) ;

    / / Escri be ar eaescr i beAr ea( ar ea) ;

    r etur n ( EXI T_SUCCESS) ;}

    / / Def i ni ci n de f unci ones

    / *

    * i nt l eeDat os( )** Esta f unci n l ee del t ecl ado l os val or es de l a absci sa i ni ci al , xi ,* absci sa f i nal , xf , y el nmer o de rect ngul os.** Regr esa el nmero de r ectngul os y guarda en l as var i abl es externas l os* val or es de xi y xf .*/

    i nt l eeDat os( voi d) {i nt n;

  • 7/25/2019 Captulo 6 - Funciones.pdf

    10/18

    96 Funciones

    ITSON Manuel Domitsu Kono

    pr i nt f ( "\ nEst e pr ogr ama t abul a el ar ea baj o l a cur va y = x 2, ent r e l as") ; pr i nt f ( "\ nabsci sas x = xi y x = xf . Ut i l i za el mt odo del r ectangul o\ n") ;

    / / Lee l a absci sa i ni ci alpr i ntf (" \ nAbsci sa i ni ci al : " ) ;scanf ( "%f ", &xi ) ;

    / / Lee l a absci sa f i nalpr i ntf (" \ nAbsci sa f i nal : " ) ;scanf ( "%f ", &xf ) ;

    / / Lee el nmero de r ect ngul ospr i nt f ( "\ nNumer o de r ect angul os: ") ;scanf ( "%d", &n) ;

    ret ur n n;}

    / ** f l oat cal cul aAr ea( )** Esta f unci on cal cul a el area baj o l a cur va y = x 2 ent r e* l as absci sas xi y xf , usando el met odo del paral el ogr amo

    * con n r ectngul os. La f unci n r eci be el nmer o de rect angul os* y t oma de l as var i abl es ext er nas l os val or es de xi y xf .* La f unci n r egr esa el ar ea.*/

    f l oat cal cul aAr ea( i nt n) {f l oat base, sumaH = 0;f l oat x, y, area;

    / / Cal cul a basebase = (xf - xi ) / n;

    x = xi ;

    / / Mi ent ras x < xfwhi l e ( x < xf ) {

    / / Cal cul amos l a al t ura del r ect angul oy = x * x;

    / / Acumul amos al t urasumaH += y;

    / / Si gui ent e xx += base;

    }

    / / Cal cul a ar eaarea = base * sumaH;

    ret ur n ar ea;}

    / ** voi d escr i beAr ea( )** Est a f unci n despl i ega en l a pant al l a el ar ea baj o l a cur va.* La f unci n r eci be el ar ea.*/

    voi d escr i beArea( f l oat ar ea) {pr i nt f ( "\ nEl ar ea baj o l a cur va es %. 8f \ n\ n", ar ea) ;

    }

  • 7/25/2019 Captulo 6 - Funciones.pdf

    11/18

    Captulo 6 Funciones 97

    ITSON Manuel Domitsu Kono

    Ejercicios

    1. Modifica el programa anterior, para que las funciones en lugar de ser llamadastodas por la funcin mai n( ) , interacten tal como se muestra en la figura 2.

    Note que la funcin mai n( ) en este caso slo llama a la funcin l eeDat os( ) yque sta llama a la funcin cal cul aAr ea( ) . Por ltimo la funcincal cul aAr ea( ) llama a la funcin escr i beAr ea( ) para que despliegue el reabajo la curva. Bajo este esquema no se necesitan variables externas.

    Figura 7-2

    2. Rescribir el programa que calcula la media de las edades de un grupo de alumnos(ejercicio 1 sobre la sentencia while, Captulo 5: Sentencias de Control), de talmanera que se conste de tres funciones las cuales sern llamadas por la funcinmai n( ) :

    l eeDat os( ) cal cul aMedi a( ) escr i beResul t ado( )

    La funcin l eeDat os( ) deber leer el nmero de alumnos y las edades, las

    cuales ir acumulando. La funcin regresa el nmero de alumnos por el mecanismode return y deja la suma de edades en una variable externa.

  • 7/25/2019 Captulo 6 - Funciones.pdf

    12/18

    98 Funciones

    ITSON Manuel Domitsu Kono

    Clases de Almacenamiento

    Por clase de almacenamiento entendemos la duracin que tiene una variable en unprograma: Hay dos clases de almacenamiento: automtica y esttica. Para especificar la

    clase de almacenamiento de una variable se utilizan varias palabras reservadas junto conel contexto de la declaracin.

    Clase de Almacenamiento Automtica

    Las variables automticas son locales a un bloque: se crean al entrar al bloque y sedescartan al salir del bloque. Por lo que los valores almacenados en esas variables sepierde. Si el programa vuelve a entrar al bloque, el sistema vuelve a asignar memoria,pero los valores previos de las variables se pierden.

    la sintaxis de la declaracin de una variable automtica es:

    [[auto| register] ] tipo nomVar;

    El especificador auto establece una clase de almacenamiento automtica. Como por

    ausencia las variables declaradas dentro de un bloque son automticas, el especificadorauto no se requiere y por lo general no se usa. El especificador register, tambin

    establece una clase de almacenamiento automtica pero adems le indica al compiladorque, de ser posible, optimice el acceso a esa variable, crendola en uno de los registrosdel microprocesador en lugar de la memoria RAM.

    Los parmetros de la definicin de una funcin tambin tienen clase de almacenamientoautomtica y su bloque es el bloque de la funcin. En el ejemplo siguiente se muestran lasdiferentes variables con clase de almacenamiento automtica.

    / * Vari abl es ext ernas. Ti enen cl ase de al macenami ent o estt i ca */i nt x = 8;i nt y;

    i nt f ( i nt a, / * Par met r os de l a f unci n. Ti enen */i nt b) / * cl ase de al macenami ent o aut omt i ca */

    {/ * Vari abl es l ocal es a l a f unci n f ( ) */r egi st er i ; / * Cl ase de al macenami ent o aut omt i ca */

    i nt x, y; / * Cl ase de al macenami ent o aut omt i ca */st at i c i nt p; / * Cl ase de al macenami ent o est t i ca */

    - - -

    f or ( i = 0; i < a; i ++){

    / * Var i abl es l ocal es al bl oque de l a sent enci a f or * /r egi st er j ; / * Cl ase de al macenami ent o aut omt i ca */i nt z; / * Cl ase de al macenami ent o aut omt i ca */st at i c i nt q; / * Cl ase de al macenami ent o est t i ca */

  • 7/25/2019 Captulo 6 - Funciones.pdf

    13/18

    Captulo 6 Funciones 99

    ITSON Manuel Domitsu Kono

    - - -

    }- - -

    }

    Clase de Almacenamiento EstticaLas variables estticas pueden ser locales a un bloque o externas a todos los bloques, esdecir que se declaran fuera de las funciones. Pero en cualquier caso mantienen su valorentre salidas y reentradas a funciones o bloques.

    Las variables estticasson variables con clase de almacenamiento esttica y local a unbloque, incluyendo los bloques de funcin. La sintaxis de una variable esttica es:

    static tipo nomVar

    Una variable esttica es una variable que slo es conocida por el bloque en la cual esdeclarada pero que permanece con vida el tiempo que el programa est ejecutndose. Noes creada ni destruida cada vez que se llama y sale del bloque en que est declarada. Enotras palabras un variable con clase de almacenamiento esttica conserva su valor entrellamadas. Las variables estticas pueden inicializarse al declararse. Sin embargo, estainicializacin slo ocurre una vez, al principio de la ejecucin del programa.

    Las variables externas, que son las que se declaran fuera de todos los bloques, al mismonivel que las definiciones de las funciones, son siempre estticas. Una variable externa escreada al inicio de la ejecucin del programa y conserva permanentemente su localidad dememoria.

    En el ejemplo anterior, se muestran las diferentes variables con clase de almacenamientoestticas.

    Alcance Lxico

    El alcance lxico del nombre de una variable o funcin es la regin del cdigo delprograma dentro de la que se reconoce dicha variable o funcin. Hay varios tipos dealcance:

    Alcance de archivo. Un identificador de una variable o funcin declaradas fuera decualquier funcin tiene alcance de archivo. El alcance de este identificador principiaal final de su declaracin y persiste hasta el final del archivo. Las variablesexternas, las definiciones de funcin y las declaraciones de funcin colocadas fuerade las funciones tienen alcance de archivo.

  • 7/25/2019 Captulo 6 - Funciones.pdf

    14/18

    100 Funciones

    ITSON Manuel Domitsu Kono

    Alcance de bloque. Un identificador de una variable o funcin declaradas dentrode un bloque tiene alcance de bloque. El alcance de este identificador principia alfinal de su declaracin y persiste hasta el final del bloque. Las variablesautomticas, los parmetros en la definicin de una funcin y las declaraciones defuncin colocadas dentro de una funcin tienen alcance de bloque.

    Si un identificador se declara explcitamente a la cabeza de un bloque, incluyendoel que constituye la funcin, cualquier declaracin del identificador fuera del mismobloque se suspende hasta el final del bloque.

    Alcance de prototipo de funcin. Un identificador de un parmetro en ladeclaracin de una funcin tiene alcance de prototipo de funcin. El alcance deeste identificador termina al final de su declaracin. Los prototipos de funcin norequieren de nombres en la lista de parmetros. Slo de tipos. Si en la lista deparmetros de un prototipo de funcin se utiliza un nombre, el compilador ignorardicho nombre. Los identificadores utilizados para dichos parmetros pueden ser

    reutilizados en cualquier parte del programa sin problema.

    En el ejemplo siguiente, se muestran identificadores con los diferentes alcances lxicos:

    / * Vari abl es externas. Ti enen al cance de archi vo */i nt x = 8;i nt y;

    / * Decl ar aci n de l a f unci n f ( ) */i nt f ( i nt a, / * Par met r os de l a f unci n. Ti enen */

    i nt b) / * al cance de pr ot ot i po de f unci n */

    / * Def i ni ci n de l a f unci n f ( ) */i nt f ( i nt a, / * Par met r os de l a f unci n. Ti enen */i nt b) / * al cance de bl oque */

    {/ * Vari abl es l ocal es a l a f unci n f ( ) .

    Ti enen al cance de bl oque, el bl oque de l a f unci n */regi s ter i ;i nt x, y;stat i c i nt p;

    - - -

    f or ( i = 0; i < a; i ++){

    / * Var i abl es l ocal es al bl oque de l a sent enci a f or .

    Ti enen al cance de bl oque, el bl oque de l a sent enci af o r . * /regi s ter j ;i nt z ;stat i c i nt q;- - -

    }- - -

    }

  • 7/25/2019 Captulo 6 - Funciones.pdf

    15/18

    Captulo 6 Funciones 101

    ITSON Manuel Domitsu Kono

    Conclusiones sobre Clases deAlmacenamiento y Alcance Lxico

    De los conceptos de clases de almacenamiento y alcances lxicos podemos resumir losiguiente para los parmetros y variables automticas:

    Parmetros

    1. El nombre de un parmetro es local a la funcin en que se declara, esto es,podemos utilizar el mismo nombre del parmetro para otro parmetro o variablelocal en otra funcin o para una variable externa.

    2. Los parmetros se crean al momento de llamar a la funcin y se inicializan a losvalores con los que se llama a la funcin.

    3. Un parmetro es local al procedimiento. Esto es, slo es reconocida por la funcinque lo crea y slo tiene validez mientras la funcin se est ejecutando.

    4. Una funcin puede modificar los valores de sus parmetros.

    5. Los parmetros son destruidos al salir de la funcin y su valor se pierde.

    Variables Automticas

    1. El nombre de una variable automtica es local a la funcin en que se declara, estoes, podemos utilizar el mismo nombre del de la variable para otro parmetro ovariable automtica en otra funcin o para una variable externa.

    2. Las variables automticas se crean al momento de llamar a la funcin.

    3. Una variable automtica slo es reconocida por la funcin que la crea y slo tienevalidez mientras la funcin se est ejecutando.

    4. Las variables automticas son destruidas al salir de la funcin y su valor se pierde.

    Ejemplo Sobre Clases de Almacenamiento y Alcance Lxico

    Determina la salida del siguiente programa. Suponga que los valores tecleados son: 2, 3.

    / * Progr ama mezcol anza */

    #i ncl ude

    voi d mezcl a( i nt q, i nt a, i nt r) ;

  • 7/25/2019 Captulo 6 - Funciones.pdf

    16/18

    102 Funciones

    ITSON Manuel Domitsu Kono

    / * Var i abl es ext er nas */i nt a, b, x, y;

    i nt mai n( voi d){

    a = 1; b = 2; x = 7; y = 11;pr i nt f ( "\ n%d\ t %d\ t %d\ t %d", a, b, x, y) ;mezcl a( a, b, x) ;pr i nt f ( "\ n%d\ t %d\ t %d\ t %d", a, b, x, y) ;mezcl a( b, a, x - y) ;pr i nt f ( "\ n%d\ t %d\ t %d\ t %d", a, b, x, y) ;r et ur n 0;

    }

    voi d mezcl a( i nt q, i nt a, i nt r)/ * q, a y r son par met r os */

    {/ * Var i abl es aut omt i cas */i nt x, z;

    scanf ( "%d", &x) ;z = - x;

    x = x + 1;q = 2 * q + a;b = 1 + z - 2 * x;pr i nt f ( "\ n%d\ t %d\ t %d\ t %d\ t %d\ t %d", q, a, b, r , x, z) ;

    }

    Recomendaciones sobre el uso de parmetros yvariables en las funciones

    1. La comunicacin entre las funciones deber ser a travs de parmetros.

    2. Usar lo menos posible variables externas.

    3. Procurar (a fin de mejorar la claridad de un programa) no nombrar a una variableautomtica con el mismo nombre que el de una variable externa.

    4. Procurar (por la misma razn) no nombrar a un parmetro con el mismo nombreque el de una variable externa.

    Inicializacin de variables por ausencia

    En C, las variables con clase de almacenamiento esttica las cuales no son inicializadasexplcitamente por el programador son inicializadas a cero por el sistema. En el caso deser inicializadas explcitamente, el inicializador debe ser una expresin constante; Lainicializacin se realiza una vez, antes de que el programa inicialice su ejecucin.

    Las variables con clase de almacenamiento automtica, no son inicializadas por elsistema. Esto significa que al inicio tienen valores indefinidos (basura). Si son inicializadas,

  • 7/25/2019 Captulo 6 - Funciones.pdf

    17/18

    Captulo 6 Funciones 103

    ITSON Manuel Domitsu Kono

    el inicializador puede ser cualquier expresin que pueda ser evaluada al tiempo de lainicializacin. La inicializacin se hace cada vez que se entra a la funcin o bloque.

    Problemas

    1. Construir una funcin que determine la distancia entre dos puntos. La funcindeber recibir como parmetros las coordenadas de los dos puntos y regresar ladistancia entre ellos.

    Crea un programa que llame a la funcin anterior y que despliegue la distanciaentre los dos puntos.

    2. Crea una funcin que lea las calificaciones (0 - 10) de alumnos y cuente el nmerode alumnos reprobados, calificacin < 7, de un conjunto de notas. La funcin debe

    recibir por medio de un parmetro, el nmero de notas a leer y deber regresar elnmero de alumnos reprobados.

    Crea un programa que llame a la funcin anterior y que despliegue el nmero dealumnos reprobados.

    3. El mximo comn divisor de dos nmeros positivos es el entero ms grande que esdivisor de ambos nmeros. Por ejemplo el mximo comn divisor de 6 y 15 es 3.Escriba una funcin que reciba como parmetros dos nmeros enteros y regresesu mximo comn divisor.

    Crea un programa que llame a la funcin anterior y que despliegue el mximocomn divisor de dos nmeros.

    4. El mnimo comn mltiplo de dos nmeros positivos es el entero ms pequeo quees mltiplo de ambos nmeros. Por ejemplo el mnimo comn mltiplo de 6 y 15 es30. Escriba una funcin que reciba como parmetros dos nmeros enteros yregrese su mnimo comn mltiplo.

    Crea un programa que llame a la funcin anterior y que despliegue el mnimocomn mltiplo de dos nmeros.

    5. Mostrar lo que imprime el siguiente programa. Suponer que los datos tecleados son3, 2, 4.

    #i ncl ude const i nt di ez = 10;i nt c;

    voi d test( i nt z , i nt x) ;

  • 7/25/2019 Captulo 6 - Funciones.pdf

    18/18

    104 Funciones

    ITSON Manuel Domitsu Kono

    i nt mai n( voi d){

    i nt a, b;

    scanf ( "%d%d%d", &a, &b, &c) ;test(a - b, c) ;b += di ez;

    pr i nt f ( "\ nLas r espuest as son: %d, %d, %d", a, b, c) ;r et ur n 0;

    }

    voi d t est( i nt z, i nt x){

    i nt b;

    b = z * z;c = x / b;

    }

    6. Crea un programa que permita el despliegue de una tabla de conversin de C aF o de F a C. El programa deber tener al menos tres funciones:

    a. Una que lea los datos:

    Si la conversin va a ser de C a F o de F a C. El rango de valores de la tabla. El incremento.

    b. Otras dos funciones para desplegar cada tipo de tabla de conversin.