EMZETT.
Login

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

Kapitel 3 von 8 im Kurs Fortran. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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 verzweigungen

Ausgabe:

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 schleifen

Ausgabe:

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

Hinweis

Die Laufvariable i darf in einer do-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 algorithmen

Ausgabe:

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 case mit Wertlisten und Bereichen
  • do i = von, bis, schritt, do while, Endlosschleife mit exit, cycle für continue
  • Benannte Schleifen (outer: do ... end do outer) erlauben exit outer
  • merge(a, b, bedingung) ist der Ausdrucks-Ersatz für if

Übungsaufgabe

Gib alle Zahlen von 1 bis 30 aus und ersetze Vielfache von 3 durch “Fizz”, von 5 durch “Buzz”.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Datentypen und formatierte Ausgabe

Weiter: Arrays

Alle Kapitel: Fortran im Überblick