Suche…


Wenn konstruieren

Das if Konstrukt (in FORTRAN 77 als Block-IF-Anweisung bezeichnet) ist in vielen Programmiersprachen üblich. Es führt bedingt einen Codeblock aus, wenn ein logischer Ausdruck als wahr ausgewertet wird.

[name:] IF (expr) THEN
    block
[ELSE IF (expr) THEN [name]
    block]
[ELSE [name]
   block]
END IF [name]

woher,

  • name - der Name des if-Konstrukts (optional)
  • expr - ein skalarer logischer Ausdruck in Klammern
  • Block - eine Folge von null oder mehr Anweisungen oder Konstrukten

Ein Konstruktname am Anfang einer if then Anweisung muss den gleichen Wert wie der Konstruktname am end if Anweisung haben und sollte für die aktuelle Bereichseinheit eindeutig sein.

In if Anweisungen können (in) Gleichungen und logische Ausdrücke, die eine Anweisung auswerten, mit den folgenden Operatoren verwendet werden:

.LT.  which is <   ! less than
.LE.           <=  ! less than or equal
.GT.           >   ! greater than
.GE.           >=  ! greater than or equal
.EQ.           =   ! equal
.NE.           /=  ! not equal
.AND.              ! logical and
.OR.               ! logical or
.NOT.              ! negation

Beispiele:

! simplest form of if construct
if (a > b) then
    c =  b / 2
end if
!equivalent example with alternate syntax
if(a.gt.b)then
   c=b/2
endif

! named if construct
circle: if (r >= 0) then
    l = 2 * pi * r
end if circle

! complex example with nested if construct
block: if (a < e) then
    if (abs(c - e) <= d) then
        a = a * c
    else
        a = a * d
    end if
else
    a = a * e
end if block

Eine historische Verwendung des if Konstrukts liegt in einer sogenannten "arithmetic if" -Anweisung. Da dies durch modernere Konstruktionen ersetzt werden kann, wird es hier nicht behandelt. Weitere Details finden Sie hier .

SELECT CASE-Konstrukt

Ein select case Konstrukt führt bedingt einen Block von Konstrukten oder Anweisungen aus, abhängig vom Wert eines Skalarausdrucks in einer select case Anweisung. Dieses Kontrollkonstrukt kann als Ersatz für berechnete goto .

[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]
   block]...
[CASE DEFAULT [name]
   block]
END SELECT [name]

woher,

  • name - der Name des select case Konstrukts (optional)
  • expr - ein skalarer Ausdruck vom Typ Ganzzahl, Logisch oder Zeichen (in Klammern eingeschlossen)
  • case-value - Ein oder mehrere Skalarausdrücke für Integer, Logisch oder Zeicheninitialisierung in Klammern
  • Block - eine Folge von null oder mehr Anweisungen oder Konstrukten

Beispiele:

! simplest form of select case construct
select case(i)
case(:-1)
    s = -1
case(0)
    s = 0
case(1:)
    s = 1
case default
    print "Something strange is happened"
end select

In diesem Beispiel (:-1) Fallwert ein Wertebereich passt auf alle Werte kleiner als Null ist , (0) auf Nullen übereinstimmt, und (1:) Streichhölzer auf alle Werte über Null, default beinhaltet Abschnitt , wenn andere Abschnitte haben nicht ausgeführt.

DO-Konstrukt blockieren

Ein do Konstrukt ist ein Schleifenkonstrukt, das eine Anzahl von Iterationen aufweist, die von einer Schleifensteuerung gesteuert werden

integer i
do i=1, 5
  print *, i
end do
print *, i

In der obigen Form durchläuft die Schleifenvariable i die Schleife fünfmal und nimmt wiederum die Werte 1 bis 5 an. Nachdem das Konstrukt abgeschlossen ist, hat die Schleifenvariable den Wert 6, das heißt, die Schleifenvariable wird nach Abschluss der Schleife noch einmal inkrementiert .

Allgemeiner kann das do Schleifenkonstrukt wie folgt verstanden werden

integer i, first, last, step
do i=first, last, step
end do

Die Schleife beginnt mit i mit dem Wert first und erhöht jede Iteration step bis i größer als der last (oder kleiner als der last wenn die Schrittgröße negativ ist).

Es ist wichtig zu beachten, dass seit Fortran 95 die Schleifenvariable und die Schleifensteuerungsausdrücke ganzzahlig sein müssen.

Eine Iteration kann mit der cycle Anweisung vorzeitig beendet werden

do i=1, 5
  if (i==4) cycle
end do

und das gesamte Konstrukt kann die Ausführung mit der exit Anweisung beenden

do i=1, 5
  if (i==4) exit
end do
print *, i

do Konstrukte können benannt werden:

do_name: do i=1, 5
end do do_name

was besonders nützlich ist, wenn verschachtelte do Konstrukte vorhanden sind

do1: do i=1, 5
  do j=1,6
    if (j==3) cycle        ! This cycles the j construct
    if (j==4) cycle        ! This cycles the j construct
    if (i+j==7) cycle do1  ! This cycles the i construct
    if (i*j==15) exit do1  ! This exits the i construct
  end do
end do1

do Konstrukte können auch eine unbestimmte Schleifensteuerung aufweisen, entweder "für immer" oder bis eine bestimmte Bedingung erfüllt ist

integer :: i=0
do
  i=i+1
  if (i==5) exit
end do

oder

integer :: i=0
do while (i<6)
  i=i+1
end do

Dies ermöglicht auch eine unendliche do Schleife über eine .true. Aussage

print *,'forever'
do while(.true.)
  print *,'and ever'
end do

Ein do Konstrukt kann auch die Reihenfolge der Iterationen unbestimmt lassen

do concurrent (i=1:5)
end do

Beachten Sie, dass die Form der Schleifensteuerung dieselbe ist wie bei einer forall Steuerung.

Es gibt verschiedene Einschränkungen für die Anweisungen, die innerhalb des Bereichs eines do concurrent Konstrukts ausgeführt werden können, die sicherstellen sollen, dass keine Datenabhängigkeiten zwischen den Iterationen des Konstrukts bestehen. Diese explizite Angabe durch den Programmierer kann eine stärkere Optimierung (einschließlich Parallelisierung) durch den Compiler ermöglichen, die sonst möglicherweise schwer zu bestimmen ist.

"Private" -Variablen innerhalb einer Interation können durch Verwendung eines block innerhalb von do concurrent :

do concurrent (i=1:5, j=2:7)
  block
    real tempval  ! This is independent across iterations
  end block
end do

Eine andere Form des Block- do Konstrukts verwendet eine beschriftete continue Anweisung anstelle eines end do :

    do 100, i=1, 5
100 continue

Es ist sogar möglich, solche Konstrukte mit einer gemeinsamen Beendigungsanweisung zu verschachteln

    do 100, i=1,5
    do 100, j=1,5
100 continue

Beide Formen und insbesondere die zweite (die veraltet ist) sind aus Gründen der Übersichtlichkeit generell zu vermeiden.


Schließlich gibt es auch einen nicht-Block do konstruieren. Dies gilt auch als veraltet und wird an anderer Stelle zusammen mit Methoden zum Umstrukturieren als Block- do Konstrukt beschrieben.

WO konstruieren

Das where Konstrukt, das ab Fortran90 verfügbar ist, repräsentiert ein maskiertes do Konstrukt. Die Maskierungsanweisung folgt den gleichen Regeln der if Anweisung, wird jedoch auf alle Elemente des angegebenen Arrays angewendet. Durch die Verwendung von where können Operationen an einem Array (oder mehreren Arrays derselben Größe) ausgeführt werden, deren Elemente eine bestimmte Regel erfüllen. Dies kann verwendet werden, um gleichzeitige Operationen mit mehreren Variablen zu vereinfachen.

Syntax:

[name]: where (mask)
    block
[elsewhere (mask)
    block]
[elsewhere
    block]
end where [name]

Hier,

  • name - ist der Name, der dem Block gegeben wurde (falls benannt)
  • Maske - ist ein logischer Ausdruck, der auf alle Elemente angewendet wird
  • Block - Reihe von Befehlen, die ausgeführt werden sollen

Beispiele:

! Example variables
real:: A(5),B(5),C(5)
A = 0.0
B = 1.0
C = [0.0, 4.0, 5.0, 10.0, 0.0]

! Simple where construct use
where (C/=0)
    A=B/C
elsewhere
    A=0.0
end

! Named where construct
Block: where (C/=0)
    A=B/C
elsewhere
    A=0.0
end where Block


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow