Sunteți pe pagina 1din 17

Fundamentos de Programacin Administracin de Sistemas Informticos

U.T. 4.-Funciones en C/C++


1. 2. 3. Subprogramas: Funciones y Procedimientos Ejemplos de funciones predefinidas en C/C++ Funciones del programador en C/C++ 3.1 Definicin y estructura de una funcin 3.2 Prototipo de una funcin 3.3 Llamada a una funcin Paso de parmetros a una funcin 4.1 Parmetros por valor 4.2 Parmetros por referencia 4.3 Parmetros por direccin mbito de las variables: 5.1 Variables locales y Globales 5.2 Clases de almacenamiento Tratamiento avanzado de funciones 6.1 Sobrecarga de funciones 6.2 Recursividad

4.

5.

6.

1. SUBPROGRAMAS: FUNCIONES Y PROCEDIMEINTOS


Un mtodo para solucionar un problema complejo es dividirlo en subproblemas, y a continuacin dividir estos subproblemas en otros ms simples, hasta que los problemas ms pequeos sean fciles de resolver. Este mtodo de disear la solucin de un problema principal obteniendo las soluciones de sus subproblemas se conoce como diseo descendente (top-down). Se denomina descendente, ya que se inicia en la parte superior con un problema general y el diseo especfico de las soluciones de los subproblemas. Normalmente las partes en que se divide un programa deben poder desarrollarse independientemente entre s. A cada una de estas partes se le denomina mdulo o subprograma. EJEMPLO Supongamos un programa tipo men para el clculo de reas de figuras geomtricas con las siguientes opciones:
1.- Cuadrado 2.- Tringulo 3.- Fin y donde segn la opcin seleccionada se piden los datos correspondientes y se calcula y muestra en pantalla el rea de la correspondiente figura geomtrica. Se podra disear el programa mediante 4 mdulos (funciones en C/C++) tal y como se refleja en el esquema siguiente:

Programa Men reas

Programa Principal 1 Men reas

Subprograma 2 Tringulo

Subprograma 3 Cuadrado

Subprograma 4 Area_Tringulo

<Tringulo>: pide los datos para el clculo del rea del tingulo, calcula el rea mediante otro subprograma y la muestra en pantalla <Area_Triangulo>: recibe la base y altura de un tringulo y devuelve el rea <Cuadrado>: pide los datos para el clculo del rea del cuadrado, calcula el rea y la muestra en pantalla

Como vemos en el ejemplo, el problema se soluciona por el correspondiente Programa Principal y la solucin de los subproblemas mediante los subprogramas. El Programa Principal (funcin main() en C/C++) controla todo lo que sucede. ste transfiere el control a los subprogramas (funciones en C/C++), de modo que ellos puedan ejecutar sus tareas. Cada subprograma devuelve el control al mdulo o Programa Principal cuando se haya completado su tarea

U.T.4. Programacin Modular. Funciones en C. EJEMPLO El ejemplo anterior podra quedar codificado as en C/C++: PROGRAMA menuarea.cpp

Fundamentos de Programacin Administracin de Sistemas Informticos

#include<iostream.h> void cuadrado ( ); //PROTOTIPOS o declaracin de funciones void triangulo ( ); float area_triangulo (float b, float a); int main() { int op; do{ cout<<Men reas<<endl; cout<<1-Triangulo 2-Cuadrado 3-Fin<<endl; cout<<Da opcin: ; cin>>op; if (op==1) triangulo (); //LLAMADA a las funciones else if (op ==2) cuadrado(); } while(op!=3); return 0; } void cuadrado ( ) //DEFINICIN de las funciones { int lado; cout<<"Introduce lado: "; cin>>lado; cout<<"Area cuadrado "<<lado*lado; return ; } float area_triangulo (float b, float a) { return b*a/2; } void triangulo ( ) { int base, altura; cout<<"Da base: "; cin>>base; cout<<"Da altura: "; cin>>altura; cout<<"Area del triangulo: "<<area_triangulo(base, altura); //LLAMADA a las funcin return ; } Caractersticas de un subprograma: 1.-Puede realizar las mismas acciones que un programa (aceptar datos, realizar clculos, escribir resultados), pero un subprograma , sin embargo, se utiliza por el Programa para un propsito especfico. 2.- Cuando desde un programa se invoca o realiza la llamada a un subprograma, se transfiere en ese punto el control al subprograma llamado, se ejecuta el subprograma, y a continuacin se devuelve el control o se retorna, al punto de llamada del P.P (Programa Principal). 3.- Puede ser llamado desde diferentes puntos del programa. Cada vez que el subprograma es llamado el control retorna al lugar desde donde fue hecha la llamada. 4.- Puede recibir datos desde el programa que realiza la llamada y devolver resultados o valores. 5.- Puede llamar a su vez a otros subprogramas. Las principales ventajas de dividir un programa en mdulos o subprogramas son: 1.- Facilitar el desarrollo y escritura del programa (cada mdulo es realizado de forma independiente) 2.- Facilitar el mantenimiento y actualizacin del mismo (solo se modifica el mdulo correspondiente) 3.- Creacin de bibliotecas o libreras (reutilizacin de mdulos o subprogramas) 2

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

