Aufgabe lösen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
chandler82
Beiträge: 7
Registriert: Sa 7. Nov 2015, 15:54

Aufgabe lösen

Beitrag von chandler82 »

Hi,

ich habe ein Problem. Leider bekomme ich die Lösung einer Aufgabe nicht hin. Vielleicht kann mir einer helfen.

Das Programm soll Eingaben in einer Liste aufsteigend sortieren. Anfang und Ende des Programms sind gegeben. Der Mittelteil ist selbst zu erstellen. Hoffentlich kann mir jemand die Syntax vervollständigen.

Code: Alles auswählen

program TesteSortiereListe(input, output);
{ab hier ist das Programm vorgegeben}
  type
  tNatZahl = 0..maxint;
  tRefListe = ^tListe;
  tListe = record
             info : tNatZahl;
             next : tRefListe;
           end;
 
  var
  RefListe : tRefListe;
 
  procedure SortiereListe (var ioRefListe : tRefListe);
  { sortiert eine lineare Liste aufsteigend }
 
  {ab hier kommt mein Part}
  var
  philf : tRefListe;
  philf2 : tRefListe; {zeigt auf next}
  philf3 : tRefListe;
 
 begin
  philf := ioRefListe;
 
  if (ioRefListe <> nil) and (ioRefListe^.next <> nil) then
  {Schleife über Elemente der Liste}
  {1. SF - Element ist größtes Element, dann nichts machen}
  {2. SF - kleinstes Element am Anfang einfügen}
  {ansonsten in Liste einfügen}
 
  while philf^.next <> nil do
    begin
      if philf^.next^.info > philf^.info then
      philf := philf^.next {SF1}
    end
 
  else
 
    begin
    if philf^.next^.info < ioRefListe^.info then {SF2}
 
     philf2:=philf^.next;                  {umstellen}
     philf^.next := philf^.next^.next;
     philf2^.next:=ioRefListe;
     ioRefListe := philf2 {AM Anfang anketten}
    end
 
  else
 
     begin
     philf3 := ioRefListe;
     while philf2^.info > philf3^.next^.info do
        philf3 := philf3^.next;
        philf2^.next := philf3^.next;{Einketten}
        philf3^next:= philf2; 
    end; 
  end;
 
{hier geht der vorgegebene Part weiter}
procedure Anhaengen(var ioListe : tRefListe;
                        inZahl : tNatZahl);
{ Haengt inZahl an ioListe an }
  var Zeiger : tRefListe;
begin
  Zeiger := ioListe;
  if Zeiger = nil then
  begin
    new(ioListe);
    ioListe^.info := inZahl;
    ioListe^.next := nil;
  end
  else
  begin
    while Zeiger^.next <> nil do
      Zeiger := Zeiger^.next;
    { Jetzt zeigt Zeiger auf das letzte Element }
    new(Zeiger^.next);
    Zeiger := Zeiger^.next;
    Zeiger^.info := inZahl;
    Zeiger^.next := nil;
  end;
end;
 
procedure ListeEinlesen(var outListe:tRefListe);
{ liest eine durch Leerzeile abgeschlossene Folge von Integer-
  Zahlen ein und speichert diese in der linearen Liste RefListe. }
  var
  Liste : tRefListe;
  Zeile : string;
  Zahl, Code : integer;
begin
  writeln('Bitte geben Sie die zu sortierenden Zahlen ein.');
  writeln('Beenden Sie Ihre Eingabe mit einer Leerzeile.');
  Liste := nil;
  readln(Zeile);
  val(Zeile, Zahl, Code); { val konvertiert String nach Integer }
  while Code=0 do
  begin
    Anhaengen(Liste, Zahl);
    readln(Zeile);
    val(Zeile, Zahl, Code);
  end; { while }
  outListe := Liste;
end; { ListeEinlesen }
 
 
 
 
 
procedure GibListeAus(inListe : tRefListe);
{ Gibt die Elemente von inListe aus }
  var Zeiger : tRefListe;
begin
  Zeiger := inListe;
  while Zeiger <> nil do
  begin
    writeln(Zeiger^.info);
    Zeiger := Zeiger^.next;
  end; { while }
