Problem mit verschachtelten IF Anweisungen

Dr Franke Ghostwriter
ich hoffe Ihr könnt mir weiterhelfen.
Ich habe ein Problem mit verschachtelten IF-Anweisungen. Der Pascal-Code selbst müsste inhaltlich richtig sein, jedoch habe ich Probme mit den Begin und End Anweisungen...

Hier ein Auszug aus meinem Programm:

...
if (eingabe >= 0.5) then
Begin
eingabe:= eingabe -0.5;
geld50:= 1
end else
Begin
if eingabe >= 0.4 then
eingabe:= eingabe -0.4;
geld20:= 2
end
else
if eingabe >= 0.2 then
Begin
geld20:= 1;
eingabe:= eingabe -0.2
end
else ...

Wie lautet der Syntax, wenn ich mehrere It then else Anweisungen benutzen möchte und ich mit Begin und End arbeiten muss, da ich nach dem then mehr als eine Anweisung ausführen möchte?

Ich würde mich sehr freuen, wenn mir jemand weiterhelfen kann.
 
Ich habe ein Problem mit verschachtelten IF-Anweisungen. Der Pascal-Code selbst müsste inhaltlich richtig sein, jedoch habe ich Probme mit den Begin und End Anweisungen...
Was für ein Problem genau? Die Syntax von if-then-else ist ganz einfach

Code:
if <bedingung> then <anweisung> else <anweisung>

Ein begin-else-Block ist jetzt einfach eine zusammengesetzte Anweisung, die überall dort stehen darf, wo eine Anweisung erwartet wird. Mit begin-end lautet die Syntax also

Code:
if <bedingung> then
begin
  <anweisung>; <anweisung>; ... ; <anweisung>
end
else
begin
  <anweisung>; <anweisung>; ... ; <anweisung>
end

Natürlich können die Anweisungen aber auch selbst wieder if-then-else sein. Das einzige, worauf man dabei achten muss, ist, dass es dabei theoretisch eine Mehrdeutigkeit gibt:

Code:
if <bedingung> then
  if <bedingung> then
    <anweisung>
  else
    <anweisung>

Gehört das else zum ersten oder zum zweiten if? Beides ist theoretisch möglich, diese Mehrdeutigkeit wird praktisch durch die Festlegung aufgelöst, dass ein else immer zum direkt vorangegangenen if gehört (also schon so,wie ich es eingerückt habe).
 
chris*,
vielen Dank für die schnelle und hilfreiche Antwort.

Ich habe meinen Code noch einmal geprüft, jedoch erhalte ich immer noch eine Fehlermeldung:

unbenannt.pas(33,3) Error: Can't create object file: unbenannt.exe
unbenannt.pas(33,3) Fatal: Can't create executable unbenannt.exe

Hier der dazugehörige Code:

Code:
program unbenannt;

var i:boolean;
a: integer;

BEGIN {1}
i:= true;
if (i = true) then
begin {2}
  a :=2;
  a :=2
end {2}
else
  begin {3}
    if (i = true) then
    Begin {4}
    a :=2;
      a :=2
    end {4}
    else
    Begin {5}
      if (i = true) then
      Begin {6}
        a :=2;
        a :=2
        end {6}
        else
        a :=2;
        write (a)
      end  {5}
    end{3}
end. {1}

Hier das ganze noch einmal etwas abstrakter:

Code:
BEGIN {1}

if  <bedingung> then
begin {2}
  <anweisung>;
  <anweisung>
end {2}
else
  begin {3}
    if  <bedingung> then
    Begin {4}
      <anweisung>;
      <anweisung>
    end {4}
    else
    Begin {5}
      if  <bedingung> then
      Begin {6}
      <anweisung>;
      <anweisung>
        end {6}
        else
        <anweisung>;
        <anweisung>
      end  {5}
    end{3}

  end. {1}

Wo liegt hier mein Denkfehler?
 
Ich habe meinen Code noch einmal geprüft, jedoch erhalte ich immer noch eine Fehlermeldung:

unbenannt.pas(33,3) Error: Can't create object file: unbenannt.exe
unbenannt.pas(33,3) Fatal: Can't create executable unbenannt.exe
Ist das alles? Das ist ja sehr nichtssagend. Wenn da nicht noch was vorher kommt, klingt es fast so, als hättest du in dem Verzeichnis, wo die exe erstellt wird, keine Schreibrechte. Funktioniert ein einfaches Hello World Programm?

Der Code ist zwar teils ein bisschen komisch eingerückt, aber anscheinend syntaktisch korrekt.
 
es lag an den Schreibrechten, ich hatte geany nicht als admin gestartet.
Danach hat er mir keinerlei fehler mehr gebracht.
Allerdings habe ich jetzt den "echten" Code eingefügt und bekomme nun die Meldung:

kleingeld2.pas(49,4) Fatal: Syntax error, ";" expected but "." found

Es handelt sich hier um die letzte Zeile im Programm:

Code:
Program Kleingeld (input,output); { Kleingeldrechner liefert die minimale Münzanzahl für den eingegebenen Betrag}

Var

eingabe,
geld50,
geld20,
geld10,
geld5,
geld2,
geld1: real;

Begin

read(eingabe); {Eingabe des Betrages welcher gewechselt werden soll.}
geld50:=0;
geld20:=0;
geld10:=0;
geld5:=0;
geld2:=0;
geld1:=0;

BEGIN {1}

if (eingabe >= 0.5) then
Begin {2}
  eingabe:= eingabe -0.5;
  geld50:= 1
End {2}
else
  Begin {3}
    if (eingabe >= 0.4) then
    Begin {4}
      geld20:= 1;
      eingabe:= eingabe -0.4
    End {4}
    else
    Begin {5}
      if (eingabe >= 0.2) then
      Begin {6}
        geld20:= 1;
        eingabe:= eingabe -0.2
        End {6}
        else

        write('Sie erhalten folgendes Wechselgeld ',geld50:1:0,' ',geld20:1:0,' ',geld10:1:0,' ',geld5:1:0,' ',geld2:1:0,' ',geld1:1:0,'')
      End  {5}
    End{3}
End. {1} { Auf diese Zeile bezieht sich die Fehlermeldung}
 
Du hast da oben ein begin, zu dem es kein end gibt. Später kommt nochmal ein mit {1} gekennzeichnetes begin, dessen Sinn ich jetzt nicht so richtig einordnen kann. Vielleicht sollte das weg.

Noch ein paar Tipps:
Rücke entsprechend der Blockstruktur ein.
Lass die Klammern um die Bedingung bei if-then weg.
 
Oben