Funciones y Procedimientos
Independientemente del nombre que en cada lenguaje de programacin se le da a los subprogramas (subrutinas, funciones, procedimientos, etc ), en Metodologa de la programacin se distinguen dos tipos de subprogramas: funciones y procedimientos. Una FUNCIN es un subprograma que realiza una tarea especfica, tomando o no una lista de valores y que devuelve un valor al punto de llamada. El valor est asociado al nombre de la funcin. EJEMPLOS area_triangulo (b, a) funcin, del ejemplo visto anteriormente, que calcula y devuelve le rea de un tringulo. Su prototipo es: float area_triangulo (float b, float a): lo que significa que el valor devuelto es de tipo float, y que hay que pasar a la funcin dos parmetros de tipo float sqrt(x) es una funcin de biblioteca (math.h) que calcula y devuelve la raz cuadrada de x. Su prototipo es: double sqrt (double x): lo que significa que el valor devuelto es de tipo double y que hay que pasar a la funcin un parmetro x de tipo double pow(x,y) es una funcin de biblioteca (math.h) que calcula y devuelve el valor x y . Su prototipo es: double pow (double x, double y) getch( ) es una funcin de biblioteca (conio.h) que lee un carcter de teclado y devuelve su cdigo ASCII. Su prototipo es: int getch (void)

Un PROCEDIMIENTO es un subprograma que realiza una tarea especfica, tomando o no una lista de valores y no devuelve ningn valor asociado al nombre del procedimiento. EJEMPLOS cuadrado( ) y triangulo( ) del ejemplo anterior. Sus prototipos, antecedidos por la palabra void indican que No devuelven ningn valor: void cuadrado ( ) void triangulo( ) gotoxy(x,y) es una funcin de biblioteca (conio.h) que sita le cursor en las coordenadas y,x. No devuelve ningn valor. Su prototipo es: void gotoxy (int x, int y) lo que significa que no devuelve ningn valor, por eso void, y que hay que pasar a la funcin dos parmetros x e y de tipo int. clrscr() es una funcin de biblioteca (conio.h) que realiza un borrado de pantalla. No devuelve ningn valor en su nombre. Su prototipo es: void clrscr (void) En C/C++ todos los subprogramas reciben el nombre de funciones. Por tanto, un procedimiento se implementar como una funcin que no devuelve ningn valor asociado a su nombre, es decir, una funcin void. (void: tipo de dato vaco o sin valor)

2. EJEMPLOS DE FUNCIONES PREDEFINIDAS EN C/C++


Como ya hemos visto, cada programa C/C++ tiene al menos una funcin main(); sin embargo, cada programa C/C++ constar normalmente de muchas funciones en lugar de una gran funcin main(). La divisin del cdigo en funciones hace que las mismas se puedan reutilizar en uno o varios programas. Todas las versiones de C/C++ vienen con bibliotecas estndar de funciones que proporcionan soporte para las tareas y operaciones utilizadas con mas frecuencia. Estas funciones permiten realizar una operacin con slo una llamada a la funcin (sin necesidad de escribirse cdigo fuente). Las funciones estndar o predefinidas, como as se denominan a las funciones pertenecientes a la biblioteca estndar, se dividen en grupos; todas las funciones que pertenecen al mismo grupo se declaran en el mismo archivo de cabecera.

U.T.4. Programacin Modular. Funciones en C. EJEMPLOS Grupo de funciones Funiones matemticas Funciones de consola Funciones de carcter Funciones de cadena Archivo de cabecera math.h conio.h ctype.h string.h

Fundamentos de Programacin Administracin de Sistemas Informticos

Ejemplo de funcin (prototipo) double sqrt (double x) void clrscr (void) int isdigit( int c) size_t strlen( const char *s)

Para utilizar una funcin, se debe conocer adems de la tarea que realiza, su nmero de parmetros o argumentos, sus tipos y el tipo del valor de retorno. Esta informacin se proporciona en EL PROTOTIPO de la funcin. Se debe incluir adems una sentencia #include indicando el archivo de cabecera en el que est declarada la funcin correspondiente. Veremos en este apartado ejemplos de algunas funciones matemticas y funciones para trabajar con nmeros aleatorios

FUNCIONES MATEMTICAS de la biblioteca estndar


Algunas de las funciones matemticas definidas en math.h son: EJEMPLOS z=sqrt(4);

double sqrt (double x) : calcula y devuelve la raiz cuadrada de x double pow (double x, double y) : calcula y devuelve x y

(z vale 2)

cout<<pow(3,2); (imprime 9)

double floor(double x) : devuelve el entero ms prximo a x redondeando por defecto cout<<floor(9.2); (imprime 9) double ceil (double x) : devuelve el entero ms prximo a x redondeando por exceso cout<<ceil (9.2); (imprime 10) double fabs(double x): devuelve el valor absoluto de x double log10(double x): devuelve el logaritmo en base 10 de x cout<<fabs(-3); (imprime 3)

cout<<log10(100); (imprime 2)

FUNCIONES PARA GENERACIN DE NMEROS ALEATORIOS


Los lenguajes de programacin utilizan el reloj interno del ordenador para generar nmeros aleatorios mediante el uso de determinadas funciones incluidas en stdlib.h