end; { GibListeAus }
 
begin
  ListeEinlesen(RefListe);
  SortiereListe(RefListe);
  GibListeAus(RefListe)
end.
Zuletzt geändert von Lori am Mo 9. Nov 2015, 19:10, insgesamt 2-mal geändert.
Grund: Highlighter

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Aufgabe lösen

Beitrag von Komoluna »

Hi,

erstmal herzlich willkommen im Forum.
Wenn du code postest, nutze bitte Highlighter. Das macht den code leserlicher:

Code: Alles auswählen

procedure Foo;
begin
  bar := 1;
end;
Außerdem solltest du genau beschreiben, wo dein Problem liegt. Hausaufgaben machen wir hier nämlich nicht.
Aber wenn du eine konkrete Frage hast, beantworten wir sie dir gerne.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

chandler82
Beiträge: 7
Registriert: Sa 7. Nov 2015, 15:54

Re: Aufgabe lösen

Beitrag von chandler82 »

Tja, dann ist das halt so.

Ich verstehe nicht, warum ich einen compiler Fehler erhalte.

Aufgabe 3.4.pas(48,3) Fatal: Syntax error, ";" expected but "ELSE" found

Aber wenn das hier kein Forum ist, in dem man bei Problemen geholfen bekommt, dann bin ich wohl falsch abgebogen. Dann wäre es nett, wenn du mir sagen könntest, in welchem Forum man bei Problemen geholfen bekommt.

Außerdem habe ich niemanden darum gebeten, mir die Aufgabe zu bearbeiten... schließlich habe ich bereits einen ganzen Teil selbst geschrieben. Ich raffe nur nicht, was ich übersehen habe, damit das Programm funktioniert.

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Aufgabe lösen

Beitrag von Thandor »

Hallo,

schau dir mal das Ende von Zeile 46 an. Da fehlt ein ";"

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Aufgabe lösen

Beitrag von TBug »

chandler82 hat geschrieben:Ich verstehe nicht, warum ich einen compiler Fehler erhalte.

Aufgabe 3.4.pas(48,3) Fatal: Syntax error, ";" expected but "ELSE" found
Der Fehler liegt nicht erst in Zeile 48.

Du hast ein ELSE stehen, wo es nicht hingehört, da dort keine If-Bedingung ist, sondern eine While-Schleife. Zeile 36;

Zu dieser If-Bedingung gibt es 2 Else-Blöcke:

Code: Alles auswählen

if (ioRefListe <> nil) and (ioRefListe^.next <> nil) then
Aber dies ist nur eine erste Prognose, da der Code nicht formatiert ist, wie Komoluna bereits bemängelt hat.

Dass man selbst den Fehler nicht findet liegt an mangelder Formatierung.
Würde man alle Blöcke mit Begin-End programmieren und entsprechende Einrückungen vornehmen, dann wäre auch die Lesbarkeit deutlich erhöht und eine leichtere Fehleranalyse möglich.



.
Zuletzt geändert von TBug am So 8. Nov 2015, 14:03, insgesamt 1-mal geändert.

chandler82
Beiträge: 7
Registriert: Sa 7. Nov 2015, 15:54

Re: Aufgabe lösen

Beitrag von chandler82 »

Aber vor einem else darf man doch keines setzen. Ich weiß nicht warum der compiler das dann moniert.

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Aufgabe lösen

Beitrag von TBug »

chandler82 hat geschrieben:Aber vor einem else darf man doch keines setzen. Ich weiß nicht warum der compiler das dann moniert.
Hast Du meinen Post gelesen?

Schau Dir einmal die erste While-Schleife an, dort ist ein BEGIN und ein END ohne ";" gefolgt von einem ELSE.
Aber zu einem WHILE-Block gibt es kein ELSE.

Formatierung, Einrückung, BEGIN-END, Formatierung, Einrückung, BEGIN-END, Formatierung, Einrückung, BEGIN-END, und nochmals Formatierung, Einrückung, BEGIN-END

und man findet den Fehler.

Dort fehlt auch noch ein Semikolon

