Programación General > Pascal

 Función Que Regresé 2 Parametros

(1/2) > >>

Panteon:
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:
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:

--- 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)

--- Fin de la cita ---
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 --- if MayorA_Cien = true then...if MayorA_Cien then .... es lo mismo  

Panteon:
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 ---procedure buscarcodigo;var   found:boolean;   matricula2:byte;   pos:integer; BEGIN     clrscr;     assign (datos, 'alumnos.txt');     reset(datos);     found:=false;     Writeln ('Dame el codigo del alumno a Buscar');     readln(matricula2);     seek (datos,0);          while not eof (datos) and not found do               begin                   read (datos,persona);                   if persona.matricula=matricula2  then                     found:=true;                     pos:=filepos(datos);               end;     if found and persona.sw=true then          begin               writeln (' ');               writeln ('Eston son los datos del alumno:');               writeln (' ');               writeln ('Matricula: ',persona.Matricula);               writeln ('Nombre: ',persona.nombre);               writeln ('Apellido P.: ',persona.apellidop);               writeln ('Apellido M.: ',persona.apellidom);               writeln ('Edad: ' ,persona.edad);               writeln ('Pais: ' ,persona.pais);               writeln ('Ciudad: ',persona.ciudad);               writeln ('Telefono Tutor: ', persona.telefono);               writeln ('Visa: ', persona.visa);          end     else         begin            textcolor(red);            writeln('Ese  alumno no est  ingresado');         end;         readln;   close(datos);END; 


--- Código: Text --- procedure borrar;var   eliminar: string;   seleccion: char;   pos:integer;   found: boolean;BEGIN   clrscr;   assign (datos, 'alumnos.txt');   reset(datos);buscarcodigo {aqui manda a llamar el procedimiento)if found then     begin          writeln ('¨Seguro que desea eliminar este estudiante?');          readln(seleccion);              if seleccion='s' then              begin                 persona.sw:=false;                 seek (datos, pos-1);                 write(datos, persona);                 writeln ('El alumno fue borrado');                 readln;              end;     endEND;   

Enko:
Tu procedimiento buscar código sería....


--- Código: Text --- function  BuscarCodigo(var posicion : Integer) : boolean;Begin BuscarCodigo := false; {se inicializa el valor que devolvera la funcion} while not eof (datos)  do              begin                  read (datos,persona);                  if persona.matricula=matricula2  then                       begin {hace falta un begin para que se ejecuten las dos sentencias, sino se ejecuta la primera y sigue mas adelante}                                posicion:=filepos(datos);                                BusacrCodigo := true; {la funcion devuelve verdadero}                            end;                end;   End;  

y para usarla

--- Código: Text --- procedure borrar;var  eliminar: string;  seleccion: char;  pos:integer;  found: boolean;BEGIN  clrscr;  assign (datos, 'alumnos.txt');  reset(datos);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} if found then         begin         writeln ('Seguro que desea eliminar este estudiante?');         readln(seleccion);             if seleccion='s' then             begin                persona.sw:=false;                seek (datos, pos-1);                write(datos, persona);                writeln ('El alumno fue borrado');                readln;             end;    endEND;  
Espero que este bien

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa