P i I T 6 P i I T 6 Programacin I. Tema 6 Programacin I. Tema 6
Manejo de funciones en C Contenido Contenido Concepto de algoritmo parametrizado. Formalizacin de algoritmos parametrizados. Funciones en C. Tipos de parmetros. Paso de parmetros en C. Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 2 2 Concepto de algoritmo parametrizado Concepto de algoritmo parametrizado El diseador del algoritmo necesita saber la funcionalidad del algoritmo llamado Al it ll t it l i t f d l Algoritmo llamante necesita conocer la interfaz del algoritmo llamado: El nombre del algoritmo. Orden, tipos de cada uno y clase de cada uno de los parmetros si los hay. El tipo del valor que retorna como algoritmo llamado, si es que retorna. Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 3 Para el algoritmo llamante, el algoritmo llamado es considerado como una sola accin. Formalizacin de algoritmo Formalizacin de algoritmo Todo algoritmo debe estar formalizado. En la precondicin (Pre) se indica los requisitos que tiene que cumplir originalmente los parmetros El algoritmo tiene que tener un nombre significativo, junto a los parmetros que tiene y que toma como origen del algoritmo, y los parmetros que contienen el resultado de dicho algoritmo En la postcondicin (Post) se indica, con la mayor precisin posible, la funcionalidad del algoritmo y la Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 4 relacin entre los resultados obtenidos y los datos de origen 3 Funciones en C Funciones en C La definicin en C est formada por: Cabecera. Contiene: El nombre de la funcin. Los parmetros si los tiene (tipos de cada uno Los parmetros si los tiene (tipos de cada uno, nombre del parmetro. Estos forman parte del entono del algoritmo. Tipo del valor que retorna. (int, char, ) Cuerpo. Contiene : La declaracin de variables de la funcin (completan el entorno), si las hay. Secuencia de acciones del algoritmo parametrizado Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 5 g p (acciones). Si la funcin devuelve un valor, ser necesario el uso de la sentencia: return (valor_a_devolver); Funciones en C Funciones en C Formato de una funcin definida por el programador. tipo valor de retorno nombre funcin ( lista de parmetros con tipos ) C A B E C E R A C A B E C E R A (header) (header) tipo_valor_de_retorno nombre_funcin ( lista de parmetros con tipos ) { /* ENTORNO */ declaracin de variables locales /* ACCIONES */ CC UU E E (body) (body) RR Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 6 sentencias de la funcin [ return (<expresion>); ] } PP OO 4 Funciones en C Funciones en C Ejemplo: Definir una funcin que dado dos nmeros enteros, sume dichos nmeros y devuelva el resultado obtenido Formalizacin: Pre {ninguna } funcion suma (a, b : enteros) dev ( c: entero); Post {c =a +b } Codificacin: int suma (int a, int b) { int suma (int a, int b) { return(a +b); Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 7 { int c; c=a+b; return (c); } return (a +b); } Funciones en C. Funciones en C. Cmo se invoca a una funcin? int main (void) { int resultado; /* resultado op */ int num1; /* operando 1 */ int num2; /* operando 2 */ ......................... resultado = suma (num1,num2); } Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 8 int suma ( int x, int y ) { return ( x + y ); } 5 Funciones en C. Funciones en C. La llamada a una funcin puede formar parte de una expresin. Al ser evaluada la expresin, la funcin se ejecuta y es sustituida por el valor que ha devuelto sustituida por el valor que ha devuelto int main (void) { int num1; / * oper ando 1 */ int num2; / * oper ando 2 */ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if ( suma (num1, num2) >= 0 ) fprintf (stdout, La suma es positiva); Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 9 else fprintf (stdout, La suma es negativa); ................................................ } Tipos de parmetros Tipos de parmetros Segn el algoritmo al que pertenece: Formal: el que se usa para definir el algoritmo parametrizado. Forma parte de su entorno. A t l f ti l l t d d Actual o efectivo: el valor que toma en cada una de sus llamadas. Pertenece al algoritmo llamante. Dependiendo del sentido del intercambio de informacin: De entrada o de dato. De salida o resultado. De entrada/salida. Dependiendo del mecanismo que emplea el lenguaje: Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 10 Dependiendo del mecanismo que emplea el lenguaje: Valor: Se hace una copia del parmetro actual al parmetro formal. Referencia: Se copia la direccin del parmetro actual al parmetro formal. 6 Clasificacin de parmetros Clasificacin de parmetros Parmetro formal: Es el nombre genrico que recibe cada uno de los parmetros en la cabecera y dentro de la funcin. Parmetro actual: Es el parmetro que se emplea en la Parmetro actual: Es el parmetro que se emplea en la llamada a la funcin. int main (void) { int resultado; int num1; int num2; Parmetros actuales Parmetros formales Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 11 int suma (int x,int y) { return ( x + y ); } int num2; ............... resultado = suma (num1,num2); ............... } Clasificacin de parmetros Clasificacin de parmetros El nombre de un parmetro formal y un parmetro actual pueden coincidir, pero representan cosas distintas. Un parmetro formal representa a una variable del algoritmo parametrizado Se crea automticamente en algoritmo parametrizado. Se crea automticamente en memoria en el momento de la llamada a la funcin. Durante la ejecucin de la funcin, se podr acceder a dichos parmetros, y no tendr sentido acceder a los mismos despus de finalizar la ejecucin de la funcin. ? Memoria ????: ???? int suma (int x,int y) Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 12 ? ? ? ? ????: ????: ????: ????: x: y: ( , y) { return ( x + y ); } 7 Parmetros de entrada Parmetros de entrada Para su implementacin se utiliza el mecanismo de paso de parmetros por valor. En el momento de la llamada, se copia el valor del parmetro actual en el parmetro formal parmetro actual en el parmetro formal. La funcin parte del valor copiado. Si modificar el valor del parmetro formal, esta modificacin no afecta al valor del parmetro actual. Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 13 Parmetro de salida o de entrada/Salida Parmetro de salida o de entrada/Salida Aun cuando el mecanismo adecuado para este tipo de parmetros es el de paso por referencia, C no proporciona este mecanismo. En C se pasa la direccin de memoria del parmetro actual En C se pasa la direccin de memoria del parmetro actual al parmetro formal. La funcin, al conocer la direccin del parmetro actual, puede modificar el contenido de la posicin de memoria referenciada. Permite retornar ms de un valor al poder existir ms de un parmetro de este tipo. Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 14 8 Parmetros de tipo Array en C Parmetros de tipo Array en C En C todos los parmetros de tipo Array se pasan por referencia, ya que un Array queda determinado por un puntero a la primera posicin del mismo. Si se quiere evitar que la informacin asociada a una Array sea modificada por alguna sentencia de un parametrizado, se debe utilizar el modificador const Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 15 int strcmp (const char* string1,const char* string2) Parmetros de tipo Array en C Parmetros de tipo Array en C Paso de un array como parmetro a una funcin void inicializar ( int x[] ) { int i; for (i=0; i<MAX; i++) x [i] = MAX - i; } void visualizar ( const int x[] ) { int i; Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 16 for (i=0; i<MAX; i++) { fprintf (stdout,"Posicion: %d , i); fprintf (stdout,Contenido: %d\n", x[i]); } } 9 Parmetros de tipo Array en C Parmetros de tipo Array en C #include <stdio.h> #define MAX 10 void inicializar (int x[]); void visualizar (const int x[]); void main (void) { int num [MAX]; Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 17 inicializar (num); visualizar (num); } Paso de estructura a una funcin Paso de estructura a una funcin Paso como parmetro de salida. Ejemplo: Codificar una funcin que rellene los datos de un alumno. typedef struct { yp { char nombre [50]; char grupo [3]; } TAlumno; void leerAlumno ( TAlumno *alumno ) { printf (Nombre); Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 18 printf ( Nombre ); gets (alumno -> nombre); printf (Grupo: ); gets (alumno -> grupo); } 10 Paso de estructura a una funcin Paso de estructura a una funcin Paso como valor devuelto. Ejemplo: Codificar una funcin que rellene los datos de un alumno. typedef struct { char nombre [50]; char grupo [3]; } TAlumno; TAlumno leerAlumno ( void ) { TAlumno alumno; printf (Nombre); Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 19 p t ( o b e ); gets (alumno.nombre); printf (Grupo: ); gets (alumno.grupo); return (alumno); } Paso de estructura a una funcin Paso de estructura a una funcin Paso como parmetro de entrada/salida.Ejemplo: Codificar una funcin que cambie el grupo de un alumno. typedef struct { typedef struct { char nombre [50]; char grupo [3]; } TAlumno; void modificaAlum ( TAlumno *alumno, const char newGrp [ ] ) { printf (El alumno %s tenia asignado el grupo %s, alumno -> nombre, alumno -> grupo); Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 20 strcpy (alumno -> grupo, newGrp); printf (y ha pasado al grupo %s\n , alumno -> grupo); } 11 Tipos de parmetros. Uso de void Tipos de parmetros. Uso de void Se utiliza para: Definir funciones que no retorna valor. void valorAbsoluto (int * num); Indicar que una funcin no tiene parmetros. int leerEnteroPositivo (void); Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 21 Funciones. Orden de definicin Funciones. Orden de definicin Una funcin tiene que estar declarada antes de ser invocada. Posibles alternativas: Ubi t d l f i l t l Ubicar todas las funciones para que se cumpla esta regla (esto no siempre es posible). Declarar los prototipos de las funciones (funciona siempre) antes de su utilizacin. Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 22 12 Funciones. Prototipos Funciones. Prototipos El prototipo de una funcin contiene la misma informacin que la cabecera de la funcin: Nombre de la funcin. Ti d l t Tipo de valor que retorna. Los parmetros que hay y su orden. Tipo de cada parmetro. tipo_valor_funcin nombreFuncion (tipo_par par, ); El uso de prototipos permite la ordenacin arbitraria de Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 23 El uso de prototipos permite la ordenacin arbitraria de definicin de funciones. Funciones. Prototipos Funciones. Prototipos Si la funcin es: int resta (int a, int b) { return( b a ); } Su prototipo es : int resta (int a, int b); /* retorna b a */ El nombre de los parmetros no es estrictamente necesario, pero si se quiere explicar la funcionalidad es necesario Si la Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 24 pero si se quiere explicar la funcionalidad es necesario. Si la declaracin del prototipo fuera int resta (int, int); /* retorna */ ?????? Qu realiza? (a b), (b a) Qu es a y que es b? 13 Paso de parmetros a la funcin main Paso de parmetros a la funcin main Al programa principal se le pueden pasar parmetros actuales desde la lnea de comandos al invocarlo. Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 25 Nombre del programa Parmetros Paso de parmetros a la funcin main Paso de parmetros a la funcin main El prototipo de la funcin main es: int main ( int argc, char * argv [ ] ); El parmetro argc nos indica cuntos elementos tiene el array argv. El parmetro argv es una tabla de punteros a cadenas de caracteres. Estas cadenas de caracteres son los parmetros que se introducen desde la lnea de comandos. Si no se ha producido ningn error en la ejecucin de la
Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 26 funcin main, se devolver un 0, en caso contrario, se devolver un 1. 14 Paso de parmetros a la funcin main Paso de parmetros a la funcin main En la siguiente invocacin al programa factores_primos: D:\> factores_primos 10 pepe 12.4 Los valores que tomarn los parmetros de la funcin main sern los siguientes: argc = 4 (el nombre del programa se tambin se cuenta) argv [0] = factores_primos argv [1] = 10 Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 27 argv [1] 10 argv [2] = pepe argv [3] = 12.4 Paso de parmetros a la funcin main Paso de parmetros a la funcin main #include <stdio.h> int main ( int argc, char * argv[ ] ) {{ int i; if (argc!=3) fprintf(stdout, Ejecute: <nombre del programa><parametro 1> <parametro 2>); else for (i=0; i<argc; i++) fprintf(stdout,El argumento %d es: %s\n , Curso 05/06 Programacin I: Manejo defunciones en C Tema6 - 28 fprintf(stdout, El argumento %d es: %s\n , i, argv [ i ]); return 0; }