• Viernes 15 de Noviembre de 2024, 06:56

Autor Tema:  Función Que Regresé 2 Parametros  (Leído 2392 veces)

Panteon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Función Que Regresé 2 Parametros
« en: Sábado 16 de Octubre de 2004, 22:38 »
0
He estado investigando para ver como hacerle apra que una función regresé 2 párámetros y no he encontrado mucho...no si nisiquiera si se pueda.
Me gustaria que alguien me dijera si es posible y si es posible, como se hace (quiero regreesar un boolean y un integerm por si sirve de algo)

Gracias

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Función Que Regresé 2 Parametros
« Respuesta #1 en: Domingo 17 de Octubre de 2004, 01:45 »
0
Hay una manera de hacerlo usando una funcion que le pases parametors por referencia y no por valor así podes modificar la variable que pasaste por parametro.

La otra es usando los registros del procesador con las sentencisas ASM en el lenguaje esamblador.
El resultado de una funcion, el valor que devuelve, no es más que una simple asignacion del valor que devuelve al registro AX o mejor dicho EAX (en 32bit). Los registros de 16 bit que podes usar son BX,CX,DX y el más comun que es el AX.
en una aplicacion de Windows tendríasn que ser de EAX, EBX, ECX, EDX. Si de verdad te interesa más esta manera no tengo problema en postearla, no lo hago ahora porque estoy seguro que te interesa mas la promera.

Cada ves que le pasas un parametro a una funcio por ejemplo esta

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
function Cuadrado(x : integer) : integer;
begin
    Cuadrado := x * x;
end;
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

El valor de X nunca se modifica porque lo que ´lo que se pasa es el valor numerico de X (por ejemplo 5)


En cambio si los pasas por referencia......

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
procedure CuadradoCubo(x : integer; var y, z : integer);
{todos los parametros despues de var son por referencia}

begin
    y := x * x;
    z := y * x; {x * x * x}
end;

{como y,z se pasan por referencia..}

VAR
  a,b,c : integer;
  
BEGIN { proncipal}
   a := 5;
   CuadradoCubo(a, b, c); {b=25, c=125}
END.

{tambien podrias hacer una funcion ue te devuelva el cubo y a la vez
 te "devuelva" el cubo}

 
function Cubo(x : integer; var Cuadrado : integer) : integer;
begin
   Cuadrado := x * x;
   Cubo := Cuadrado * x;
end;
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Cualquier duda no dudes en preguntar.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Función Que Regresé 2 Parametros
« Respuesta #2 en: Domingo 17 de Octubre de 2004, 01:54 »
0
Citar
Me gustaria que alguien me dijera si es posible y si es posible, como se hace (quiero regreesar un boolean y un integerm por si sirve de algo)
No lo noté....

Esta funcion saca el cuedrado de un numero y devuelve true si es mayor a 100

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
function CuadradoT(x : integer; var cuadrado : integer) : boolean;
begin
    cuadrado := x * x;
    if cuadrado > 1000 then CuadradoT := true;
    else CuadradoT := false;
    
end;

VAR
  a,b : integer;
  MayorA_Cien : boolean;

BEGIN
  
  a := 5;
  MayorA_Cien := CuadradoT(a, b);  
  {MayorA_Cien CuadradoT(5, b);.. lo mismo}
  if MayorA_Cien then
      WriteLn('El cuadrado es mayor a cien');
 
END.
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Código: Text
  1.  
  2. if MayorA_Cien = true then...
  3. if MayorA_Cien then .... es lo mismo
  4.  
  5.  

Panteon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Función Que Regresé 2 Parametros
« Respuesta #3 en: Lunes 18 de Octubre de 2004, 01:46 »
0
Gracias por tu ayuda ya lo tengo un poco más claro...no se si me puedas ayudar con éste codigo... lo que necesito es que  el procedimiento "buscarcodigo" le mande las varaibles "found" y "pos" al procedimiento "borrar" abajo te mando el codigo para que lo veas....gracias de nuevo