Code: Alles auswählen

 
  while philf^.next <> nil do
  begin
    if philf^.next^.info > philf^.info then
     philf := philf^.next {SF1}   //<- HIER
  end  //<- und HIER
 

.

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Aufgabe lösen

Beitrag von TBug »

Ich hab mir einmal die Mühe gemacht, Deinen Code zu formatieren.

Code: Alles auswählen

 
procedure SortiereListe (var ioRefListe : tRefListe);
{ sortiert eine lineare Liste aufsteigend }
{ab hier kommt mein Part}
var
  philf : tRefListe;
  philf2 : tRefListe; {zeigt auf next}
  philf3 : tRefListe;
begin
  philf := ioRefListe;
 
  if (ioRefListe <> nil) and (ioRefListe^.next <> nil) then
  {Schleife über Elemente der Liste}
  {1. SF - Element ist größtes Element, dann nichts machen}
  {2. SF - kleinstes Element am Anfang einfügen}
  {ansonsten in Liste einfügen}
 
    while philf^.next <> nil do
     begin
      if philf^.next^.info > philf^.info then
        philf := philf^.next {SF1}
     end
 
  else  // 1. ELSE zu 1. IF
   begin
    if philf^.next^.info < ioRefListe^.info then {SF2}
      philf2:=philf^.next; {umstellen}
 
    philf^.next := philf^.next^.next;
    philf2^.next:=ioRefListe;
    ioRefListe := philf2 {AM Anfang anketten}
   end
  else // 2.ELSE zum 1. IF
   begin
    philf3 := ioRefListe;
    while philf2^.info > philf3^.next^.info do
      philf3 := philf3^.next;
    philf2^.next := philf3^.next;{Einketten}
    philf3^next:= philf2;
   end;
end;
 
Na, fällt Dir nun etwas auf???


.

mischi
Beiträge: 206
Registriert: Di 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
CPU-Target: 32Bit/64bit

Re: Aufgabe lösen

Beitrag von mischi »

chandler82 hat geschrieben:Aber wenn das hier kein Forum ist, in dem man bei Problemen geholfen bekommt, dann bin ich wohl falsch abgebogen. Dann wäre es nett, wenn du mir sagen könntest, in welchem Forum man bei Problemen geholfen bekommt.
Das hast du kräftig miss verstanden.
chandler82 hat geschrieben:Außerdem habe ich niemanden darum gebeten, mir die Aufgabe zu bearbeiten...
Sah zumindest auf den ersten Blick so aus.
chandler82 hat geschrieben:schließlich habe ich bereits einen ganzen Teil selbst geschrieben. Ich raffe nur nicht, was ich übersehen habe, damit das Programm funktioniert.
Für dieses Problem bist du hier schon richtig. Zur Lösung des Problems schau dir mal die formatierte Version von TBug an.
Zuletzt geändert von mischi am So 8. Nov 2015, 14:37, insgesamt 1-mal geändert.
MiSchi macht die fink-Pakete

chandler82
Beiträge: 7
Registriert: Sa 7. Nov 2015, 15:54

Re: Aufgabe lösen

Beitrag von chandler82 »

Sorry, aber ich habe vor 4 Wochen zum ersten mal ein Programm, welches mir sagt: "Hallo!" geschrieben.
Eigentlich bin ich BWLer, bin aber im Zweitstudium in Mathematik eingestiegen. Leider bin ich mit Programmierkonzepten und Formatierung nicht so bewandert.
Ich brauche scheinbar noch ne if-Bedingung, bevor ich das zweite else setze.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Aufgabe lösen

Beitrag von Komoluna »

Genau, eine If-Anweisung kann nicht 2 else Pfade haben. Stell dir mal vor, du wärst das Programm:

Code: Alles auswählen

Wenn X>0 dann
  tue dies
sonst
  tue jenes
sonst 
  tue was anderes
Woher soll das Programm denn wissen ob es "jenes" oder "was anderes" tun soll.

MFG

Komoluna

P.S.: Du brauchst dich nicht zu entschuldigen, dass du noch kein Profi bist.
Wir helfen (auch/gerade) Anfängern
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

chandler82
Beiträge: 7
Registriert: Sa 7. Nov 2015, 15:54

