Paso de Parámetros a una Función

Anuncio
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
Descargar