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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow