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


0