unidad iv-1 funciones en lenguaje c

Upload: marcos-narvaez

Post on 14-Jan-2016

8 views

Category:

Documents


0 download

DESCRIPTION

Funciones en lenguaje c

TRANSCRIPT

  • UNLaR - APUNTES DE PROGRAMACION I Prof. Ing. Marcelo Daniel Camargo

    - 56 -

    Funciones Uno de los aspectos deseables de los lenguajes de alto nivel, es que brinde mecanismos que faciliten la mantenibilidad del cdigo. Para ello, el programa en lenguaje de alto nivel debe ser comprensible para el ser humano. Sera imposible que una persona lea y entienda la lgica de un programa de varias pginas si este no est, de alguna forma, estructurado y dividido en mdulos lgicos, con fines especficos. Los lenguajes de alto nivel, entre ellos el C, brindan una forma de agrupar una serie de sentencias en un mdulo lgico, para cumplir un fin determinado. Los nombres que se le dan a estos, en los diversos lenguajes son: procedimientos, subrutinas, subprogramas o funciones. En C, las funciones son muy flexibles y cubren la mayora de las necesidades que puede necesitar un programador. La nica limitacin que tiene el C, y que hace a la modularidad completa de un lenguaje, es la imposibilidad de la declaracin anidada de funciones (o anidamiento de funciones); esto es lo que permite tener funciones declaradas dentro de otra funcin, que solo podrn ser utilizadas por esta. Una funcin es un grupo de sentencias, utilizadas como un todo, que puede ser invocado, desde distintos lugares del programa. Para invocarla, es necesario utilizar el nombre que se le asign a esta y seguido, entre parntesis, la lista de argumentos; en el mismo orden en que fueron declarados los parmetros formales de la funcin.

    Declaracin de funcin La forma general es: tipo_devuelto nombre_funcin(lista de parmetros) { cuerpo de la funcin return expresin_devuelta } en la cual podemos identificar:

    tipo_devuelto indica el tipo de dato que devuelve la funcin. Si este no se indica, el compilador asume que el tipo de dato devuelto es int y ser obligatorio devolver un int mediante return.1

    El nombre de la funcin es un identificador asignado por el programador. Este debe ser representativo del objetivo que cumple la funcin.

    La lista de parmetros contiene los nombres de las variables, separadas por coma, con sus respectivos tipos, que utilizar la funcin como entrada.

    La omisin de los parmetros formales, indica que la funcin no necesita datos de entrada. Tiene el mismo efecto que el de colocar como nico parmetro un tipo void. De todos modos, la sintaxis del lenguaje obliga a que los parntesis estn siempre presentes.

    El cuerpo de la funcin es un grupo de sentencias que cumplirn el objetivo de esta. La palabra reservada return indica la salida de la funcin, y retorno inmediato al lugar donde

    fue invocada. Puede haber ms de un return en el cuerpo de la funcin, pero se saldr por solo uno de ellos en cada ejecucin de la funcin, dependiendo de la lgica ejecutada en ese momento. Se omitir return en caso que el tipo del dato devuelto sea void. Si la salida no es de tipo void y se omite return, el valor devuelto por la funcin, queda tcnicamente indefinido (con el warning La funcin debera devolver un valor).

    expresin_devuelta es una expresin que del tipo tipo_devuelto.

    Existen tres causas por las cuales se puede salir de la funcin. Una es, una vez ejecutada la ltima sentencia de la funcin, otra cuando se encuentra la palabra clave return, que opcionalmente puede devolver un valor y ante un exit() que obliga a abandonar el programa.

    1 En la funcin main tambin se debe indicar el tipo devuelto. Algunos compiladores permiten que sea void, sin

    embargo, en los compiladores contemporaneos exigen devolver int, y en caso de la ejecucin exitosa se devuelve 0 o EXIT_SUCCESS o caso contrario devolver EXIT_FAILURE, ambas prototipadas en stdlib.h.

  • UNLaR - APUNTES DE PROGRAMACION I Prof. Ing. Marcelo Daniel Camargo

    - 57 -

    Invocacin de funcin La forma general es: identificador_de_funcin(lista de argumentos);

    Este es el caso de las funciones con salida void, o sea, que no retornan salida. Se puede decir entonces, que toda funcin cuya devolucin no sea de tipo void, puede ser utilizada dentro de cualquier expresin del C. Por ej. dada una funcin sqr que devuelva el cuadrado de su argumento, podra utilizarse de la siguiente forma: y = 2 * sqr(x) + x + 5; otro ej. podra ser una funcin may que devuelva de sus argumentos el mayor: if (may(x,y)) printf ("Entradas fuera de rango");

    Reglas de mbito Las reglas de mbito controlan si una sentencia conoce, o tiene acceso, a algn fragmento de cdigo, o de datos. En C el cdigo de una funcin es privado, y no se puede acceder a este desde otra funcin, a menos que se lo haga a travs de una invocacin explcita a la funcin1. El cuerpo de la funcin es desconocido para el entorno de la funcin y no puede ser accedido por otras partes del programa. Es decir, que el cdigo y los datos definidos dentro de una funcin, no interactan con el cdigo o los datos definidos dentro de otra, porque las dos funciones tienen mbitos diferentes.

    Variables locales Son las variables que se definen y son utilizadas dentro del mbito de una funcin. Estas son dinmicas, es decir, que pueden ser creadas y eliminadas en tiempo de ejecucin; en este caso, comienzan a existir, cuando se entra en la funcin, y se destruyen al salir de esta. Por esta razn, las variables locales convencionales no pueden mantener el valor a travs de sucesivas llamadas. Si se deseara esta caracterstica en alguna determinada variable de alguna funcin, se debera declarar a esta, con el modificador de tipo static, esto har que la variable tenga el comportamiento de una variable global, conservando el valor entre llamadas, pero manteniendo su privacidad.

    Parmetros formales Si una funcin necesita argumentos, debe declarar variables de entrada que acepten estos valores. A estas variables se les llaman parmetros formales de la funcin. Comparten el mismo mbito de las variables locales de la funcin y se comportan como tales. Al igual que estas, son variables dinmicas, es decir, se crean al entrar en la funcin y se destruyen al salir de ella.

    Revisin de algunos conceptos previos a travs de ejemplos. Ejemplo de declaracin de una funcin: Se har el ejemplo de una funcin trivial, que tendr como nico fin, comprender ciertos conceptos. No se justifica su implementacin en un programa real, ya que es mucho ms simple y eficiente realizar la operacin con el operador que nos brinda el lenguaje. Las implantaciones de las funciones se hacen fuera del cuerpo del main(), y se aconseja hacerlo debajo de este. No podr incluir o estar incluida en otra declaracin.

    int suma(int x, int y) { int aux; aux = x + y; return aux; }

    (1) Por ej. no podra utilizarse un goto en una funcin para saltar a alguna parte de otra funcin.

  • UNLaR - APUNTES DE PROGRAMACION I Prof. Ing. Marcelo Daniel Camargo

    - 58 -

    Los parmetros formales de la funcin suma son dos: x e y. aux es una variable local de la funcin suma. Esta funcin retorna a travs de aux la suma entre x e y.

    Invocacin de una funcin: Se har desde el cuerpo de una funcin (entre ellas la funcin main()).

    int m,z; :

    m=8; z=suma(m,5); /* m,5 = Argumentos utilizados por la funcin suma */ : /* se le asigna a z, el entero devuelto por suma */ printf("%f",z); :

    Una alternativa reducida del ejemplo anterior podra ser :

    :

    int m; m=8; printf("%d",suma(m,5)); :

    Se debe tener en cuenta que el tipo de los argumentos deben ser compatible con los tipos de los parmetros formales de la funcin. Si hay incompatibilidad de tipos, la compilacin no reportar error, pero los resultados sern impredecibles. Dentro del cuerpo de la funcin, tanto los parmetros formales como las variables locales, pueden ser utilizados dentro de cualquier expresin vlida.

    Prototipado de funciones Le indican al compilador el tipo de dato devuelto y el tipo y cantidad parmetros formales que tendr una funcin. Estos deben estar declarados, local o globalmente, antes que la funcin sea invocada. Pero lo usual es ubicar todos los prototipos junto con todas las declaraciones globales del programa, al comienzo del cdigo y antes de cualquier declaracin de funcin. El prototipado de las funciones naci con el ANSI C, para posibilitar que el compilador haga una comprobacin estricta de tipos, como se haca en otros compiladores como por ejemplo, los de Pascal. Ya vimos que si una funcin no declara el tipo_devuelto, el compilador interpreta que devuelve un entero. Si tanto los parmetros, como el tipo devuelto, son de tipo entero, no es necesario declarar el prototipo de la funcin. De todos modos es aconsejable, incluir tambin estos prototipos, ya que ayudan a la comprensin del cdigo. La forma general de prototipar una funcin es la siguiente: tipo_devuelto nombre_funcin(lista de parmetros); Se puede observar que es casi idntica a la primera lnea de la declaracin de una funcin. Solo difiere en que finaliza con punto y coma. El siguiente ej. podra ser el prototipo de una funcin: float func(int x, int y, float valor); Cuando se observa esta declaracin, se podra pensar en declarar en conjunto x e y de tipo int. de la siguiente forma: float func(int x,y, float valor); pero esta sintaxis el compilador no la permitir. Una alternativa valida del prototipo podra ser la siguiente: float func(int, int, float); En la cual se declaran la cantidad y los tipos de los parmetros, y no los nombres. Pero en este caso diferir de la primera lnea de la declaracin de la funcin, en la que debern existir los

  • UNLaR - APUNTES DE PROGRAMACION I Prof. Ing. Marcelo Daniel Camargo

    - 59 -

    nombres de los parmetros formales. Una de las funciones que cumplen los archivos de cabecera incorporados al cdigo del programa (con la clusula include del preprocesador), es prototipar al grupo de funciones compiladas, que pretendemos utilizar. En el siguiente breve ejemplo se ver un programa completo, que permite ver la forma en que se prototipan las funciones.

    #include // Para compilar fuera de Borland #include #include #include void caja_tit(int izq, int arr, int der, int aba,const char s[]); void printf_centrado(int izq,int der,int fila,const char s[]); void caja(int izq, int arr, int der, int aba); void gotoxy(int x, int y); // Esta func ya existe en Borland

    int main(void) { caja(1,1,80,23); // 23 para no producir el scroll de la pantalla printf_centrado(1,79,2,"*** TITULO DE LA PANTALLA ***"); caja_tit(5,5,55,20," TITULO DE LA CAJA "); gotoxy(1,24); printf("Linea de estado"); _getch(); // Requiere conio.h solo para verla en el entorno return 0; } void printf_centrado(int izq,int der,int fila,const char s[]) { gotoxy(izq+(der-izq+1)/2-strlen(s)/2,fila); printf(s); } void caja_tit(int izq, int arr, int der, int aba, const char s[]) { caja(izq,arr,der,aba); printf_centrado(izq,der,arr,s); } void caja(int izq, int arr, int der, int aba) { int i; gotoxy(izq,arr); printf("%c",201); for (i=izq+1; i

  • UNLaR - APUNTES DE PROGRAMACION I Prof. Ing. Marcelo Daniel Camargo

    - 60 -

    Si estas funciones fueran almacenadas en archivos externos, ya sea como cdigo fuente, incorporados con la clusula include o como programas objetos, podran ser utilizadas en cualquier programa que creemos. El ejemplo mostrar la utilizacin de algunas herramientas que nos permiten realzar la interface de texto por pantalla de un programa. Esta interface es muy simple y limitada, pero puede servir como base para realizar una ms compleja. El resultado de la ejecucin es el que se muestra:

    *** TITULO DE LA PANTALLA *** TITULO DE LA CAJA Linea de estado

    Al iniciar el cdigo se muestra el prototipado de las funciones caja, caja_tit y printf_centrado. caja permite dibujar una caja en pantalla indicando las coordenadas del borde superior

    izquierdo y el inferior derecho. caja_tit dibuja la caja y sobre el borde superior, centra el texto obtenido como argumento . printf_centrado imprime en pantalla un texto centrado, indicando la primera y segunda

    columna de donde se quiere centrar el texto entregado como argumento.

    Llamadas por valor y por referencia Es la forma en que se pasan los argumentos a las funciones. En las llamadas por valor se copia el valor del argumento en la variable usada como parmetro formal, de esta forma los cambios hechos al parmetro dentro del cuerpo de la funcin no afectan a la variable utilizada como argumento. Es el caso de todas las funciones de usuario planteadas hasta el momento. La llamada por referencia es la segunda forma de pasar los argumentos, en lugar de pasar el valor, se pasa una referencia la variable. De esta forma los cambios hechos a la variable referenciada, la afectan fuera del mbito de la funcin. En el ANSI C, se puede simular este tipo de llamadas, pasando como parmetros de la funcin las direcciones de la variable (los punteros a ellas). El C++, mejor este aspecto, implementando concretamente las llamadas por referencia.