TP7 - licznik elementów na stosie.

0

Witam. Mam pytanie odnośnie takiego zadania:

Zrealizować licznik stosu. Mając wierzchołek stosu powinniśmy wiedzieć ile elementów ma stos.

Czy da się tak to zrealizować? Ja jedynie to umiem zrealizować tak, że w funkcji push wrzucającej na stos zwiększam wartość licznika o 1, natomiast w pop zmniejszam o 1.
To by działało poprawnie, ale nie jest zgodne z wymogami. Natomiast jest problem że nie powinno się odwoływać do zmiennych globalnych. Tak więc proszę o drobne wskazówki.

0

Zrobić klasę (albo najlepiej advanced record) i napisać to obiektowo (to również świetne miejsce na wykorzystanie generyków, ale w TP7 ich nie ma :P).

0

Ja jedynie to umiem zrealizować tak, że w funkcji push wrzucającej na stos zwiększam wartość licznika o 1, natomiast w pop zmniejszam o 1.

Możesz to zrealizować dwojako:

  • w funkcji Push inkrementować licznik, a w funkcji Pop dekrementować,
  • liczenie elementów wykonać ręcznie na żądanie;
    Pierwsza metoda wydaje się być najprostsza, bo licznik jest aktualizowany na bieżąco - po każdorazowym wrzuceniu elementu na stos i jego zdjęciu, więc nie powinieneś mieć żadnych problemów;

Natomiast jest problem że nie powinno się odwoływać do zmiennych globalnych.

No to się do nich nie odwołuj - w ogóle z nich nie korzystaj; Z resztą - jak widzę w temacie wątku magiczne słowo TP7, to od razu czuję niechęć... Za zmuszanie uczenia się na tym dziadziusiu powinni palić na stosie...

Jeśli chcesz konkretniejsze wskazówki to pokaż kod, jaki do tej pory zrobiłeś a pomoże się go wyposażyć w ten licznik - inaczej to będzie tylko niesprawdzona teoria.

0

Dziękuję za pomoc. Oto obecny kod programu.

program zad2;
uses crt;
type
     wskaznik=^element;
     rek = record
                liczba:integer;
                ciag:string;
     end;
     element = record
                rekord:rek;
                wsk:wskaznik;
     end;
var
  wsk: wskaznik;
  rekord: rek;
i:byte;
procedure push(var x:wskaznik; var rekord:rek);
 var
  top:wskaznik;
 begin
   new(top);
   top^.rekord:=rekord;
   top^.wsk:=x;
   x:=top;
 end;
procedure pop(var x:wskaznik; var rekord:rek);
var
  bottom:wskaznik;
begin
  rekord:=x^.rekord;
  writeln(rekord.liczba);
  writeln(rekord.ciag);
  bottom:=x^.wsk;
  dispose(x);
  x:=bottom;
end;
begin
 writeln('pamiec: ',memavail);
 for i:=0 to 5 do begin
 with rekord do begin
   liczba:=i;
   ciag:='abc';
 end;
 push(wsk, rekord);
 end;
 for i:=0 to 5 do begin
 pop(wsk,rekord);
 writeln('pamiec: ',memavail);
 end;
 readln;
end.    

Co do TP7 to też jestem tego samego zdania. Sam Pascal to już jest nienajlepszy pomysł, a co dopiero TP7. Ale niestety takie są wymagania, i to co najlepsze - na studiach informatycznych ;).
Tą pierwszą metodę z zwiększaniem i zmniejszaniem licznika oczywiście umieć zrobić - umiem. Co do liczenia na żądanie - już gorzej. Trzeba po prostu przejść do spodu stosu i z powrotem załadować dane?

Natomiast sprawa z klasami wygląda tak, że programowanie obiektowe omawiać będziemy za klika tygodni, więc stosować klas też nie powinienem w tym momencie.

0

Trzeba po prostu przejść do spodu stosu i z powrotem załadować dane?

Idziesz od wierzchołka stosu do pierwszego elementu (tzn.do momentu, w którym wsk będzie równe nil) i inkrementujesz licznik.
Polecałbym również zmianę nazewnictwa; nazwy typów powinno zaczynać się od litery T (nazwy typów wskaźników od P), a wszystkie identyfikatory powinny być napisane w języku angielskim (chodzi o czytelność i klarowność kodu).

0

Witam. Tak wykonałem tą pierwszą opcję. Co do nazewnictwa, to wiem że są takie nieoficjalne standardy, ale teraz robię tak na szybko, byle by działało.

procedure push(var x:wskaznik; var rekord:rek;var counter:integer);
 var
  top:wskaznik;
 begin
   new(top);
   top^.rekord:=rekord;
   top^.wsk:=x;
   x:=top;
   counter:=counter+1;
 end;
procedure pop(var x:wskaznik; var rekord:rek;var counter:integer);
var
  bottom:wskaznik;
begin
  rekord:=x^.rekord;
  writeln(rekord.liczba);
  writeln(rekord.ciag);
  bottom:=x^.wsk;
  dispose(x);
  x:=bottom;
  counter:=counter-1;
end;

Ale wydaje mi się, że prawidłową opcją była ta, ze zliczeniem elementów stosu na żądanie. Ale tutaj nie wiem jeszcze dokładnie jak to zrealizować. Ze stosu mogę korzystać jedynie na jego końcu, jedynie ostatni element. Gdy zdejmę element, otrzymuję dostęp do leżącego niżej.

1

Ale tutaj nie wiem jeszcze dokładnie jak to zrealizować. Ze stosu mogę korzystać jedynie na jego końcu, jedynie ostatni element. Gdy zdejmę element, otrzymuję dostęp do leżącego niżej.

Coś w tym rodzaju:

Function count_leaves(Top: Wskaznik): LongWord;
Begin
 Result := 0;

 While (Top <> nil) do
 Begin
  Inc(Result);
  Top := Top^.wsk;
 End;
End;

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