CyM98

<< Fijate si es cinco >>

Dificultad: Computación Computación

Los detalles de programación son medio técnicos y sería bueno leer antes las lección anteriores.

Lecciones relacionadas:

Parámetros por valor o por referencia Comp. Comp.

   
Google
Web www.oma.org.ar

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

Pascal:

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.

C/C++:

#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 Comp. Comp.

Divisor común mayor factorizando Comp. Mate. Mate.

Algoritmo de Euclides Comp. Comp. Mate. Mate.

 


Comentarios, preguntas, sugerencias:

Más información sobre números al azar.

Nombre y apellido (opcional):

E-mail (opcional):

    


OmaNet   Curso CyM98 OmaNet - Educación Interactiva
   
www.oma.org.ar/omanet | omanet@oma.org.ar
mensajes: webmaster@oma.org.ar
duty free alcohol duty free cigarette brands duty free cuban cigars duty free cosmetics online duty free fragrances buy duty free tobacco uk