Pascal/Turbo Pascal - Ayuda por favor

 
Vista:

Ayuda por favor

Publicado por Fran (3 intervenciones) el 24/02/2008 13:54:30
Hola!!

Tengo un verdadero problema con una práctica que tengo que resolver ;me da siempre stack verflow error y no se cómo solucionarlo.Aquí os dejo la práctica y lo que he hecho a ver si me podeis echar un cable

Una persona ha de subir por una rampa.La rampa tiene 5 pasos de ancho y 5 de largo.Comenzamos a observar al piratacuando está en el extremo de la rampa que se apoya sobre el muelle.Si da mas de 2 pasos a la izquierda o a la derecha caerá al agua y se ahogará, pero si da mas de 15 pasoso hacia delante estará a salvo a bordo de su barco.Escribir un programa para simular el irregular avance de esta persona según estas instrucciones

1-Generar un entero aleatorio entre 1 y un numer solicitado por el input.
2-Si el entero es divisible entre 2, la persona da un pas hacia delante
3-Si el entero no es divisible entre 2 , pero si el entero menos 1 es divisible entre 4 , la persona da un paso hacia laderecha
4-En otro caso, la persona da un paso a la izquierda

Las condiciones de terminación son:

1-La persona cae por un costado y se ahoga
2-La persona logra llegar a su barco

Escribir un programa que escriba el avance de esta persona en cada paso


program pirataebrio;

procedure pedirnum (var num:integer);
begin
writeln('dame numero');
readln(num);
end;

procedure generarentero (num:integer;var entero:integer);
begin
entero:=random(num)+1;
end;

function movimadelante (entero:integer):boolean;
begin
if (entero mod 2)=0 then movimadelante:=true
else movimadelante:=false;
writeln('¨te mueves hacia adelante?',movimadelante(ENTERO));
end;

function movimdrcha (entero:integer):boolean;
begin
if (((entero mod 2)<>0) and (((entero-1) mod 4)= 0)) then movimdrcha:=true
else movimdrcha:=false;
writeln('¨te mueves hacia la derecha?',movimdrcha(entero));
end;

function movimizqda (entero:integer):boolean;
begin
if (((entero mod 2)<>0) and (((entero-1) mod 4)<>0)) then movimizqda:=true
else movimizqda:=false;
writeln('¨te mueves hacia la izquierda?',movimizqda(entero));
end;

procedure pasos (var pasodrcha,pasoizqda,pasoadelante:integer);
var num,entero:integer;

begin
pasodrcha:=0;
pasoizqda:=0;
pasoadelante:=0;
repeat
generarentero(num,entero);
writeln('Has sacado un',entero);

if (movimdrcha(entero)=true) then pasodrcha:=pasodrcha+1
else if movimizqda(entero)=true then pasoizqda:=pasoizqda+1
else if movimadelante(entero)=true then pasoadelante:=pasoadelante+1;
writeln('Llevas',pasoizqda,'pasos a la izqda',pasodrcha,'pasos a la drecha y',pasoadelante,'pasos adelante');
until (pasoadelante=16) or (pasodrcha-pasoizqda>2) or (pasoizqda-pasodrcha>2);


if pasoadelante=16 then writeln ('llegas al barco,te salvas')
else if (pasodrcha-pasoizqda>2) or (pasoizqda-pasodrcha>2) then writeln('te ahogas,mueres');

end;

function posicion(pasodrcha,pasoizqda:integer):integer;
begin
if (pasoizqda=pasodrcha+2) then posicion:=-2 else
if (pasoizqda=pasodrcha+1) then posicion:=-1 else
if (pasoizqda=pasodrcha) then posicion:=0 else
if (pasodrcha=pasoizqda+1) then posicion:=1 else
if (pasodrcha=pasoizqda+2) then posicion:=2;
end;