int rand (void) : genera un nmero entero aleatorio en el rango [0, RAND_MAX], estando RAND_MAX definido
en stdlib.h con valor 32,767 (el valor mximo posible para un entero de 2 bytes) EJEMPLOS n=rand(); n=rand()%10; en n se almacena un nmero aleatorio entre 0 y RAND_MAX en n se almacena un nmero aleatorio en el rango [0,9]

Cual sera la instruccin para que en n se almacenara un nmero aleatorio en el rango [1,10]?

int random (int num): genera y devuelve un nmero aleatorio entre 0 y num-1
EJEMPLO cout<<random(10); imprimir un nmero aleatorio comprendido entre 0 y 9

Cual sera la instruccin para imprimir un nmero aleatorio en el rango [1,10]? 4

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

EJEMPLO: Programa para imprimir en pantalla 5 nmeros aleatorios entre 0 y 99. #include<iostream.h> #include<stdlib.h> void main(){ int i; for (i=1; i<=5;i++) cout<< random(100); } Ejecuta sucesivas veces este programa y observa la secuencia de nmeros que genera. Se genera siempre la misma secuencia de numros? Las funciones rand() y random() siempre dan como resultado la misma secuencia de nmeros aleatorios en sucesivas ejecuciones del programa, ya que parten del mismo valor para generarlos (si no se especifica lo contrario), llamado semilla. Para evitar esto se debe hacer uso de la funcin randomize() al comienzo del programa, que cambia el valor de la semilla, y por tanto implicar que no se genere la misma secuencia de nmeros aleatorios en sucesivas ejecuciones del mismo programa..

Funcin randomize():
void randomize(void): modifica el valor de la semilla a partir de la cual se generan los nmeros aleatorios, as, se podrn generar secuencias de nmeros aleatorios distintos en sucesivas ejecuciones del programa. Utiliza la funcin time() por lo que se ha de incluir en el programa time.h, adems de stdlib.h EJEMPLO: Programa para imprimir en pantalla 5 nmeros aleatorios entre 0 y 99. #include<iostream.h> #include<stdlib.h> #include<time.h> void main(){ randomize(); //se incluye al comienzo del programa para evitar secuencias repetidas de nmeros int i; for (i=1; i<=5;i++) cout<< random(100); }

3.

FUNCIONES DEL PROGRAMADOR EN C /C++

El uso de una funcin construida por el programador lleva asociadas 3 acciones: - Definicin de la funcin indica la tarea que realiza la funcin - Declaracin de la funcin o Prototipo indica cmo usar la funcin (valor devuelto y parmetros) - Llamada de la funcin indica como invocar a la funcin para que se ejecute

3.1. Definicin y estructura de una FuncinLa definicin de una funcin consiste en expresar mediante instrucciones la tarea que realiza sta. La definicin de una funcin: se hace fuera de la funcin principal main(): antes o despus de la funcin main() o en otro fichero aparte. se ajusta a la siguiente estructura: TipoRetorno. Es el tipo de dato del valor que TipoRetorno Nb-funcin (Parmetros formales) devuelve la funcin : -Ser uno de los tipos bsicos (int, char, float, { double, etc), un puntero o un struct. Cuerpo de la funcin -Si se omite, C/C++ supone que devuelve un int Retorno -Si no devuelve valor se pone void como } TipoRetorno 5

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

Nb-funcin. Es el nombre de la funcin. Se construye siguiendo las reglas de creacin de los identificadores Parmetros formales. Es una lista de variables tipificadas y separadas por comas que permiten la comunicacin entre la funcin y el punto de llama, o bien void (o parntesis en blanco) si no se pasan parmetros. Estas variables o parmetros formales pueden ser de los tipos: o parmetros por valor o copia (Parmetros de Entrada): son parmetros que solo proporcionan valores a la funcin. La funcin no puede modificar su valor, ya que lo que recibe es una copia del valor del parmetro. parmetros por referencia o direccin (Parmetros de Salida o de Entrada/Salida): son parmetros cuyo valor puede ser modificado por la funcin. En este caso lo que se pasa a la funcin es la direccin de la variable parmetro, de manera que la funcin puede operar con los valores iniciales de esas direcciones de memoria y depositar en ellas nuevos resultados (parmetro de Entrada/Salida), o bien, solo depositar un resultado obtenido por la funcin (parmetro de Salida). Se utiliza tambin el paso por referencia para simular que la funcin devuelve ms de un valor.

Cuerpo de la funcin. Estar constituido por las declaraciones de variables, y por las instrucciones que realizan la tarea encomendada a la funcin Retorno. Mediante la sentencia return se indica el valor que devuelve la funcin, o simplemente que se retorne al punto de llamada. El formato es: return [(expresin)] ;

una funcin solo puede devolver un nico valor (para devolver varios valores , el TipoRetorno debe ser un puntero, o bien simularlo mediante el paso de parmetros por referencia) la sentencia return puede aparecer varias veces en la funcin, pero solo una de ellas se activar. si la funcin no devuelve ningn valor, habr casos en los que se puede omitir return. EJEMPLOS: CASO 1: Funcin que lee un nmero y calcula y muestra su cuadrado. No devuelve valor, ni se le pasan parmetros. void cuadrado1 ( ) //No hay parmetros { int n; cout<<"Introduce nmero: "; cin>>n; cout<<"El cuadrado es "<<n*n; return ; }

