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 ja
Vergleichsoperatoren: ==, /=, <, <=, >, >= (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 23
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 34
Merke
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
Aufgabe
Gib alle Zahlen von 1 bis 30 aus und ersetze Vielfache von 3 durch "Fizz", von 5 durch "Buzz".