var pasodrcha:integer;
pasoizqda:integer;
pasoadelante:integer;
lugar:integer;
begin
randomize;
writeln('El pirata se encuentra en el centro');
pasos(pasodrcha,pasoizqda,pasoadelante);
lugar:=posicion(pasodrcha,pasoizqda);
if lugar=-2 then writeln('­­PELIGRO!!Estas a un paso a la izquierda de ahogarte ') else
if lugar=-1 then writeln('­­Precauci¢n!!Estas a dos pasos a la izquierda de ahogarte') else
if lugar=0 then writeln('No corres peligro estas en el medio') else
if lugar=1 then writeln('­­Precauci¢n!!Estas a dos pasos a la derecha de ahogarte') else
if lugar=2 then writeln('­­PELIGRO!!Estas a un paso de ahogarte');
readln;
end.


Muchas gracias por la ayuda!!!.Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda por favor

Publicado por Roberto Garcia (56 intervenciones) el 28/02/2008 19:39:33
El error lo tienes en las funciones

function movimadelante (entero:integer):boolean;
function movimdrcha (entero:integer):boolean;
function movimizqda (entero:integer):boolean;

especificamente en la parte del writeln de cada una de estas funciones por ejemplo

function movimadelante (entero:integer):boolean;
begin
if (entero mod 2)=0 then
movimadelante:=true
else
movimadelante:=false;

{1. Aqui no se porque mandas a escribir esta frase con signos de interrogacion, deberia ser afrmacion, ademas fijate que el writeln siempre se ejecuta, tal vez deberias usar un begin end en el else}

{2. Aqui vuelves a llamar a la funcion moviadelante(entero) por lo que vuelve a entrar a la funcion y luego vuleve a entrar y vuelve a entrar ... etc. por lo que haces una llamada recursiva sin ninguna forma de salir por lo que te salta el error de stack overflow}

writeln('¨te mueves hacia adelante?',movimadelante(ENTERO));

end;

Yo creo que ese mensaje de movimiento deberi estar en el procedimiento pasos y sin volver a llamar a la funcion por lo que la parte del programa quedaria asi:

function movimadelante (entero:integer):boolean;
begin
if (entero mod 2)=0 then movimadelante:=true
else movimadelante:=false;
end;

function movimdrcha (entero:integer):boolean;
begin
if (((entero mod 2)<>0) and (((entero-1) mod 4)= 0)) then movimdrcha:=true
else movimdrcha:=false;
end;

function movimizqda (entero:integer):boolean;
begin
if (((entero mod 2)<>0) and (((entero-1) mod 4)<>0)) then movimizqda:=true
else movimizqda:=false;
end;

procedure pasos (var pasodrcha,pasoizqda,pasoadelante:integer);
var num,entero:integer;

begin
pasodrcha:=0;
pasoizqda:=0;
pasoadelante:=0;
repeat
generarentero(num,entero);
writeln('Has sacado un',entero);

if (movimdrcha(entero)=true) then begin
writeln('¨te mueves hacia la derecha?');
pasodrcha:=pasodrcha+1
end
else
if movimizqda(entero)=true then begin
writeln('¨te mueves hacia la izquierda?');
pasoizqda:=pasoizqda+1
end
else
if movimadelante(entero)=true then begin
writeln('¨te mueves hacia adelante?'
pasoadelante:=pasoadelante+1;
end;

writeln('Llevas',pasoizqda,'pasos a la izqda',pasodrcha,'pasos a la drecha y',pasoadelante,'pasos adelante');
until (pasoadelante=16) or (pasodrcha-pasoizqda>2) or (pasoizqda-pasodrcha>2);

if pasoadelante=16 then writeln ('llegas al barco,te salvas')
else if (pasodrcha-pasoizqda>2) or (pasoizqda-pasodrcha>2) then writeln('te ahogas,mueres');

end;

Solo modifique las funciones de movimiento y el procedimiento pasos, pruebalo y me cuentas si no afecta el resultado, por cierto el pirata siempre se termina ahogando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar