<< Fijate si es cinco >> |
Dificultad: Los detalles de programación son medio técnicos y sería bueno leer antes las lección anteriores. Lecciones relacionadas: |
|
Resumen: Hay dos formas de pasar las variables a una función, por valor o por referencia. Acá vemos un ejemplo sencillo, en el que la función solamente nos dice si la variable vale 5 o no. Introducción: En la mayoría de los lenguajes hay dos formas de pasar las variables a una función, por valor o por referencia. La explicación detallada junto con más ejemplos la pueden encontrar en esta página. Vamos a ver el mismo ejemplo en cada lenguaje (QB, Pascal y C/C++). En cada caso se definen dos funciones que se fijan si una variable vale cinco o no y después modifican su valor al azar. La verdad que esta función en particular no es muy interesante. Pero en la vida real es conveniente utilizar funciones parecidas como FijateSiEsPrimo o FijateSiTodasLasCifrasSonIguales FijateSiEsMultiploDe5, etcétera. Muchas veces es buena idea tener una función especial que diga si un número tiene cierta propiedad o no. En este caso, como es un ejemplo, se modifica el valor de la variable a propósito. En general uno no escribe una barbaridad como esta, pero a veces aparecen funciones o subrutinas que sin querer modifican el valor de las entradas. Un ejemplo son algunas de las funciones que calculan el DCM. Si uno nota que el programa anda haciendo cosas muy extrañas y todo parece estar bien, es un buen lugar para revisar (sobre todo en QB). Los programas: El programa primero llama a la función FijateSiEs5 que recibe los parámetros por valor unas 9 veces, con valores entre 1 y 9. Así que en la pantalla aparecen varios carteles, pero remarca el caso en que A es 5. Adentro de la función se sobreescribe el valor del parámetro con un numero al azar entre 0 y 9, pero no importa, porque lo que en realidad se sobreescribe es solamente la copia del valor que recibió la función. Después utiliza la función FijateSiEs5 que recibe los parámetros por referencia otras 9 veces, idealmente con valores entre 1 y 9. Y vuelve a mostrar cartelitos simpáticos. En esta funcion también se sobreescriben los valores del parámetro, pero en este caso se cambia el valor de la variable del programa original. Así que en vez de ir de 1 a 9, ¡va haciendo cualquier cosa! Como los cambios son al azar, conviene que lo ejecuten varias veces para ver que pasa. Cada vez utiliza una serie diferente de números al aleatorios y los resultados son distintos. QB: Nota: Como en QB no se pueden pasar parámetros por valor, lo simulamos usando una variable temporal CopiaX. Defint A-Z Randomize Timer Print "---por valor---" For a=1 To 9 If FijateSiEsCincoVal(a)=-1 Then Print "A=5!!!!" Else Print "(A=";a;")" EndIf Next a Print "---por referencia--" For a=1 To 9 If FijateSiEsCincoRef(a)=-1 Then Print "A=5!!!!" Else Print "(A=";a;")" EndIf Next a Print "---fin---" End Defint A-Z Function FijateSiEsCincoVal(x) 'En QB no se pueden pasar Por Valor 'asi que hacemos una copia CopiaX=x If CopiaX=5 Then Resultado=-1 Else Resultado=0 Endif CopiaX=Int(rnd*10) FijateSiEsCincoVal=Resultado End Function Defint A-Z Function FijateSiEsCincoRef(x) If x=5 Then Resultado=-1 Else Resultado=0 Endif x=Int(Rnd*10) FijateSiEsCincoRef=Resultado End Function Var a:Integer; Function FijateSiEsCincoVal(x:Integer):Boolean; Var Resultado:Boolean; Begin If x=5 Then Resultado:=True Else Resultado:=False; x:=Random(10); FijateSiEsCincoVal:=Resultado; End; Function FijateSiEsCincoRef(var x:Integer):Boolean; Var Resultado:Boolean; Begin If x=5 Then Resultado:=True Else Resultado:=False; x:=Random(10); FijateSiEsCincoRef:=Resultado; End; Begin Randomize;{Inicializa los valores al azar} Writeln('---por valor---'); For a:=1 To 9 Do If FijateSiEsCincoVal(a)=True Then Writeln('A=5!!!!') Else Writeln('(A=',a,')'); Writeln('---por referencia--'); For a:=1 To 9 Do If FijateSiEsCincoRef(a)=True Then Writeln('A=5!!!!') Else Writeln('(A=',a,')'); Writeln('---fin---'); End. #include <stdlib.h> // para usar random #include <iostreams.h> // para usar cout int FijateSiEsCincoVal(int x) { int Resultado; if (x==5) Resultado=1; else Resultado=0; x=random(10); return Resultado; }; int FijateSiEsCincoRef(int &x) { int Resultado; if (x==5) Resultado=1; else Resultado=0; x=random(10); return Resultado; }; int main(void) { int a; randomize(); cout<<"---por valor---"<<"\n"; for (a=1;a<=9;a++) if (FijateSiEsCincoVal(a)==1) cout<<"A=5!!!!"<<"\n"; else cout<<"(A="<<a<<")"<<"\n"; cout<<"---por referencia--"<<"\n"; for (a=1;a<=9;a++) if (FijateSiEsCincoRef(a)==1) cout<<"A=5!!!!"<<"\n"; else cout<<"(A="<<a<<")"<<"\n"; cout<<"'---fin---"<<"\n"; } Lecciones relacionadas: Parámetros por valor o por referencia |
OmaNet Curso CyM98 | OmaNet - Educación Interactiva www.oma.org.ar/omanet | omanet@oma.org.ar |
mensajes: webmaster@oma.org.ar |