Código: Text
  1. procedure buscarcodigo;
  2. var
  3.    found:boolean;
  4.    matricula2:byte;
  5.    pos:integer;
  6.  
  7. BEGIN
  8.      clrscr;
  9.      assign (datos, 'alumnos.txt');
  10.      reset(datos);
  11.      found:=false;
  12.      Writeln ('Dame el codigo del alumno a Buscar');
  13.      readln(matricula2);
  14.      seek (datos,0);
  15.           while not eof (datos) and not found do
  16.                begin
  17.                    read (datos,persona);
  18.                    if persona.matricula=matricula2  then
  19.                      found:=true;
  20.                      pos:=filepos(datos);
  21.                end;
  22.      if found and persona.sw=true then
  23.           begin
  24.                writeln (' ');
  25.                writeln ('Eston son los datos del alumno:');
  26.                writeln (' ');
  27.                writeln ('Matricula: ',persona.Matricula);
  28.                writeln ('Nombre: ',persona.nombre);
  29.                writeln ('Apellido P.: ',persona.apellidop);
  30.                writeln ('Apellido M.: ',persona.apellidom);
  31.                writeln ('Edad: ' ,persona.edad);
  32.                writeln ('Pais: ' ,persona.pais);
  33.                writeln ('Ciudad: ',persona.ciudad);
  34.                writeln ('Telefono Tutor: ', persona.telefono);
  35.                writeln ('Visa: ', persona.visa);
  36.           end
  37.      else
  38.          begin
  39.             textcolor(red);
  40.             writeln('Ese  alumno no est  ingresado');
  41.          end;
  42.          readln;
  43.    close(datos);
  44. END;
  45.  


Código: Text
  1.  
  2. procedure borrar;
  3. var
  4.    eliminar: string;
  5.    seleccion: char;
  6.    pos:integer;
  7.    found: boolean;
  8. BEGIN
  9.    clrscr;
  10.    assign (datos, 'alumnos.txt');
  11.    reset(datos);
  12. buscarcodigo {aqui manda a llamar el procedimiento)
  13. if found then
  14.      begin
  15.           writeln ('¨Seguro que desea eliminar este estudiante?');
  16.           readln(seleccion);
  17.               if seleccion='s' then
  18.               begin
  19.                  persona.sw:=false;
  20.                  seek (datos, pos-1);
  21.                  write(datos, persona);
  22.                  writeln ('El alumno fue borrado');
  23.                  readln;
  24.               end;
  25.      end
  26. END;
  27.  
  28.  
  29.  

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Función Que Regresé 2 Parametros
« Respuesta #4 en: Lunes 18 de Octubre de 2004, 17:16 »
0
Tu procedimiento buscar código sería....

Código: Text
  1.  
  2. function  BuscarCodigo(var posicion : Integer) : boolean;
  3. Begin
  4.  BuscarCodigo := false; {se inicializa el valor que devolvera la funcion}
  5.  while not eof (datos)  do
  6.               begin
  7.                   read (datos,persona);
  8.                   if persona.matricula=matricula2  then
  9.                        begin {hace falta un begin para que se ejecuten las dos sentencias, sino se ejecuta la primera y sigue mas adelante}
  10.                                 posicion:=filepos(datos);
  11.                                 BusacrCodigo := true; {la funcion devuelve verdadero}  
  12.                           end;
  13.                 end;  
  14. End;
  15.  
  16.  


y para usarla
Código: Text
  1.  
  2. procedure borrar;
  3. var
  4.   eliminar: string;
  5.   seleccion: char;
  6.   pos:integer;
  7.   found: boolean;
  8. BEGIN
  9.   clrscr;
  10.   assign (datos, 'alumnos.txt');
  11.   reset(datos);
  12. found := buscarcodigo(pos); {asigna boolean a found y cambia a pos por el valor de 'pos' por la posicion que se le asigna en la funcion}
  13.  
  14. if found then    
  15.     begin
  16.          writeln ('Seguro que desea eliminar este estudiante?');
  17.          readln(seleccion);
  18.              if seleccion='s' then
  19.              begin
  20.                 persona.sw:=false;
  21.                 seek (datos, pos-1);
  22.                 write(datos, persona);
  23.                 writeln ('El alumno fue borrado');
  24.                 readln;
  25.              end;
  26.     end
  27. END;
  28.  
  29.  

Espero que este bien

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Función Que Regresé 2 Parametros
« Respuesta #5 en: Lunes 18 de Octubre de 2004, 17:24 »
0
Una pregunata.....

Me parecio raro que uses un archivo de acceso deirecto y le pones un nombre alumnos.txt cosa propia de un archivo de acceso secuencial. (Es que en un pos anterior ten'ias ese problema y me preguntaba si no cometes lo mismo de vuelta)

Si lo que quieres es tener en el archivo

Juan
Fernandes
Alvarado 2154 dpto 5

Marcos
Rodriguez
San Martin 5687 10A

Entonces usa variable de tipo TEXT pero en cambio si buscas tener un archivo de tipo ALUMNO o DATOS al parecer estan en el canino correcto.

 :hola:

Panteon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Función Que Regresé 2 Parametros
« Respuesta #6 en: Martes 19 de Octubre de 2004, 23:27 »
0
Muchas gracias por tu ayuda

sobre la pregunta..pues..jaja esa fue la forma en la que me enseñaron al usar  los archivos de acceso directo...aunque  tambien se que se puede poner Alumnos.dat.


gracias de nuevo! :lol: