Erlaubt die übersichtliche Codierung von Fallunterscheidungen;
Im Unterschied zu IF - THEN - ELSE wird nur ein Ausdruck ausgewertet und
abhängig vom Wert können dann unterschiedliche Anweisungsblöcke ausgeführt
werden.
[name:] SELECT CASE (case_ausdruck)
[CASE (case_bereich) [name]
anweisungen]
...
[CASE DEFAULT [name]
anweisungen]
END SELECT [name]
Der "case_ausdruck" muß ein aufzählbarer Typ sein: INTEGER,
LOGICAL oder CHARACTER;
Der "case_bereich" ist entweder ein Wert oder ein Teilbereich aus dem
Wertebereich von "case_ausdruck":
|
Beispiel: (CASE und Block-IF)
PROGRAM wasserstand
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Programm zur Berechnung der neuen Wasserhoehe in einem Wuerfel nach Ein- !
! tauchen einer Kugel !
! Daten: !
! s Kantenlaenge des Wuerfels !
! h Wasserhoehe im Wuerfel !
! r Radius der Kugel !
! sh Soll-Lage des Kugelmittelpunktes !
! hneu Wasserhoehe nach Eintauchen der Kugel !
! Loesungsweg: !
! 1. Eingabe der notwendigen Daten !
! Plausibilitaetspruefung !
! Beachtung moeglicher Sonderfaelle !
! 2. WENN Sonderfall DANN !
! Sonderfall anzeigen !
! SONST !
! iterative Berechnung der neuen Wasserhoehe !
! Pruefung auf Wasserueberlauf !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
IMPLICIT NONE
PARAMETER (pi = 3.14159)
REAL :: r, s, h, k, sh, hneu
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
schleife: DO
WRITE (*,'(a)',ADVANCE='NO') 'Gib s, h, r, sh ein: '
READ (*,*,IOSTAT = iostat) s, h, r, sh
SELECT CASE (iostat)
CASE (:-1)
EXIT schleife
CASE (1:)
WRITE (*,*) 'keine sinnvolle Eingabe'
CYCLE schleife
CASE DEFAULT ! iostat = 0
IF (s<0 .OR. h<0 .OR. r<0 .OR. sh<0) THEN
WRITE (*,*) 'nur positive Werte eingeben! '
CYCLE schleife
ELSE
IF (sh-r >= h) THEN
WRITE (*,*) 'Kugel taucht nicht ein'
ELSE IF (h > s) THEN
WRITE (*,*) 'Wasserhoehe zu grosz'
ELSE IF (sh < r) THEN
WRITE (*,*) 'Kugel wird zerdrueckt'
ELSE IF (((sh<=s) .AND. (s<2.0*r)) .OR. &
((sh>s) .AND. (s<2.0*sqrt(r**2.-(sh-s)**2.)))) THEN
WRITE (*,*) 'Kugel ist zu grosz'
ELSE
vk = 4./3. * pi * r**3.
IF (sh+r <= h) THEN
hneu = h + vk/s**2.
ELSE
hneu = h
halt = 0.0
DO WHILE (abs(hneu-halt) > 0.00001)
halt = hneu
IF (sh < halt) THEN
k = MAX(0.0,(sh+r) - halt) ! groszer Teil taucht unter
v1 = vk - 1./3. * pi * k**2. * (3.*r - k)
ELSE
k = MAX(0.0,halt - (sh-r)) ! kleiner Teil taucht unter
v1 = 1./3. * pi * k**2. * (3.*r - k)
ENDIF
hneu = h + v1/s**2.
ENDDO
ENDIF
IF (hneu > s) THEN
WRITE (*,*) 'Wasserueberlauf'
ELSE
IF (hneu > sh+r) WRITE (*,*) 'Kugel taucht ganz ein'
WRITE (*,*) 'neuer Wasserstand = ' ,hneu
ENDIF
ENDIF
ENDIF
END SELECT
ENDDO schleife
END PROGRAM wasserstand