Gotowy program stos

0

Witam serdecznie forumowiczów!
Mam mały problemik :(
Program mam gotowy cały!
Tylko na dole mam program z "function pelny:boolean"
Program ma na celu pokazanie między innymi czy stos jest zapełniony
Proszę o porady małe.
Pozdrawiam.

moduł


unit uStos;   
interface
procedure inicjuj;
  {Inicjuje pusty stos}
procedure wstaw(i:longint);
  {Wstawia element i na stos}
function zdejmij:longint;
  {Jesli stos jest pusty, to wartoscia jest nic,
   w przeciwnym razie wartoscia jest element zdjety ze szczytu stosu}
function pusty:boolean;
  {Wartosc true, gdy stos jest pusty, w przec. razie falsz}
function szczyt:longint;
  {Jesli stos jest pusty, to wartoscia jest nic,
   w przeciwnym razie element ze szczytu stosu}
function pelny:boolean;
const nic=-MaxLongint; {Oznacza nieokreslona wartosc funkcji szczyt i zdejmij}

implementation
const maxStos=100; 
type zakres=0..maxStos;
     tab=array[zakres] of longint;
var stos:tab; 
    wsk:zakres; 

procedure inicjuj; 
begin 
  wsk:=0
end; {inicjuj}

procedure wstaw(i:longint);
begin
  Inc(wsk); 
  stos[wsk]:=i 
end; {wstaw}

function zdejmij:longint;
begin
  if pusty then zdejmij:=nic 
  else begin 
    zdejmij:=stos[wsk]; 
    Dec(wsk) 
  end
end; {zdejmij}

function pusty:boolean;
begin 
  pusty:=wsk=0
end; {pusty}

function szczyt:longint;
begin
  if pusty then szczyt:=nic 
  else szczyt:=stos[wsk]
end; {szczyt}

__function pelny:boolean;
begin
  if wsk=zakres then pusty:=true else pusty :=false;
 end;__
end.'


Sam program


program TestowanieStosu; {cwicz. 1.42}
uses Crt,uStos;
const n=20;
var i:1..n;
begin
  ClrScr;
  Writeln('Nieokreslona wartosc wynosi: ',nic);
  inicjuj; 
  Randomize;
  Writeln('Na szczycie stosu pustego jest ',szczyt);
  Writeln('Umieszczanie na stosie');
  for i:=1+Random(n) downto 1 do begin 
    wstaw(Random(100)); Write(szczyt,' ') 
  end;
  Writeln; Writeln('Zdejmowanie ze stosu');
  while not pusty do Write(zdejmij,' '); 
  Writeln;
  Writeln('Wartosc zdjeta ze stosu pustego wynosi ',zdejmij);
  writeln('stos jest pelny',pelny);
  Repeat Until Keypressed;
end.


 
0

JAKI PROBLEM ?

0

Pewnie taki że kod się nie kompiluje bo pytacz porównuje zmienną typu zakres z typem zakres co oczywiście dla kompilatora jak i dla nas jest niezrozumiałe.

1

Dokładnie, problemem jest zapis wsk = zakres, gdzie wsk jest typu zakres i jedyne co można zrobić to sprawdzić, czy wsk ma lub nie ma wartości z zakresu (operator in);

Poza tym nie wiem pytaczu czy Ty widzisz co napisałeś, czy nie, ale w tym kodzie:

__function pelny:boolean;
begin
  if wsk=zakres then pusty:=true else pusty :=false;
 end;__
end.'

są co najmniej cztery błędy; Jeśli chcesz sprawdzić czy wsk ma wartość z odpowiedniego zakresu (a dokładnie z zakresu zakres, czyli 0 .. maxStos) to sprawdź to tak:

function Pelny(): Boolean;
begin
  if Wsk in Zakres then
    Pusty := True
  else
    Pusty := False;
end;

albo jeszcze lepiej tak:

function Pelny(): Boolean;
begin
  Pelny := Wsk in Zakres;
end;

No i popraw to formatowanie, bo jest tragiczne, oraz nazewnictwo zmiennych, stałych...

0

Koledzy jestem wam bardzo wdzięczny za pomoc waszą. No tak zgodzę się formatowanie u mnie jest kiepskie...
Ale leży jeden problem w tym. Skompiluje wam ten program? Bo u mnie bez funkcji pełny to bez problemu kompiluje ;/

 unit uStos;   {stos liczb calkowitych, p. 1.11.1}
interface
procedure inicjuj;
  {Inicjuje pusty stos}
procedure wstaw(i:longint);
  {Wstawia element i na stos}
function zdejmij:longint;
  {Jesli stos jest pusty, to wartoscia jest nic,
   w przeciwnym razie wartoscia jest element zdjety ze szczytu stosu}
function pusty:boolean;
  {Wartosc true, gdy stos jest pusty, w przec. razie falsz}
function szczyt:longint;
  {Jesli stos jest pusty, to wartoscia jest nic,
   w przeciwnym razie element ze szczytu stosu}
function Pelny(): Boolean;

const nic=-MaxLongint; {Oznacza nieokreslona wartosc funkcji szczyt i zdejmij}

implementation
const maxStos=100; 
type zakres=0..maxStos;
     tab=array[zakres] of longint;
var stos:tab; 
    wsk:zakres; 

procedure inicjuj; 
begin 
  wsk:=0
end; {inicjuj}

procedure wstaw(i:longint);
begin
  Inc(wsk); 
  stos[wsk]:=i 
end; {wstaw}

function zdejmij:longint;
begin
  if pusty then zdejmij:=nic 
  else begin 
    zdejmij:=stos[wsk]; 
    Dec(wsk) 
  end
end; {zdejmij}

function pusty:boolean;
begin 
  pusty:=wsk=0
end; {pusty}

function szczyt:longint;
begin
  if pusty then szczyt:=nic 
  else szczyt:=stos[wsk]
end; {szczyt}

function Pelny: Boolean;
function Pelny(): Boolean;
begin
  if Wsk in Zakres then
    Pusty := True
  else
    Pusty := False;
end;

end.
0
{...}

function szczyt:longint;
begin
  if pusty then szczyt:=nic 
  else szczyt:=stos[wsk]
end; {szczyt}
 
function Pelny: Boolean;  // <- TĄ LINIĘ USUŃ
function Pelny(): Boolean;
begin
  if Wsk in Zakres then
    Pusty := True
  else
    Pusty := False;
end;
 
end.

Ty w ogóle patrzysz na kod...? Masz zdublowaną funkcję pelny - usuń tą pierwszą bez ciała;


Widzę, że nie ogarniasz, więc zapis:

function Pelny: Boolean;

jest równoznaczny z:

function Pelny(): Boolean;

bo w obu przypadkach liczba argumentów jest równa 0, a czy napiszesz te puste nawiasy czy nie to nie ma znaczenia (jednak część procedur z RTL nie pozwala na puste nawiasy, jak procedura Exit);

0

Kolego tak wiem że bez tej linijki"function Pelny: Boolean; // <- TĄ LINIĘ USUŃ" ja po prostu zapomniałem ją usunąć ale potem to zrobiłem bez niej i własnie mi nie kompiluje.
ona jest z drugiego pliku który mam taki sam

0

Kolego, a czy Ty potrafisz samodzielnie myśleć...? Patrz co napisałeś:

function Pelny(): Boolean;
begin
  if Wsk in Zakres then
    Pusty := True
  else
    Pusty := False;
end;

Funkcja Pelny, a Ty próbujesz ustalić rezultat funkcji Pusty...

Będzie działać, jak napiszesz tak:

function Pelny(): Boolean;
begin
  if Wsk in [Low(Zakres) .. High(Zakres)] then
    Pelny := True
  else
    Pelny := False;
end;

Beznadziejnie nadajesz nazwy zmiennym i typom i ciężko załapać gdzie jest błąd;

0

Exit nie jest procedurą tylko nakazuje kompilatorowi wstawić tam skok (jmp) do końca procedury / funkcji (w praktyce nie do końca bo zwykle trzeba jeszcze przywrócić rejestry).

Exit nie każe wstawić jumpa do końca procedury, tylko po prostu opuścić tą procedurę. Można to zrobić też poprzez drugie wygenerowanie sekwencji kończącej.

 if Wsk in [Low(Zakres) .. High(Zakres)] then

Przecież ten kod będzie (a przynajmniej powinien) zawsze zwracać true bo zmienna wsk należy do tego zakresu jako że sama jest taka zdefiniowana. To że jeżeli wyjdzie poza zakres nie spowoduje runtime errora nie znaczy że to ma sens.

1 użytkowników online, w tym zalogowanych: 0, gości: 1