Programación General > Pascal
Función Que Regresé 2 Parametros
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
[#] Página Siguiente
Ir a la versión completa