Re: Aufgabe lösen

Beitrag von chandler82 »

Ich habe leider immer noch keine Lösung dazu hinbekommen, was ich dem Programm mitteilen muss, damit es an dieser Stelle, wo das else weggelassen werden muss, nochmal Auskette.

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Aufgabe lösen

Beitrag von Thandor »

Ich würde das If aufteilen.

Das erste IF prüft o die Liste existiert (ioRefListe <> nil).
Das zweite IF befindet sich im TRUE-Zweig des ersten IF und prüft, ob es noch ein nächstes Element in der Liste gibt.

Dann kannst du zu dem ersten IF definieren, was passieren soll, wenn (ioRefListe <> nil) -> else
Und das else vom zweiten IF beschreibt dann was passieren soll, wenn das Ende der Liste erreicht wurde.

Das sind ja auch logisch gesehen zwei unterschiedliche Fälle.

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Aufgabe lösen

Beitrag von TBug »

chandler82 hat geschrieben:Ich habe leider immer noch keine Lösung dazu hinbekommen, was ich dem Programm mitteilen muss, damit es an dieser Stelle, wo das else weggelassen werden muss, nochmal Auskette.
Das liegt daran, weil Deine Struktur nicht stimmt.

So muss die erste Überprüfung sein:

Code: Alles auswählen

 
 
  if ((ioRefListe <> nil) and (ioRefListe^.next <> nil)) then
   begin
    //Wir sind hier, wenn die Liste nicht leer ist und gleichzeitig mehr als 1 Element in der Liste ist
    // Hier müssen wir jetzt sortieren
    {Schleife über Elemente der Liste}
    {1. SF - Element ist größtes Element, dann nichts machen} 
    {2. SF - kleinstes Element am Anfang einfügen}
    {ansonsten in Liste einfügen}
 
   end
  else
   begin
     // Wir wären hier, wenn die Liste leer ist oder nur ein Element enthält
 
    // diesen ELSE-Part für diese Abfrage können wir weglassen,
    // da eine leere Liste oder eine Liste mit nur einem Element nicht sortiert werden muss
 
   end;
 
Also bleibt für die 1. IF-Abfrage übrig:

Code: Alles auswählen

 
  if ((ioRefListe <> nil) and (ioRefListe^.next <> nil)) then
   begin
    //Wir sind hier, wenn die Liste nicht leer ist und gleichzeitig mehr als 1 Element in der Liste ist
    // Hier müssen wir jetzt sortieren
    {Schleife über Elemente der Liste}
    {1. SF - Element ist größtes Element, dann nichts machen} 
    {2. SF - kleinstes Element am Anfang einfügen}
    {ansonsten in Liste einfügen}
   end;
 
Wobei ich dies zur Sicherheit so machen würde:

Code: Alles auswählen

 
  if (ioRefListe <> nil) then
   begin
    if (ioRefListe^.next <> nil) then
     begin
      //Wir sind hier, wenn die Liste nicht leer ist und gleichzeitig mehr als 1 Element in der Liste ist
      // Hier müssen wir jetzt sortieren
      {Schleife über Elemente der Liste}
      {1. SF - Element ist größtes Element, dann nichts machen} 
      {2. SF - kleinstes Element am Anfang einfügen}
      {ansonsten in Liste einfügen}
     end;
   end;
 
So und nun probiere einmal eine Struktur für die Sortierung zu posten, also mit den Abfragebedingungen. Den eigentlichen Code zum Sortieren kannst Du erst einmal weglassen.


.

chandler82
Beiträge: 7
Registriert: Sa 7. Nov 2015, 15:54

Re: Aufgabe lösen

Beitrag von chandler82 »

Nee, ich bin erst mal raus. Ich sende das jetzt so ab. Muss im Skript nochmal nach weiter vorne gehen. Das ist der Mist wenn man hauptberuflich sich mit Controlling beschäftigt. Da hat man immer so lange Pausen zwischen dem Lernen und vergisst dann wieder die Grundlagen vom Anfang.

In der Übung brauche ich zum Glück immer nur 30 % zum weiterkommen. Das muss jetzt reichen.

Antworten