CASO 2: Funcin que recibe un nmero entero en parmetro n y calcula y devuelve el cuadrado de n. int cuadrado (int n) // -n- Parmetro de Entrada por Valor { return n*n; } CASO 3: Funcin que recibe la base y altura de un rectngulo en parmetros a y b y devuelve su rea int rectangulo (int b, int a) // -a- y b- Parmetros de Entrada Por Valor { return b*a; }

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

CASO 4: Funcin que recibe euros en parmetro n y devuelve las pesetas correspondientes float euros_pts ( float n) // -n- Parmetro de Entrada por Valor { float pesetas; pesetas= n*166.386; return pesetas; } CASO 5: Funcin que recibe un entero en parmetro n- y devuelve 0 si es impar y 1 si es par int par_impar (int n) // -n- Parmetro de Entrada por Valor { if (n%2 == 0) return 1; else return 0; } CASO 6: Funcin que recibe dos valores en los parmetros a- y b- e intercambia sus valores. Los parmetros a- y b- son parmetros de Entrada y Salida, parmetros por referencia en C++ (Observa la sintaxis en C++ (int&) para indicar este hecho) void cambio (int& a, int& b) // -a- y b- Parmetros de Entrada/Salida por Referencia { int aux; aux=a; a=b; b=aux; } CASO 7: Funcin que recibe euros en parmetro n- y lo transforma en pesetas. El parmetro n- es un parmetro de Entrada y Salida, parmetro por referencia en C++. (Observa la sintaxis en C++ (float&) para indicar este hecho) void euros_pts_2 ( float& n) // -n- Parmetro de Entrada/Salida por Referencia { n= n*166.386; } CASO 8: Funcin que recibe euros en parmetro n- y lo transforma en pesetas. El parmetro n- es un parmetro de Entrada y Salida, parmetro por Direccin en C/C++. (Observa la sintaxis en C/C++ ( float * para indicar este hecho) void euros_pts_3 ( float * n) // -n- Parmetro de Entrada/Salida por Direccin { *n= *n*166.386; } Comenzaremos viendo el paso de parmetros de Entrada, (implementados en C y C++ como parmetros por VALOR), y despus el paso de parmetros de Entrada/Salida (implementados en C y C++ como parmetros por DIRECCIN, y en C++ tambin como parmetros por REFERENCIA).

3.2

Declaracin de una Funcin (Prototipo de la funcin)


Para poder utilizar una funcin, sta debe ser conocida. Para ello se sigue alguno de los mtodos siguientes: - hacer su definicin antes de utilizarla (se define antes de main()) - declarar la funcin antes de su uso, si su definicin ser posterior (se define despus de main() y se declara antes de main())

La forma usual en C y C++ es declarar las funciones antes de main(), esto es, poner sus prototipos; y definirlas despus de main(). 7

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

El prototipo de una funcin, le indica al compilador el nombre de la funcin, el tipo devuelto, el nmero, tipo y orden de los parmetros que espera recibir la funcin. El compilador utiliza los prototipos de las funciones para validar las llamadas a la funcin. As pues, el prototipo de una funcin es la declaracin de la funcin. En el prototipo o declaracin de la funcin se indica el tipo de retorno, el nombre de la funcin y los parmetros formales en el mismo orden que en la definicin. Se finaliza en punto y coma. (Realmente es el encabezado de la definicin finalizado en punto y coma, y en el que se pueden omitir los nombres de los parmetros) TipoRetorno Nb-funcin (Parmetros Formales) ;

- Si la funcin no utiliza parmetros se especifica void o se dejan parntesis en blanco - Se pueden omitir los nombres de los parmetros formales EJEMPLOS: Los prototipos de las funciones definidas en el ejemplo anterior y que iran antes de main() seran: CASO 1: void cuadrado1 (void); CASO 2: int cuadrado (int ); CASO 3: int rectangulo (int , int ); CASO 4: float euros_pts (float ); CASO 5: int par_impar (int n); CASO 6: void cambio (int& a, int& b) CASO 7: void euros_pts_2 ( float& n) ; CASO 8: void euros_pts_2 ( float *);

Observad que el prototipo coincide con el encabezado de la funcin y que finaliza en punto y coma. En el prototipo se pueden omitir los nombres de los parmetros.

3.3

Llamada a una Funcin

La llamada es la forma en que se invoca a una funcin. La llamada a la funcin, supone la ejecucin de su cdigo y terminado el proceso que debe realizar la funcin llamada se devuelve el control a la funcin desde la que se realiz la llamada (funcin llamadora o llamante). La llamada a una funcin puede aparecer como una instruccin aislada (caso de funciones void que no devuelven ningn valor en su nombre) o formando parte de una asignacin, expresin o salida de datos, entre otros (caso de funciones que devuelven un valor asociado a su nombre ). El formato de llamada es: Nb-funcin (Parmetros Actuales.); Nb-funcin. Es el nombre que se ha dado a la funcin al definirla (el de su definicin y prototipo) Parmetros actuales: son los valores con los que se quiere invocar a la funcin. Consisten en una lista de constantes, variables y expresiones separadas por comas y que se corresponden con los parmetros formales (los de la definicin de la funcin). Si no se pasan parmetros los parntesis se dejan en blanco.

