Ayuda en pascal para hacer pila

Mi problema trata de hacer una pila la cual deberá de ser de un limite máximo de 10 espacios en los cuales se podrán depositar algunas cifras, las cifras se integraran de abajo hacia arriba.
Todo esto debe de llevar un menu en el cual debe de aparecer:pus(meter dato),
pop(sacar dato), status(para ver el estado de la lista) y salir que es para salir del programa. Es obvio que al quitar una cifra sera la que este hasta arriba o la ultima que hayas metido.
Respuesta
1
Sobre tu problema, lo que me dices esta más relaciona con el lenguaje de programación ensamblador, pero en pascal se puede hacer una emulación de pila, pero para decirte como programar eso, necesito saber que tipos de cifras son (binarios decimales) la longitud etc. así como también si el programa debe ordenar automáticamente los datos.
Estoy a tu servicio, si me dices esos datos con mucho gusto te ayudare.
Eugenio ;)
Hola eugenio gracias por contestarme. Mira esto es lo que yo he podido hacer:
program pila;
uses crt;
var pila:array[1..10]of integer;
i:integer;
opc:char;
dato:integer;
procedure push(dato:integer;var i:integer);
begin
if i:=10 then
writeln(pila llena);
else
begin
i:=i+1;
pila:=dato;
end;
end;
function po(var i:integer):integer;
begin
pop:=-1;
if i:=0 then
writeln('pila vacia');
else
begin
pop:=pila;
i:=i-1;
end;
end;
beging
clrscr
i:=0;
repeat
clrscr;
writeln('1:status');
writeln('2:pop');
writeln('3:status');
writeln('4:exit');
writeln;
readln(opc);
case upcase(opc) of
'1':begin
write('dato');
readln(dato);
push(dato,i);
end;
'2':begin
writeln(pop(i));
write('continuar');
readln;
end;
end;
until upcase(opc)='4';
end.
Mira esto es lo que he hecho espero más o menos te des una idea y me puedas ayudar, como te darás cuenta me falta la opción 3 (status)esta opción me debe de mostrar los datos que he introducido en la opción 1 (pus). Ya sean tres datos o 6.
Ademas tengo un problema con el mensaje de error pues al llegar a más de 11 no me manda el mensaje de pila llena.
Espero no me aya equivocado en escribirlo para que tu lo puedas pasar a tu maquina y veas lo que me falta.
Bueno me despido esperando que con esto si me puedas ayudar.
PD.1: En status me debe de mostrar la pila empezando del 10 al 1 (arriba hacia abajo) y cuando alguna del las celdas de la pila este vacía debe de mostrar un cero(que indica que esta vacía).
PD.2:Muchas gracias por responderme y ayudarme.
Atentamente:
ghostgelacio
He detectado algunos problemas como if i:=10 (deberia ser if i>10 es decir mayor q 10) o bien if i:=0 (deberia ser if i<0 es decir menor que).
Ahora no he entendido bien el propósito de tu programa, esto es lo que yo supongo.
-Con la opcion push meytes un dato en una celda q uno escoge o el programa automaticamente lo va almacenando del 1 al 10.
-Con la opción pop borras una celda a elegir o lo va borrando de la celda 10 al 1 automáticamente.
Esto yo entendí, por eso me urge que me digas si es ese tu propósito. Contestame lo más pronto posible para que yo inmediatamente te mande el código.
Saludos . Eugenio
Muchísimas gracias casi lo logramos, pero te voy a molestar nuevamente.
LE hice unas modificaciones al programa para que me funcionara bien, pero tengo un ultimo problema:
program ejemplo_pila;
uses crt;
var
pila:array[1..10] of integer;
celda,data_temp,data_temp2:integer;
opcion:char;
procedure push(dato:integer);
begin
if celda>9 then
begin
textcolor(yellow);
textbackground(red);
writeln;
writeln('La pila esta llena');
readln;
end else
begin
data_temp2:=dato;
textbackground(blue);
textcolor(yellow);
writeln;
writeln(dato,' almacenado en la celda ',celda+1);
celda:=celda+1;
pila[celda]:=dato;
readln;
end;
end;
procedure pop;
begin
if celda<1 then
begin
textcolor(yellow);
textbackground(red);
writeln;
writeln('La pila esta vacia');
readln;
end else
begin
textbackground(blue);
textcolor(yellow);
writeln;
writeln('Dato borrado de la celda ',celda);
pila[celda]:=0;
celda:=celda-1;
readln;
end;
end;
procedure limpiar_pantalla;
begin
textbackground(blue);
clrscr;
textbackground(red);
textcolor(white);
writeln('Programa ejemplo de PILA (C) Eugenio 2003 ');
end;
procedure menu;
begin
limpiar_pantalla;
textbackground(red);
textcolor(white);
gotoxy(30,10); writeln('Menu Principal ');
textbackground(white);
textcolor(black);
gotoxy(30,11); writeln(' ');
gotoxy(30,12); writeln(' 1- Push ');
gotoxy(30,13); writeln(' 2- Pop ');
gotoxy(30,14); writeln(' 3- Estado ');
gotoxy(30,15); writeln(' 4- Salir ');
gotoxy(30,16); writeln(' ');
opcion:=readkey;
if opcion='1' then
begin
limpiar_pantalla;
textbackground(blue);
textcolor(yellow);
writeln;
write('Dato:'); readln(data_temp);
push(data_temp);
end;
if opcion='2' then pop;
if opcion='3' then
begin
limpiar_pantalla;
textbackground(blue);
textcolor(yellow);
writeln;
writeln('Estado de la pila:');
writeln;
writeln('Celda 10:',pila[10]);
writeln('Celda 09:',pila[9]);
writeln('Celda 08:',pila[8]);
writeln('Celda 07:',pila[7]);
writeln('Celda 06:',pila[6]);
writeln('Celda 05:',pila[5]);
writeln('Celda 04:',pila[4]);
writeln('Celda 03:',pila[3]);
writeln('Celda 02:',pila[2]);
writeln('Celda 01:',pila[1]);
writeln;
writeln('Presiona una tecla para continuiar...');
readln;
end;
if opcion='4' then halt;
end;
begin
repeat
menu;
until 2=3;
end.
Mi problema es que necesito que cuando quiera ver el estado la primera vez me marque en todas las celdas cero(0), pues me aparecen unas cifras que no requiero.
DFe ante mano muchas gracias te agradezco que te tomes las molestias en resolver mi problema.
Sin más que decir me despido.
Espero que no sea molesta esta ultima duda.
Atentamente.:ghostgelacio
Perdón, ya vi los mensajes anteriores y ya se tu propósito, bien ya te escribí todo el código, pero debido a que este espacio tan reducido no me lo deja, lo pongo a tu disposición en la siguiente dirección web:
vcsd.galeon.com/pila.txt
Copialo, pegalo en el block de notas y salvalo como pila. Pas y despues podras compilarlo con turbo pascal o free pascal.
Bueno espero que haya sido de ayuda.
Buena suerte.
Eugenio
Perfecto, genial, muchísimas gracias¡
Era lo que quería te lo agradezco. Quisiera pagártelo de alguna manera pero no creo que se pueda
y si se puede dímelo al fin ya tienes mi correo muchísimas gracias de nuevo.
Sin más que decir me despido y te agradezco la molestia.
Atentamente.: ghostgelacio
Ya analice los cambios y solo modificaste los delays por readln.
Bien sobrwe tu problema compile el programa tanto en freepascal como en turbopascal y cuando inicio la primera vez el programa y le dio estado todas las celdas tienen como valor 0, ¿o no se si lo que tu quieres es que no estén enumeradas del 1 al 10?. Pero bueno en cualquier caso puede ser que las variables no estén limpias del todo, para resolver ese problema agrega este procedimiento al código:
procedure clean_var;
begin
pila[1]:=0;
pila[2]:=0;
pila[3]:=0;
pila[4]:=0;
pila[5]:=0;
pila[6]:=0;
pila[7]:=0;
pila[8]:=0;
pila[9]:=0;
pila[10]:=0;
end;
Y en las ultimas lineas del codigo antes del repeat pon:
clean_var;
Espero que eso lo resuelva, si en otro caso no sirve avisame.
Suerte. Eugenio

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas