Fortran
Utförande kontroll
Sök…
Om konstruera
if
konstruktionen (kallas ett block-IF-uttalande i FORTRAN 77) är vanligt på många programmeringsspråk. Den kör villkorligt ett blockkod när ett logiskt uttryck utvärderas till sant.
[name:] IF (expr) THEN
block
[ELSE IF (expr) THEN [name]
block]
[ELSE [name]
block]
END IF [name]
var,
- namn - namnet på if-konstruktionen (valfritt)
- expr - ett skalärt logiskt uttryck inneslutet inom parentes
- block - en sekvens med noll eller fler uttalanden eller konstruktioner
Ett konstruktionsnamn i början av ett if then
uttalande måste ha samma värde som konstruktionsnamnet i end if
uttalande, och det bör vara unikt för den nuvarande scoping-enheten.
if
uttalanden, (i) likheter och logiska uttryck som utvärderar ett uttalande kan användas med följande operatörer:
.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
Exempel:
! 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
En historisk användning av if
konstruktionen är i det som kallas ett "aritmetiskt if-uttalande". Eftersom detta kan ersättas med mer moderna konstruktioner, omfattas det inte här. Mer information finns här .
VÄLJ CASE-konstruktion
En select case
fallkonstruktion kör villkorligt ett block av konstruktioner eller uttalanden beroende på värdet på ett skalärt uttryck i ett select case
fallförklaring. Denna kontrollkonstruktion kan betraktas som en ersättning för beräknad goto
.
[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]
block]...
[CASE DEFAULT [name]
block]
END SELECT [name]
var,
- namn - namnet på det
select case
(valfritt) - expr - ett skalärt uttryck av typ heltal, logisk eller karaktär (medföljande parenteser)
- case-värde - ett eller flera skalar med heltal, logiska eller teckeninitieringsuttryck som är inneslutna inom parentes
- block - en sekvens med noll eller fler uttalanden eller konstruktioner
Exempel:
! 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
I detta exempel är (:-1)
ärendevärde ett intervall av värden som matchar alla värden mindre än noll, (0)
matchar till nollor, och (1:)
matchar alla värden över noll, default
innebär att andra avsnitt gjorde inte avrättad.
Blockera DO konstruera
En do
konstruktion är en slingkonstruktion som har ett antal iterationer som styrs av en slingkontroll
integer i
do i=1, 5
print *, i
end do
print *, i
I formen ovan passerar slingvariabeln i
genom slingan 5 gånger och tar värdena 1 till 5 i tur och ordning. Efter att konstruktionen har slutfört har loopvariabeln värdet 6, det vill säga, loopvariabeln ökas ytterligare en gång efter slutförandet av slingan .
Mer generellt kan do
loop-konstruktionen förstås enligt följande
integer i, first, last, step
do i=first, last, step
end do
Slingan börjar med i
med värdet first
och ökar varje iteration för step
tills i
är större än last
(eller mindre än last
om stegstorleken är negativ).
Det är viktigt att notera att eftersom Fortran 95 måste slingvariabeln och slingkontrolluttryck vara heltal.
En iteration kan avslutas för tidigt med cycle
do i=1, 5
if (i==4) cycle
end do
och hela konstruktionen kan upphöra med exekveringen med exit
do i=1, 5
if (i==4) exit
end do
print *, i
do
konstruktioner kan namnges:
do_name: do i=1, 5
end do do_name
som är särskilt användbar när det finns kapslade do
-konstruktioner
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
konstruktioner kan också ha obestämd slingkontroll, antingen "för alltid" eller tills ett givet villkor är uppfylld
integer :: i=0
do
i=i+1
if (i==5) exit
end do
eller
integer :: i=0
do while (i<6)
i=i+1
end do
Detta möjliggör också en oändlig do
loop via en .true.
påstående
print *,'forever'
do while(.true.)
print *,'and ever'
end do
En do
konstruktion kan också lämna storleken på iterationer obestämda
do concurrent (i=1:5)
end do
att notera att formen för slingkontroll är densamma som i en forall
.
Det finns olika begränsningar för påståenden som kan exekveras inom området för en do concurrent
konstruktion som är utformad för att säkerställa att det inte finns några databeroende mellan iterationer av konstruktionen. Denna explicita indikation från programmeraren kan möjliggöra större optimering (inklusive parallellisering) av kompilatorn, vilket kan vara svårt att bestämma något annat.
"Privata" -variabler inom en interation kan realiseras genom användning av en block
inom do concurrent
:
do concurrent (i=1:5, j=2:7)
block
real tempval ! This is independent across iterations
end block
end do
En annan form av blocket do
construct använder ett märkt continue
istället för ett end do
:
do 100, i=1, 5
100 continue
Det är till och med möjligt att häcka sådana konstruktioner med en delad uppsägning
do 100, i=1,5
do 100, j=1,5
100 continue
Båda dessa former, och särskilt den andra (som är föråldrad), ska i allmänhet undvikas för tydlighetens intresse.
Slutligen finns det också en icke-blocket do
konstruktion. Detta anses också vara föråldrat och beskrivs på annat håll , tillsammans med metoder för omstrukturering som ett block do
construct.
VAR konstruerar
Den where
konstruktionen, tillgänglig i Fortran90 och framåt, representerar en maskerad do
konstruktion. Maskeringsuppdraget följer samma regler för if
uttalandet, men tillämpas på alla element i den givna arrayen. Med användning av where
kan man utföra operationer på en matris (eller flera matriser av samma storlek) vars element uppfyller en viss regel. Detta kan användas för att förenkla samtidiga operationer på flera variabler.
Syntax:
[name]: where (mask)
block
[elsewhere (mask)
block]
[elsewhere
block]
end where [name]
Här,
- namn - är namnet som ges till blocket (om det heter)
- mask - är ett logiskt uttryck som tillämpas på alla element
- block - serie kommandon som ska köras
Exempel:
! 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