Paso de Parámetros a una Función Material Original: Prof. Flor Narciso Modificaciones: Prof. Andrés Arcia Departamento de Computación Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de Los Andes 27/05/05 Programación Digital I 1 Recuerde • Los PARAMETROS FORMALES son prácticamente VARIABLES LOCALES. La única diferencia es que son declarados en la definición (cabecera) de una función. Según la sintaxis vista: lista_parámetros_formales. • Al igual que las variables locales, cuando se pasa un valor desde la línea de invocación a una función, se crea una variable temporal dentro de la función invocada. Una vez que termina la ejecución de la función invocada y se retorna a la línea inmediata siguiente, donde las variables locales dejan de existir. 27/05/05 Programación Digital I 2 Paso de parámetros Paso de parámetros: Por Valor Por Referencia Por Valor: Los parámetros formales correspondientes reciben una COPIA de los valores (literales, constantes, variables, resultado de la evaluación de una expresión) de los parámetros actuales; por tanto, los cambios que se produzcan en ellos por efecto de la ejecución de la función no podrán afectar el valor de los parámetros actuales en caso de que estos fueran variables. 27/05/05 Programación Digital I 3 Paso de parámetros por valor: Ejemplo 1 void DibujarPuntos( int numPuntos ) { 30 int i; for ( i = 1; i <= numPuntos; i++ ) printf("."); } void main() { DibujarPuntos( 30 ); } 27/05/05 Programación Digital I 4 Paso de parámetros por valor: Ejemplo 2 void DibujarPuntos( int numPuntos ) { int i; // i de la función DibujarPuntos for ( i = 1; i <= numPuntos; i++ ) Valor de i printf("."); numPuntos = numPuntos + 2; printf(“%i \n”,numPuntos); } int main() { int i; // i del programa principal for ( i = 1; i <= 5; i++ ) { DibujarPuntos( i ); printf(“%i \n”,i); } } 27/05/05 Programación Digital I 5 Paso de parámetros por valor: Ejemplo 2 Salida del programa anterior: . 3 1 .. 4 2 ... 5 3 .... 6 4 ..... 7 5 27/05/05 Programación Digital I 6 Paso de parámetros por valor: Ejemplo 3 #include <stdio.h> void modificar (int a) { a *= 3; printf(“desde la funcion %i\n”, a); } void modificar(int); void main() { int a = 2; printf(“antes de la llamada %i \n”,a); modificar(a); printf(“despues de la llamada %i \n”,a); } 27/05/05 Programación Digital I 7 Paso de parámetros por referencia Paso de parámetros: Por valor Por referencia Por Referencia: Lo que se pasa a la función es la dirección de memoria del parámetro actual, en consecuencia debe ser una variable. Así, una variable pasada como parámetro actual es compartida; es decir, puede ser accedida y modificada durante la ejecución de la función. 27/05/05 Programación Digital I 8 Paso de parámetros por referencia Apuntador: Variable especial cuyo contenido es la dirección o localización de memoria de otra variable. Dir. Contenido Variable Entera 1 2389 2 Apuntador 3 1 … n-1 n 27/05/05 Programación Digital I 9 Apuntadores En C los apuntadores tienen la siguiente sintaxis: tipo * nombre_apuntador; Ej: int * apuntador_entero; float * apuntador_flotante; char * ap_caracter; 27/05/05 Programación Digital I 10 Operaciones con Apuntadores Las siguientes son las operaciones básicas con apuntadores: int b = 6; int * p_b = &b; // OK int * p_c = p_b; // OK p_b = b; // NO! p_c = &p_b // NO! 27/05/05 Programación Digital I 11 Parámetros por valor vs. Parámetros por referencia El paso de parámetros por referencia permite devolver varios valores desde un procedimiento a través de los parámetros actuales. Si una función devuelve un solo valor usando la sentencia return, es mejor que todos sus parámetros sean por valor. Las variables (parámetro actual) pasadas por valor a una función no pueden ser cambiadas. Las variables pasadas por referencia pueden ser cambiadas dentro de la función. 27/05/05 Programación Digital I 12 Paso de Parámetros por referencia Definición de la función en C void nombre (tipo_dato &parámetro_formal_1, tipo_dato &parametro_formal_2, ..., tipo_dato &parametro_formal_n) { // Cuerpo de la función } Llamada a la función: nombre (parámetro_actual_1, parametro_actual_2, …, parametro_actual_n); 27/05/05 Programación Digital I 13 Paso de parámetros por referencia: Ejemplo 1 #include <stdio.h> void Cuadrado( int num, int &AptCuadrado ) { AptCuadrado = num * num; } void main( ) { int c =12; Cuadrado( 5, c); printf(”El cuadrado de 5 es %i \n",c ); } Por valor Por referencia 27/05/05 Programación Digital I 14 Paso de parámetros por referencia: Ejemplo 2 void f1 (int a, int b) { a = 0; b = 0; printf(“a = %i, b = %i dentro de f1“,a,b); } #include <stdio.h> // Prototipo de la funcion f1 void f1(int, int); // Prototipo de la funcion f2 void f2 (int &, int &); void main( ) { int u = 1, v = 3; printf(“u = %i v = %i antes de la llamada a f1“,u,v); f1(u, v); printf(“u = %i v = %i despues de la llamada a f1“,u,v); f2(u, v); printf(“u = %i v = %i despues de la llamada a f2“,u,v); } 27/05/05 void f2 (int &a, int &b) { a = 0; b = 0; printf(“a = %i, b = %i dentro de f1“,a,b); } Programación Digital I 15 Paso de parámetros por referencia: Ejemplo 2 Corrida en frío Nombre Va r. local función f1 a=0 27/05/05 Va r. local Comentarios b=0 Dentro de f1 f2 a=0 b=0 Dentro de f2 main u=1 v=3 u=1 v=3 u=0 v=0 Antes de la llamada a f1 Después de la llamada a f1 Después de la llamada a f2 Programación Digital I 16 Pase de parámetros por referencia: Ejemplo 3 #include <stdio.h> CuadradoPorReferencia(z); printf(“z = %i despues de la int cuadradoPorValor (int); void cuadradoPorReferencia (int&); llamada a cuadradoPorReferncia\n”,x); } void main () { int cuadradoPorValor (int a) { return a *= a; } int x = 2, z = 4; printf(“x = %i antes de la llamada a cuadradoPorValor”,x); void cuadradoPorReferencia (int &cRef) { cRef *= cRef; } printf(“valor devuelto por cuadradoPorValor: %i“, cuadradoPorValor(x)); printf(“x = %i despues de la llamada a cuadradoPorValor\n”,x); printf(“z = %i antes de la llamada a cuadradoPorReferencia”,x); 27/05/05 Programación Digital I 17 Pase de parámetros por valor: Ejemplo 1 Escribir una función que reciba los valores enteros de x y n > 0 como parámetros de entrada y devuelva el valor de xn como salida. entero función Potencia (entero x, entero n) 0. Inicio 1. pot = 1 2. Repita para (I = 1; I < n; I = I + 1) pot = pot * x fin_RP 3. devolver pot 4. fin_función CODIFICAR. 27/05/05 Programación Digital I 18 Pase de parámetros por valor: Ejemplo 2 Escribir un programa que tome un conjunto de pares de números enteros a y b, y calcule la potencia ab de cada par. El fin de entrada de datos viene dado por a = -1 y b = -1. 0. Inicio 1. Q = cierto 2. Repita mientras (Q = cierto) Escribir (“Introduzca los valores de a y b”) Leer (a, b) Si (a = -1 y b = -1) entonces Q = falso sino Si (b > 0) entonces resultado = Potencia (a, b) Escribir (“Resultado = “, resultado) sino Escribir(“Error: b debe ser > 0”) fin_si fin_si fin_RM 3. Fin CODIFICAR. 27/05/05 Programación Digital I 19 Paso de parámetros por valor: Ejemplo 3 Realizar una función en C++ que permita sumar el número de elementos negativos de una lista de n números reales. función Suma (real &resultado) 0. Inicio 1. Escribir (“Introduzca el valor de n”) 2. Leer (n) 3. resultado = 0 4. Repita para (j = 1; j < n; j = j + 1) Escribir (“Introduzca un número real”) Leer (numero) Si (numero < 0.0) entonces resultado = resultado + numero fin_si fin_RP 5. fin_funcion 27/05/05 Programación Digital I 20 Paso de parámetros: Ejemplo 3 Codificación void Suma (float &resultado) { int n, j; float numero, resultado = 0.0; printf(“Introduzca el valor de n\n”); scanf(“%i”,&n); for (j = 1; j <= n; j++) { printf(“Introduzca un número real \n”); scanf(“%i”,&numero); if (numero < 0.0) resultado += numero; } } 27/05/05 Programación Digital I 21 Ejercicios Escribir las funciones necesarias para leer cuatro números reales, calcular y escribir su producto, suma y su media aritmética. Escribir una función que compruebe si un número dado es correcto, en cuyo caso la función deberá devolver el valor q. En caso negativo, la función devolverá el valor -1. Considere los siguientes casos para decidir si un número es o no correcto. 27/05/05 Programación Digital I 22 Ejercicios El número es correcto si se encuentra en el rango definido por dos valores constantes MINIMO y MAXIMO. El número es correcto si es uno de tres valores constantes VALOR1, VALOR2 o VALOR3. El número es correcto si se encuentra en el rango definido por dos valores constantes MINIMO y MAXIMO, o bien es igual al valor constante VALOR1. El número es correcto si se encuentra en el rango definido por dos valores constantes MINIMO1 y MAXIMO1, o bien en el definido por los valores constantes MINIMO2 y MAXIMO2. 27/05/05 Programación Digital I 23 Ejercicios Escribir una función que tome un carácter como parámetro de entrada y devuelva su tipo que podrá ser uno de los siguientes: (1) letra mayúscula de la ‘A’ a la ‘Z’, (2) letra minúscula de la ‘a’ a la ‘z’, (3) dígito del ‘0’ al ‘9’. Escribir una función que tome como parámetros de entrada dos instantes de tiempo expresados en horas, minutos y segundos e indique si el primero es anterior al segundo. 27/05/05 Programación Digital I 24 Ejercicios Dada la longitud, ancho y profundidad (en pies) de una piscina, el volumen se calcula según la siguiente fórmula: volumen = longitud*ancho*profundidad Dado que un pie cúbico de agua es equivalente a 7.8 galones, la capacidad de agua de la piscina viene dada por la fórmula: capacidad = volumen * 7.8 Si la rata de flujo de agua en la piscina es de 20 galones por minuto, entonces el tiempo (en horas) que se requiere para llenar la piscina se calcula mediante la fórmula: Tiempo = capacidad/20/60 27/05/05 Programación Digital I 25