Está en la página 1de 25

Paso de Parmetros

a una Funcin
Material Original: Prof. Flor Narciso
Modificaciones: Prof. Andrs Arcia
Departamento de Computacin
Escuela de Ingeniera de Sistemas
Facultad de Ingeniera
Universidad de Los Andes

27/05/05

Programacin Digital I

Recuerde
Los PARAMETROS FORMALES son prcticamente
VARIABLES LOCALES. La nica diferencia es que son
declarados en la definicin (cabecera) de una funcin.
Segn la sintaxis vista: lista_parmetros_formales.
Al igual que las variables locales, cuando se pasa un
valor desde la lnea de invocacin a una funcin, se crea
una variable temporal dentro de la funcin invocada. Una
vez que termina la ejecucin de la funcin invocada y se
retorna a la lnea inmediata siguiente, donde las variables
locales dejan de existir.
27/05/05

Programacin Digital I

Paso de parmetros
Paso de parmetros:
Por Valor
Por Referencia

Por Valor: Los parmetros formales correspondientes

reciben una COPIA de los valores (literales, constantes,


variables, resultado de la evaluacin de una expresin)
de los parmetros actuales; por tanto, los cambios que
se produzcan en ellos por efecto de la ejecucin de la
funcin no podrn afectar el valor de los parmetros
actuales en caso de que estos fueran variables.
27/05/05

Programacin Digital I

Paso de parmetros 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

Programacin Digital I

Paso de parmetros por valor:


Ejemplo 2
void DibujarPuntos( int numPuntos ) {
int i;
// i de la funcin 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

Programacin Digital I

Paso de parmetros por valor:


Ejemplo 2
Salida del programa anterior:
. 3 1
.. 4 2
... 5 3
.... 6 4
..... 7 5

27/05/05

Programacin Digital I

Paso de parmetros 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

Programacin Digital I

Paso de parmetros por


referencia
Paso de parmetros:
Por valor
Por referencia

Por Referencia: Lo que se pasa a la funcin es la

direccin de memoria del parmetro actual, en


consecuencia debe ser una variable. As, una variable
pasada como parmetro actual es compartida; es decir,
puede ser accedida y modificada durante la ejecucin de
la funcin.

27/05/05

Programacin Digital I

Paso de parmetros por


referencia
Apuntador: Variable especial cuyo contenido es la direccin o
localizacin de memoria de otra variable.
Dir. Contenido
Variable Entera

2389

2
Apuntador

n-1
n
27/05/05

Programacin Digital I

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

Programacin Digital I

10

Operaciones con Apuntadores


Las siguientes son las operaciones bsicas
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

Programacin Digital I

11

Parmetros por valor vs.


Parmetros por referencia
El paso de parmetros por referencia permite devolver
varios valores desde un procedimiento a travs de los
parmetros actuales.
Si una funcin devuelve un solo valor usando la
sentencia return, es mejor que todos sus parmetros
sean por valor.
Las variables (parmetro actual) pasadas por valor a
una funcin no pueden ser cambiadas.
Las variables pasadas por referencia pueden ser
cambiadas dentro de la funcin.
27/05/05

Programacin Digital I

12

Paso de Parmetros por


referencia
Definicin de la funcin en C
void nombre (tipo_dato &parmetro_formal_1,
tipo_dato &parametro_formal_2,
...,
tipo_dato &parametro_formal_n)
{
// Cuerpo de la funcin
}

Llamada a la funcin:
nombre (parmetro_actual_1, parametro_actual_2, ,
parametro_actual_n);

27/05/05

Programacin Digital I

13

Paso de parmetros 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

Programacin Digital I

14

Paso de parmetros 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);
}

Programacin Digital I

15

Paso de parmetros por


referencia: Ejemplo 2
Corrida en fro
Nombre Va r. local
funcin
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
Despus de la
llamada a f1
Despus de la
llamada a f2

Programacin Digital I

16

Pase de parmetros 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

Programacin Digital I

17

Pase de parmetros por valor:


Ejemplo 1
Escribir una funcin que reciba los valores enteros de x y n >
0 como parmetros de entrada y devuelva el valor de xn como
salida.
entero funcin 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_funcin

CODIFICAR.

27/05/05

Programacin Digital I

18

Pase de parmetros por valor:


Ejemplo 2
Escribir un programa que tome un conjunto de pares de
nmeros 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

Programacin Digital I

19

Paso de parmetros por valor:


Ejemplo 3
Realizar una funcin en C++ que permita sumar el
nmero de elementos negativos de una lista de n
nmeros reales.
funcin 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 nmero real)
Leer (numero)
Si (numero < 0.0) entonces
resultado = resultado + numero
fin_si
fin_RP
5. fin_funcion
27/05/05

Programacin Digital I

20

Paso de parmetros: Ejemplo 3


Codificacin
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 nmero real \n);
scanf(%i,&numero);
if (numero < 0.0)
resultado += numero;
}
}

27/05/05

Programacin Digital I

21

Ejercicios
Escribir las funciones necesarias para leer cuatro
nmeros reales, calcular y escribir su producto, suma y
su media aritmtica.
Escribir una funcin que compruebe si un nmero dado
es correcto, en cuyo caso la funcin deber devolver el
valor q. En caso negativo, la funcin devolver el valor
-1. Considere los siguientes casos para decidir si un
nmero es o no correcto.

27/05/05

Programacin Digital I

22

Ejercicios
El nmero es correcto si se encuentra en el rango
definido por dos valores constantes MINIMO y
MAXIMO.
El nmero es correcto si es uno de tres valores
constantes VALOR1, VALOR2 o VALOR3.
El nmero 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 nmero 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

Programacin Digital I

23

Ejercicios
Escribir una funcin que tome un carcter como
parmetro de entrada y devuelva su tipo que podr ser
uno de los siguientes: (1) letra mayscula de la A a la
Z, (2) letra minscula de la a a la z, (3) dgito del 0 al
9.
Escribir una funcin que tome como parmetros de
entrada dos instantes de tiempo expresados en horas,
minutos y segundos e indique si el primero es anterior al
segundo.

27/05/05

Programacin Digital I

24

Ejercicios
Dada la longitud, ancho y profundidad (en pies) de una piscina, el
volumen se calcula segn la siguiente frmula:
volumen = longitud*ancho*profundidad
Dado que un pie cbico de agua es equivalente a 7.8 galones, la
capacidad de agua de la piscina viene dada por la frmula:
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 frmula:
Tiempo = capacidad/20/60

27/05/05

Programacin Digital I

25

También podría gustarte