La invocacin o llamada a una funcin implica los siguientes pasos: 1. Cada parmetro formal se sustituye por el correspondiente parmetro actual, esta sustitucin puede suponer el paso de un valor (parmetros de Entrada parmetros por valor o copia) o el paso de una direccin (parmetros de Salida o E/S- parmetros por direccin o referencia) 2. Se ejecuta el cuerpo de instrucciones de la funcin hasta encontrar un return o hasta el final de la misma 3. Se retorna al punto de llamada devolviendo o no un valor

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

Veamos EJEMPLOS completos para algunas de las funciones anteriores:


EJEM_1: Programa que pide un nmero y calcula y muestra su cuadrado
#include<iostream.h> void cuadrado1 (void); //PROTOTIPO o declaracin de la funcin cuadrado1() int main() { cuadrado1 (); //LLAMADA a la funcin cuadrado1() return 0; } /************************************************************************************/ //Funcin que no devuelve ni intercambia parmetros. Es un procedimiento que lee un nmero y calcula y muestra su cuadrado. void cuadrado1 ( ) { int n; cout<<"Introduce nmero: "; cin>>n; cout<<"El cuadrado es "<<n*n; return ; } //DEFINICIN de la funcin cuadrado1 ()

EJEM_2: Programa que pide 3 nmeros y calcula y muestra sus cuadrados


#include<iostream.h> int cuadrado(int); //PROTOTIPO de la funcin cuadrado() int main() { int n1,n2, n3; cout<<"Introduce 3 nmeros: "; cin>>n1>>n2>>n3; cout<<"Cuadrados : "<<cuadrado(n1)<<cuadrado(n2)<<cuadrado(n3); //LLAMADA a cuadrado() return 0; } /**********************************************************/ //Funcin que recibe en n- un nmero y calcula y devuelve su cuadrado. int cuadrado (int n) { return n*n; } //DEFINICIN de la funcin cuadrado()

EJEM_3: Leer una cantidad en euros y decir cuantas pesetas son


float euros_pts (float); //PROTOTIPO de la funcin euros_pts() int main() { float dinero; cout<<"Introduce cantidad de euros: "; cin>>dinero; cout<<"Cambio a Pesetas : "<<euros_pts(dinero); //LLAMADA return 0; } /************************************************************************************************/ //Funcin que recibe en n- un valor en euros y devuelve su equivalente en pesetas.. float euros_pts ( float n) { float pesetas; pesetas= n*166.386; return pesetas; } //DEFINICIN

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

EJEM_4: Leer una cantidad en euros y decir cuantas pesetas son


void euros_pts_2 (float&); //PROTOTIPO de la funcin euros_pts_2() int main() { float dinero; cout<<"Introduce cantidad de euros: "; cin>>dinero; euros_pts(dinero); cout<<"Cambio a pesetas : "<<dinero; //LLAMADA return 0; } /***********************************************************************/ //Funcin que recibe en n- euros y deja en ese mismo n- las pesetas equivalentes. void euros_pts ( float& n) { n= n*166.386; } //DEFINICIN

EJEM_5: Leer un nmero y decir si es par o impar


#include<iostream.h> int par_impar (int n); int main() { int numero; cout<<Da numero: ; cin>>numero; if ( par_impar (numero) == 1) cout<<Es par; else cout<<Es impar; return 0; } /****************************************************************************/ //Funcin que recibe en n- un nmero y devuelve: 1 si el valor es par y 0 si es impar. int par_impar (int n) { if (n%2 == 0) return 1; else return 0; }

Observaciones con respecto a las funciones.


1.-No se puede definir una funcin dentro de otra. Sera incorrecto int main(){ long cubo(long n){ .. } } 2.-Una funcin puede llamar a otra funcin, del compilador o del programador. float hipotenusa( float a, float b){ float hipo; hipo= sqrt( pow(a,2) + pow(b,2)) return hipo; } 10

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

4.

PASO DE PARMETROS A UNA FUNCIN

Los parmetros permiten la comunicacin entre la funcin y el punto de llamada. El paso de parmetros a una funcin C/C++ puede ser por VALOR o por REFERENCIA (DIRECCIN) Por valor o copia (Parmetros de Entrada), C/C++ Por referencia (Parmetros de Salida y Entrada/Salida), C++ Por direccin (Parmetros de Salida y Entrada/Salida), C/C++

4.1 Paso de parmetros por valor o copia


El paso de parmetros por valor a una funcin significa que: 1- El parmetro formal, recibe una copia del valor del parmetro actual correspondiente de la llamada. 2- Los parmetros actuales podrn ser constantes, expresiones, variables o funciones. Si el parmetro formal y actual correspondiente son de distinto tipo, se realiza implcitamente conversin al tipo del parmetro formal. 3- La funcin no puede modificar el valor del parmetro actual, es decir, aunque la funcin cambie el valor del parmetro formal (var. local a la funcin), el cambio solo afecta a la funcin y no tiene efecto fuera de ella Es el mtodo por defecto para pasar parmetros en C/C++, a menos que se pasen arrays, ya que los arrays se pasan siempre por direccin.

Sintaxis Prototipo. Llamada. Definicin. Tipo_Retorno Nb_funcin (Tipos_Parmetros_Formales); Nb_funcin (Parmetros Actuales); Tipo_Retorno Nb_funcion (Parmetros Formales)

