Zoeken…


Als construct

De if constructie (een block-instructie IF genoemd in FORTRAN 77) is gebruikelijk in veel programmeertalen. Het voert voorwaardelijk één codeblok uit wanneer een logische expressie als waar wordt geëvalueerd.

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

waar,

  • naam - de naam van het if-construct (optioneel)
  • expr - een scalaire logische uitdrukking tussen haakjes
  • block - een reeks van nul of meer statements of constructen

Een constructnaam aan het begin van een if then instructie moet dezelfde waarde hebben als de constructnaam aan het end if instructie en moet uniek zijn voor de huidige scoping-eenheid.

In if statements, (in) gelijkheden en logische expressies die een statement evalueren, kunnen worden gebruikt met de volgende operatoren:

.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

Voorbeelden:

! 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

Een historisch gebruik van het if construct bevindt zich in een zogenaamde "rekenkundige if" -instructie. Aangezien dit kan worden vervangen door modernere constructies, wordt het hier echter niet behandeld. Meer details zijn hier te vinden.

SELECT CASE-constructie

Een select case construct voert voorwaardelijk een blok constructs of statements uit, afhankelijk van de waarde van een scalaire expressie in een select case statement. Dit besturingsconstruct kan worden beschouwd als een vervanging voor berekende goto .

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

waar,

  • naam - de naam van de select case constructie (optioneel)
  • expr - een scalaire uitdrukking van het type geheel getal, logisch of teken (tussen haakjes)
  • case-value - een of meer scalaire integer-, logische of tekeninitialisatie-expressies tussen haakjes
  • block - een reeks van nul of meer statements of constructen

Voorbeelden:

! 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 dit voorbeeld is (:-1) hoofdwaarde een bereik van waarden die overeenkomen met alle waarden kleiner dan nul, (0) overeen met nullen en (1:) overeen met alle waarden boven nul, default houdt in dat andere secties niet uitgevoerd.

Blok DO construct

Een do constructie is een lusconstructie met een aantal iteraties die worden geregeld door een lusregeling

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

In de bovenstaande vorm passeert de lusvariabele i 5 keer de lus, waarbij de waarden 1 tot 5 worden genomen. Nadat het construct is voltooid, heeft de lusvariabele de waarde 6, dat wil zeggen dat de lusvariabele na de voltooiing van de lus nogmaals wordt verhoogd .

Meer in het algemeen kan het do lusconstructie als volgt worden begrepen

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

De lus begint met i met de waarde first , waarbij elke iteratie step wordt verhoogd totdat i groter is dan de last (of kleiner dan de last als de stapgrootte negatief is).

Het is belangrijk op te merken dat sinds Fortran 95 de lusvariabele en de lusbesturingsuitdrukkingen een geheel getal moeten zijn.

Een iteratie kan voortijdig worden beëindigd met het cycle

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

en de hele constructie kan worden gestopt met de exit instructie

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

do constructs kunnen worden genoemd:

do_name: do i=1, 5
end do do_name

hetgeen in het bijzonder nuttig wanneer er geneste do constructen

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 constructen kunnen ook onbepaalde lusbesturing hebben, "voor altijd" of totdat aan een bepaalde voorwaarde is voldaan

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

of

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

Dit maakt ook een oneindige do lus mogelijk via een .true. uitspraak

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

Een do constructie kan ook de volgorde van iteraties onbepaald laten

do concurrent (i=1:5)
end do

waarbij wordt opgemerkt dat de vorm van lusbesturing hetzelfde is als bij een forall besturing.

Er zijn verschillende beperkingen op de instructies die kunnen worden uitgevoerd binnen het bereik van een do concurrent constructie die zijn ontworpen om ervoor te zorgen dat er geen gegevensafhankelijkheid is tussen iteraties van de constructie. Deze expliciete indicatie door de programmeur kan een grotere optimalisatie (inclusief parallellisatie) door de compiler mogelijk maken, hetgeen moeilijk kan zijn om anders te bepalen.

"Particuliere" variabelen binnen een interactie kunnen worden gerealiseerd door gebruik te maken van een block in de do concurrent :

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

Een andere vorm van het block do construct gebruikt een gelabelde continue instructie in plaats van een end do :

    do 100, i=1, 5
100 continue

Het is zelfs mogelijk om dergelijke constructies te nestelen met een gedeelde beëindigingsverklaring

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

Beide vormen, en vooral de tweede (die verouderd is), moeten over het algemeen worden vermeden omwille van de duidelijkheid.


Ten slotte is er ook een non-block do construct. Dit wordt ook geacht te zijn verouderd en elders beschreven , samen met werkwijzen voor het herstructureren als blok do construct.

WAAR construeren

Het where construct, vanaf Fortran90 beschikbaar, vertegenwoordigt een gemaskeerd do construct. De maskeerinstructie volgt dezelfde regels als de if instructie, maar wordt toegepast op alle elementen van de gegeven array. Met behulp van where kunnen bewerkingen worden uitgevoerd op een array (of meerdere arrays van dezelfde grootte), waarvan de elementen voldoen aan een bepaalde regel. Dit kan worden gebruikt om gelijktijdige bewerkingen op verschillende variabelen te vereenvoudigen.

Syntaxis:

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

Hier,

  • naam - is de naam die aan het blok is gegeven (indien benoemd)
  • mask - is een logische uitdrukking die op alle elementen wordt toegepast
  • block - reeks uit te voeren commando's

Voorbeelden:

! 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow