0 Daumen
60 Aufrufe

Frage:

Hallo zusammen,

anhand des unten gezeigten Codes soll folgende Frage beantwortet werden:

- Liste gegeben: A -> [8,99,false] -> [4,99,false] -> [8,10,false] -> [10,8,false] -> [4,10,false] -> [4,3,false] -> [3,4,false] -> nil

- Welche Rückgabe liefert der Aufruf print(wasPassiert(A,3,99))?

Ich verstehe die erste Prozedur push und die zweite Funktion get so, dass zunächst eine neue Liste anhand der gegebenen Werte erstellt und aufgerufen wird.

Die dritte Funktion wasPassiert soll zunächst nach meinem Verständnis immer aus dem zweiten Zahlenwert und dem Wert true eine neue Liste B erstellen. Mir ist jedoch schleierhaft, wozu die Abfrage

if (B <> nil) then
      B := B^.next;
    if (B = nil) then
      akt := 0
    else
      akt := B^.zu

dienen soll. Wenn B=nil, dann ist das Ende der Liste erreicht. Weiter verstehe ich es nicht. Ist diese Abfrage überhaupt nötig?

Bei der letzten Prozedur print verzweifle ich vollkommen. Hier stehe ich völlig auf dem Schlauch.

Bitte um Hilfe!

Vielen Dank schonmal.


Code:

type 
tRefKante = ^tKante;
tKante = record
        von: integer;
        zu: integer;
        x:boolean;
        next: tRefKante
      end;

procedure push(inVon:integer; inZu:integer; var ioG:tRefKante);
var
n:tRefKante;
begin
new(n);
n^.von := inVon;
n^.zu := inZu;
n^.x := false; 
n^.next := ioG;
ioG := n
end;

function get(inG:tRefKante; inVon:integer):tRefKante;
var
n:tRefKante;
begin
get := nil;
n := inG;
while (n <> nil) do
begin
  if ((n^.von = inVon) and (not n^.x)) then
    get := n;
  n := n^.next;
end;
end;

function wasPassiert(inG:tRefKante; inVon:integer; inZu:integer):tRefKante;
var
akt:integer;
kante:tRefKante;
B:tRefKante;
begin
akt := inVon;
B := nil;
while ((akt <> inZu) and (akt <> 0)) do
begin
  kante := get(inG,akt);
  if (kante <> nil) then
  begin
    push(B,kante^.von,kante^.zu);
    akt := kante^.zu;
    kante^.x := true
  end
  else
  begin
    if (B <> nil) then
      B := B^.next;
    if (B = nil) then
      akt := 0
    else
      akt := B^.zu
  end;
end;
wasPassiert := B
end;

procedure print(inGraph:tRefKante);
var
e,f : tRefKante;
begin
e := inGraph;
while (e^.next <> nil) do
begin
  e := e^.next;
end;
write('[',e^.von, ',', e^.zu,']');
while (e <> inGraph) do
begin
  f := inGraph;
  while (f^.next <> e) do
  begin
    f := f^.next
  end;
  write('[',f^.von, ',', f^.zu,']');
  e := f
end;
end;
von

Hast du in Erwägung gezogen, einen Pascal-Compiler zu installieren und diesen zu verwenden um den Quelltext zu compiieren?

Jupp, das habe ich bereits versucht. Habe einen Onlinecompiler verwendet. Nur kommen die folgenden Fehlermeldungen:

Compiling main.pas
main.pas(60,34) Error: Call by var for arg no. 3 has to match exactly: Got "SmallInt" expected "tRefKante"
main.pas(98) Fatal: Syntax error, "BEGIN" expected but "end of file" found
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode

Vor allem der Syntax error bereitet mir Kopfzerbrechen. Das Programm erwartet noch irgendwas nach den ganzen Prozeduren/Funktionen, denn mit einem einfachen "begin - end." gibt es sich nicht zufrieden.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community