EJEMPLO Funcin que calcula y devuelve el producto de tres valores que se le pasan como parmetros #include<....... ....... long fproducto (int, float, int); int main() { int var=1; ..... cout<<fproducto(var,1.5, 2.5*var); ...... } long fproducto (int x, float y, int z) { return (x*y*z); }
long fproducto (int, float, int); int main() { int var=1; ..... cout<<fproducto (var, 1.5, 2.5*var);

Prototipo.

Llamada.

Definicin.

1.5

2.5 x=1 y=1.5 z=2

...... }
long fproducto (int x, float y, int z) { return (x*y*z); }

Imrpime en pantalla el valor 3

11

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

4.2

Paso de parmetros por referencia

Cuando la funcin debe modificar el valor del parmetro pasado, de manera que ese valor modificado se transmita o transcienda (quede accesible) a la funcin llamadora, o bien simular que la funcin devuelve ms de un valor se ha de utilizar el mtodo de paso de parmetros por direccin o referencia. El paso de parmetros por referencia a una funcin significa que: 1- El compilador transforma el parmetro actual en su direccin de memoria y la hace corresponder con la direccin del correspondiente parmetro formal. Es como si a la misma direccin de memoria le diramos dos nombres diferentes, el del parmetro formal y el del parmetro actual. 2- Los parmetros actuales tienen que ser variables del mismo tipo que los parmetros correspondientes formales, ya que el compilador hace corresponder ambas direcciones (punteros), y en C/C++ se realiza verificacin de tipos en punteros, que significa que no se pueden asignar punteros de distinto tipo. 3- La funcin puede modificar el valor del parmetro actual, ya que, el cambio que la funcin realice en ese parmetro formal, queda almacenado en la misma direccin de memoria, por lo cual, la modificacin realizada sobre el parmetro trasciende o se trasmite al punto de llamada o funcin llamadora. Para declarar una variable parmetro por referencia se ha de utilizar el operador de direccin & siguiendo el formato: Tipo& Nb_Parmetro_ Formal Por ejemplo alias). Por otra parte, el operador & memoria de la variable v1. proporciona la direccin de una variable. As &v1 es la direccin en int& x; significa que x es una variable de tipo referencia.

