Kurz: tag = 3 select case (tag) case (1) print *, “Montag” case (2, 3, 4) print *, “Mitte der Woche” case (6:7) print *, “Wochenende” case default print *, “anderer Tag” end select
Teil des Kurses Fortran
if, select case
program verzweigungen
implicit none
integer :: punkte, tag
punkte = 78
if (punkte >= 90) then
print *, "sehr gut"
else if (punkte >= 75) then
print *, "gut"
else
print *, "weiter üben"
end if
if (punkte > 50) print *, "bestanden" ! einzeiliges if
tag = 3
select case (tag)
case (1)
print *, "Montag"
case (2, 3, 4)
print *, "Mitte der Woche"
case (6:7)
print *, "Wochenende"
case default
print *, "anderer Tag"
end select
print *, punkte > 70 .and. punkte < 90, punkte < 0 .or. punkte == 78, .not. (punkte == 0)
print *, merge("ja ", "nein", punkte >= 50) ! Ausdruck wie ein ternärer Operator
end program verzweigungenAusgabe:
gut
bestanden
Mitte der Woche
T T T
jaVergleichsoperatoren: ==, /=, <, <=, >, >= (alt: .eq., .ne., .lt. …). Logik: .and., .or., .not., .eqv., .neqv..
Schleifen
Es gibt eine Hauptschleife: do.
program schleifen
implicit none
integer :: i, n, summe
real :: x
do i = 1, 5
write(*, "(i3)", advance="no") i
end do
print *
do i = 10, 1, -3 ! Schrittweite -3
write(*, "(i3)", advance="no") i
end do
print *
summe = 0
do i = 1, 100
summe = summe + i
end do
print *, "Summe 1..100:", summe
n = 3
do while (n > 0)
write(*, "(i3)", advance="no") n
n = n - 1
end do
print *
i = 0
do ! Endlosschleife mit exit
i = i + 1
if (mod(i, 2) == 0) cycle ! cycle = continue
if (i > 9) exit ! exit = break
write(*, "(i3)", advance="no") i
end do
print *
x = 0.0
do i = 1, 4
x = x + 0.25
end do
print *, x
outer: do i = 1, 3
inner: do n = 1, 3
if (n == 2) cycle inner
if (i == 3) exit outer
write(*, "(i1, i1, a)", advance="no") i, n, " "
end do inner
end do outer
print *
end program schleifenAusgabe:
1 2 3 4 5
10 7 4 1
Summe 1..100: 5050
3 2 1
1 3 5 7 9
1.00000000
11 13 21 23Hinweis
Die Laufvariable
idarf in einerdo-Schleife nicht verändert werden. Gleitkomma-Schleifenvariablen sind in neuen Standards nicht mehr erlaubt; nutze eine Ganzzahl und rechne daraus.
Typische Algorithmen
program algorithmen
implicit none
integer :: n, a, b, t, k, anzahl, i
logical :: prim
! Größter gemeinsamer Teiler (Euklid)
a = 48; b = 18
do while (b /= 0)
t = mod(a, b); a = b; b = t
end do
print *, "ggT:", a
! Primzahlen bis 50
anzahl = 0
do n = 2, 50
prim = .true.
do k = 2, int(sqrt(real(n)))
if (mod(n, k) == 0) then
prim = .false.
exit
end if
end do
if (prim) then
anzahl = anzahl + 1
write(*, "(i3)", advance="no") n
end if
end do
print *
print *, "Anzahl:", anzahl
! Collatz-Folge
n = 27; k = 0
do while (n /= 1)
if (mod(n, 2) == 0) then
n = n / 2
else
n = 3 * n + 1
end if
k = k + 1
end do
print *, "Collatz(27) braucht", k, "Schritte"
! Fibonacci
a = 0; b = 1
do i = 1, 10
write(*, "(i4)", advance="no") a
t = a + b; a = b; b = t
end do
print *
end program algorithmenAusgabe:
ggT: 6
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
Anzahl: 15
Collatz(27) braucht 111 Schritte
0 1 1 2 3 5 8 13 21 34Merke
if ... then / else if / else / end if,select casemit Wertlisten und Bereichendo i = von, bis, schritt,do while, Endlosschleife mitexit,cyclefür continue- Benannte Schleifen (
outer: do ... end do outer) erlaubenexit outer merge(a, b, bedingung)ist der Ausdrucks-Ersatz fürif
Übungsaufgabe
Gib alle Zahlen von 1 bis 30 aus und ersetze Vielfache von 3 durch “Fizz”, von 5 durch “Buzz”.
Quiz zur Selbstkontrolle
Wie bricht man eine do-Schleife vorzeitig ab?
- exit (richtig)
- break
- stop (nur Programm)
- leave
Was bewirkt cycle?
- Springt zum nächsten Schleifendurchlauf (richtig)
- Beendet das Programm
- Startet die Schleife neu
- Wiederholt die Anweisung
Welche Anweisung ersetzt einen switch?
- select case (richtig)
- switch
- choose
- when
Weiter im Kurs
Zurück: Datentypen und formatierte Ausgabe
Weiter: Arrays
Alle Kapitel: Fortran im Überblick