! kurze Übersicht über Alternativen in Fortran

program alternativen
    implicit none
    INTEGER :: a = 2, b = 2
    
    ! Alternativen haben im Allgemeinen folgende Form :
    !   IF (bedingung 1) THEN
    !       content
    !   ELSEIF (bedingung 2) THEN
    !       content 2
    !   ELSEIF (bedingung 3) THEN
    !   ...
    !   ELSE
    !       content n
    !   END IF
    !
    ! Dabei können auch die ELSEIF und ELSE Zweige Weggelassen werden
    !
    ! Bei jedem IF/ELSEIF wird geprüft ob die Bedingung wahr ist
    !   wenn ja wird der Content unter dem entsprechenden Zweig ausgeführt,
    !       danach wird NACH dem END IF fortgeführt
    !   wenn nein und danach ein weiterer ELSEIF Zweig existiert 
    !       wird dieser analog überprüft und evtll ausgeführt
    !
    !   wenn alle vorherigen Bedingungen falsch sind, wird der Content
    !       des ELSE-Zweiges ausgeführt, soweit dieser existiert

    ! Bedingungen können u.a. LOGICALS und Vergleiche (siehe unten) sein
    !   Um mehere Bedingungen zu verknüpfen nutze .AND., .OR, .EQV., .NEQV. und .NOT.
    !   Alle logischen Operatoren funktionieren wie bekannt

    !!! es folgen beispiele
    ! a = b = 4

    IF (a == b) THEN  ! == wird zum Vergleich genutzt
        WRITE(*,*) "a und b sind gleich"
    END IF

    WRITE(*,*) ! Leerzeile in Ausgabe

    IF (a + b == 4) THEN
        WRITE(*,*) "a + b ist gleich 4"
    ELSE
        WRITE(*,*) "a + b ist ungleich 4"
    END IF

    WRITE(*,*) ! Leerzeile in Ausgabe

    IF (a + b > 0) THEN     ! > und >= für strikt größer und größer-gleich
        WRITE(*,*) "a + b ist positiv"
    ELSEIF (a + b < 0) THEN ! < und <= für strikt kleiner und kleiner-gleich
        WRITE(*,*) "a + b ist negativ"
    ELSE
        WRITE(*,*) "a + b = 0"
    END IF

    WRITE(*,*) ! Leerzeile in Ausgabe

    ! Falls es keinen ELSE/ELSEIF Zweig gibt und der Content nach IF nur eine Zeile lang ist
    !   kann man die IF Bedingung auch einzeilig schreiben
    ! Dies nutzt man z.B. oft für EXIT-Bedinungen in Schleifen
    !
    ! Die folgenden Altertiven machen also das gleiche

    IF (a /= 0) THEN    ! nutze /= für Ungleich
        WRITE(*,*) "a ist nicht 0"
    END IF

    IF (a /= 0) WRITE(*,*) "a ist nicht 0"

    WRITE(*,*) ! Leerzeile in Ausgabe

    !!! Nisten !!!
    ! Die innere Alternative muss sich komplett in der Äußeren befinden
    ! Beachtet dass sich genistete Bedingungen nicht gegenseitig ausschließen sollten

    IF (a >= b) THEN

        IF (a <= b) THEN
            WRITE(*,*) "a und b sind gleich"
        ELSE
            WRITE(*,*) "a ist strikt kleiner als b"
        END IF

    ELSE
        WRITE(*,*) "a ist strikt größer als b"
    END IF


end program alternativen