Una referencia permitir acceder a una misma variable por medio de dos nombres diferentes (es como un

El paso de parmetros por referencia solo es vlido en C++. Pero C++ tambin permite utilizar punteros para implementar parmetros por referencia. El mtodo con punteros es el utilizado en C, y se conserva en C++, precisamente por cuestiones de compatibilidad. EJEMPLO ........ void cambio (int&, int&); int main() { int v1=10,v2=20; ..... cambio (v1, v2); cout<<v1<<v2; ...... } void cambio (int& x, int& y) { int aux; aux=x; x=y; y=aux; } void cambio (int&, int&);
int main() { int v1=10, v2=20; ............. cambio(v1,v2); cout<<v1<<v2; .............. }

Prototipo.

Llamada.

Definicin

El compilador transforma los parmetros v1 y v2 en sus direcciones &v1 y &v2 &v1 &v2 x=10, y=20

Imprime en pantalla 20 10, en ese orden

void cambio (int& x, int& y) { int aux; aux=x; x=y; y=aux; }

x=20, y=10

12

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

4.3

Paso de parmetros por direccin

Este mtodo utiliza punteros para implementar parmetros por referencia. (Un puntero es una variable que contiene una direccin de memoria. Para declarar una variable de tipo puntero se utiliza el operador *. ) En este mtodo los parmetros formales se declaran como punteros (operador *), y los parmetros actuales se expresarn como referencias o direcciones (operador &) de variables del mismo tipo que el correspondiente parmetro formal. En la llamada a la funcin se indica explcitamente que se estn pasando las direcciones de las variables que actan como parmetros actuales (uso del operador &) y en la definicin y prototipo de la funcin se indica que los parmetros formales son de tipo puntero (direcciones--tipo*) El paso de parmetros por direccin a una funcin significa que: 123El compilador pasa la direccin de memoria del parmetro actual a la funcin, es decir, el parmetro formal recibe la direccin de memoria del parmetro actual correspondiente de la llamada, y accede a las posiciones apuntadas. Los parmetros actuales sern direcciones de variables, del mismo tipo que los parmetros formales correspondientes (verificacin de tipos en punteros). La funcin puede modificar el valor del parmetro actual, ya que, el cambio que la funcin realice en ese parmetro formal, queda almacenado en la misma direccin de memoria, por lo cual, la modificacin realizada sobre el parmetro trasciende al punto de llamada o funcin llamadora. El operador * - permite declarar una variable de tipo puntero. As int *p; significa que p es un puntero a entero int, es decir, lo que puede almacenar es una direccin a un int (apuntar a una variable int). - proporciona tambin el contenido de la memoria apuntada por el puntero que le sigue. As *p es el contenido de la/las posiciones de memoria apuntadas por el puntero p. El operador & proporciona la direccin de una variable. As &z es la direccin en memoria de la variable int z. EJEMPLO int *p, z=8; p=&z; *p= 11; // declara a p como puntero a int, y a z como variable int con valor 8 // a p se le asigna la direccin de z (p apunta a z) // a las posiciones de memoria apuntadas por p se les asigna el valor 11

El paso de parmetros por direccin es el mtodo natural de implementar los parmetros de Salida o Entrada/Salida en C. Este mtodo se conserva en C++ por cuestiones de compatibilidad. EJEMPLO ........ void cambio (int*, int*); int main() { int v1=10,v2=20; ..... cambio (&v1,&v2); cout<<v1<<v2; ...... } void cambio (int * x, int * y) { int aux; aux=*x; *x=*y; *y=aux; } void cambio (int*, int*); int main() { int v1=10, v2=20; ............. cambio(&v1,&v2); cout<<v1<<v2; .............. } Imprime en pantalla 20 10, en ese orden

Prototipo.

Llamada.

Definicin

&v1

&v2

void cambio (int *x, int *y) { int aux; aux=*x; *x=*y; *y=aux; }

x=&v1 y=&v2 13

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

5.

MBITO DE LAS VARIABLES: VARIABLES LOCALES Y GLOBALES

El mbito o alcance de una variable es la zona de un programa en la que la variable es visible o conocida, y por lo tanto accesible.. El mbito de una variable: 1- Indica : Su visibilidad : zona del programa dnde la variable es conocida y accesible. Tiempo de vida : tiempo que existe la variable (desde que se crea hasta que se destruye). 2- Depende de: El lugar de declaracin de la variable. La accesibilidad y existencia de una variable puede alterarse mediante el uso de modificadores en su declaracin (modificadores static, auto, register, extern)

5.1 Variables locales y variables globales


En C/C++, cada funcin es un bloque de cdigo independiente. El cdigo de una funcin es propio de esa funcin , y no se puede acceder a l mediante ninguna sentencia de ninguna otra funcin, salvo a travs de una llamada a esa funcin. Es decir, el cuerpo de una funcin queda oculto para el resto del programa, y a no ser que se utilicen variables globales, no puede afectar ni ser afectado por otras partes del programa . Variables Locales 1. Se declaran dentro de una funcin o bloque de cdigo (instruccin compuesta). 2. Existen en memoria, solo mientras se ejecuta el segmento de cdigo (funcin o bloque) dnde han sido declaradas . 3. Tienen un mbito restringido, es decir, solo son visibles en el bloque de cdigo o funcin dnde han sido declaradas 4. Pueden existir varias variables locales con igual nombre en el mismo programa 5. Facilitan la depuracin y reutilizacin de funciones 6. No son inicializadas por defecto en declaracin Variables Globales 1. Se declaran fuera de cualquier funcin o bloque, antes de la funcin main(). 2. Existen en memoria durante todo el tiempo que se est ejecutando el programa 3. Tienen mbito de programa, es decir, son y pueden ser utilizadas por cualquier segmento de cdigo o funcin del programa 4. Pueden existir variables locales y globales con igual nombre en el mismo programa, en este caso, prevalece la variable local sobre la global 5. Dificultan la depuracin y reutilizacin de funciones 6. Son inicializadas por defecto en su declaracin, a 0 las variables numricas y a \0 las tipo carcter. El uso de varibles globales produce lo que se denomina Efectos Laterales. Se produce un Efecto Lateral en los siguientes casos: 1) Cuando una funcin se comunica con otra mediante variables globales (la variable global puede ser modificada por cualquier funcin del programa), y 2) Cuando coexisten en el mismo programa variables locales y globales con igual nombre (prevalece la local sobre la global) EJEMPLO void f1(); int b, a=1; int main() { float c=5.5,d; cout<<a<<b<<c; f1(); cout<<a<<b<<c; return 0; } void f1() { int b=1 , c, e; a= a+10; b++; c=a+b; e=a*b; }

// variables globales: b y a

// variables locales a main(): c y d

// variables locales a f1(): b, c y e

14

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

5.2

Clases de almacenamiento

Los modificadores o especificadores de clases de almacenamiento ( auto, static, extern, register) permiten cambiar el mbito de una variable. Se utilizan para indicar al compilador la forma en que debe ser almacenada la variable que va detrs en el momento de su declaracin. Variables automticas (auto). Es la forma de almacenamiento por defecto de una variable declarada dentro de una funcin o bloque. Ocupan memoria mientras est en ejecucin el segmento de cdigo dnde se declararon. Las variables locales son auto por defecto. auto int numero; es igual que int numero; Variables estticas (static). Una variable static, solamente es visible dentro del bloque donde est declarada; pero a diferencia de las automticas su existencia es permanente. Las variables stticas no se borran (no se pierde su valor) cuando la funcin termina , y en consecuencia, retienen sus valores entre llamadas a la funcin. Se utilizan normalmente para mantener valores entre llamadas sucesivas a una misma funcin.. Una variable static se inicializa solo una vez, cuando comienza la ejecucin del programa, y no es reiniciada cada vez que se ejecuta el bloque que la contiene, sino que la siguiente ejecucin del bloque comienza con el valor que tena la variable cuando finaliz la ejecucin anterior. Si la variable no es inicializada explcitamente, se inicializa automticamente a cero. static float suma;
EJEMPLO #include<iostream.h> int serie (void); int main() { int i; // es como auto int i; for(i=0;i<10;i++) cout<<serie()<<" "; return 0; } int serie() { static int num; //se inicializa por defecto a 0; solo se inicializa la primera vez num=num+2; return num; }

Variables registro (register). Una variable declarada como register, sugiere al compilador que utilice para su almacenamiento un registro de la CPU; solo es una sugerencia, ya que si no hay registros disponibles el compilador lo ignora y la considera auto. Solo es aplicable a variables locales. Una aplicacin tpica de estas variables es como variable de control de un bucle. register int k;
EJEMPLO #include<iostream.h> int main() { register int k; for(k=1;k<=10000;k++) cout<< * ; return 0; }

Variables externas (extern). Se utilizan normalmente cuando el programa est formado por ms de un archivo fuente, y una funcin necesita utilizar el valor de una variable declarada en otro archivo. Una variable declarada como extern (externa), indica al compilador que la variable existe en otra parte del programa, y es a ella a la que nos referimos. extern float a;
// MODULO SEGUNDO.CPP // y muestra un saludo indicando la edad #include<iostream.h> #include<conio.h> void mensaje() { extern int e; char nombre[50]; cout<<"Introduce tu nombre: "; cin>>nombre; gotoxy(10,16);cout<<"Hola "<<nombre<<" tu edad es "<<e; }

//MODULO PRINCIPAL.CPP #include<iostream.h> #include<conio.h> #include "segundo.cpp" int e; int main() { cout<<"Da edad: "; cin>>e; mensaje(); getch(); return 0; }

15

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

6. TRATAMIENTO AVANZADO DE FUNCIONES


6.1 Sobrecarga de funciones
El lenguaje C++ permite definir dos funciones que tengan el mismo nombre, pero dispongan de diferentes listas de argumentos. Ello es posible porque las declaraciones de las funciones (los prototipos) donde se incluyen la lista de los tipos de los argumentos deben ser distintas. Por ejemplo, se pueden hacer las siguientes declaraciones: float potencia (float, int); float potencia (float, float); La primera funcin podr calcular potencias con exponentes enteros, mientras que la segunda calculara potencias con exponentes reales. As pues, una llamada a funcin como potencia(2.5, 2) utilizara la primera funcin, mientras que la llamada potencia(4.0, 2.5) llamar a la segunda.

EJEMPLO Realizar dos funciones suma, la primera suma dos enteros y la segunda suma tres enteros. #include <iostream.h> int suma(int, int); int suma(int, int, int); int main() { cout<<suma(2,3,4)<<endl; cout<<suma(2,3); return 0; } int suma(int n1, int n2, int n3) // suma tres nmeros enteros { return n1+n2+n3; } int suma(int n1, int n2) // suma dos nmeros enteros { return n1+n2; }

6.2 Recursividad
Existe recursividad en algoritmos cuando un algoritmo se llama a s mismo. Se puede decir que la recursividad es la definicin de un objeto, de forma que lo que se define est incluido en la definicin. La recursividad requiere dos condiciones para su correcto funcionamiento: 1. 2. Las sucesivas llamadas deben ser efectuadas con versiones cada vez ms reducidas del problema inicial. Debe existir una condicin de fin de las llamadas o fin de la recursividad. Sin esta condicin de terminacin, el algoritmo no podra construirse siguiendo esta tcnica y su ejecucin producira un bucle infinito.

En C/C++ la definicin de una funcin consiste en dar la lista de las instrucciones que la componen. Si alguna de esas instrucciones es una llamada a la propia funcin que se esta definiendo, tenemos una funcin recursiva. EJEMPLO Calcular el factorial de un nmero mediante una funcin recursiva. n! = n*(n-1)*(n-2)*....*2*1 De forma recursiva: n! = n * (n-1)! 0! = 1

16

U.T.4. Programacin Modular. Funciones en C.

Fundamentos de Programacin Administracin de Sistemas Informticos

La definicin de la funcin es la siguiente: unsigned long factorial (unsigned long n) { if (n<=1) return 1; // salida de la recursividad else return n*factorial (n-1); } Si analizamos detalladamente la definicin de la funcin: si n es <=1, el factorial es 1 (condicin de fin de la recursividad) y, si no, el factorial de ese nmero es igual al nmero multiplicado por el factorial del nmero menos uno (condicin de llamadas sucesivas con una versin ms reducida). Por ejemplo, para calcular el factorial de 3 la funcin decide que fact = 3 * factorial (2) como hay una llamada a una funcin, se para la ejecucin hasta que se sepa cul es el valor de factorial (2). Para calcularlo, se llama a la funcin factorial con n = 2. Para calcular factorial (2) tenemos que: fact = 2 * factorial (1) lo que lleva a llamar otra vez a la funcin factorial, pero ahora con n = 1 (factorial(1)). Para factorial (1), tenemos que fact = 1, con lo cual termina la ejecucin de esta funcin y se devuelve a factorial (1) como resultado el valor 1. En factorial (2) tenemos que fact = 2*1 = 2. Este resultado se devuelve a la funcin factorial (3). Ahora tenemos en factorial (3) que fact = 3*2 = 6, con lo que terminamos la funcin dando como resultado un 6. Hemos llamado a la funcin factorial 3 veces. Graficamente, tenemos: factorial (3) 6 3 * factorial (2) 2 2* factorial (1) 1 1 // llamada recursiva

17

S-ar putea să vă placă și