Szukaj…


Jeśli konstrukcja

Konstrukcja if (nazywana blokową instrukcją IF w FORTRAN 77) jest wspólna w wielu językach programowania. Warunkowo wykonuje jeden blok kodu, gdy wyrażenie logiczne jest oceniane jako prawda.

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

gdzie,

  • name - nazwa konstrukcji if (opcjonalnie)
  • expr - skalarne wyrażenie logiczne zamknięte w nawiasach
  • blok - sekwencja zero lub więcej instrukcji lub konstrukcji

Nazwa konstruktu na początku instrukcji if then musi mieć taką samą wartość jak nazwa konstrukcji na end if instrukcji end if i powinna być unikalna dla bieżącej jednostki określania zakresu.

W instrukcjach if , (nie) równości i wyrażenia logiczne oceniające instrukcję mogą być używane z następującymi operatorami:

.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

Przykłady:

! 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

Historyczne użycie konstrukcji if występuje w tak zwanej instrukcji „arytmetyki if”. Ponieważ można to zastąpić bardziej nowoczesnymi konstrukcjami, nie jest to tutaj omówione. Więcej informacji można znaleźć tutaj .

Konstrukcja SELECT CASE

Konstrukcja select case warunkowo wykonuje jeden blok konstrukcji lub instrukcji w zależności od wartości wyrażenia skalarnego w instrukcji select case . Ten konstrukt kontrolny można uznać za zamiennik obliczonego goto .

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

gdzie,

  • name - nazwa konstrukcji select case (opcjonalnie)
  • expr - wyrażenie skalarne typu liczba całkowita, logiczna lub znakowa (ujęte w nawiasy)
  • wielkość liter - co najmniej jedna skalarna liczba całkowita, logiczna lub wyrażenia inicjujące znaki zawarte w nawiasach
  • blok - sekwencja zero lub więcej instrukcji lub konstrukcji

Przykłady:

! 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

W tym przykładzie (:-1) wartość przypadku jest zakresem wartości pasujących do wszystkich wartości mniejszych od zera, (0) dopasowanych do zer, a (1:) pasuje do wszystkich wartości powyżej zera, sekcja default dotyczy sytuacji, gdy inne sekcje nie wykonany.

Konstrukcja bloku DO

do konstruktu zapętlone konstrukt, który ma pewną liczbę iteracji, podlegających kontroli pętli

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

W powyższym formularzu zmienna pętli i przechodzi 5 razy przez pętlę, przyjmując kolejno wartości od 1 do 5. Po zakończeniu konstrukcji zmienna pętli ma wartość 6, co oznacza, że zmienna pętli jest zwiększana jeszcze raz po zakończeniu pętli .

Bardziej ogólnie, do konstruktu pętla może być rozumiana w następujący

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

Pętla zaczyna się od i od wartości first , zwiększając każdą iterację step po stepi będzie większe od last (lub mniejsze niż last jeśli wielkość kroku jest ujemna).

Należy zauważyć, że od Fortran 95 zmienna pętli i wyrażenia kontrolne pętli muszą być liczbami całkowitymi.

Iteracja może zostać zakończona przedwcześnie za pomocą instrukcji cycle

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

a cała konstrukcja może przerwać wykonywanie za pomocą instrukcji exit

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

do konstrukty mogą być nazwane:

do_name: do i=1, 5
end do do_name

która jest szczególnie przydatna, gdy nie są zagnieżdżone do konstrukty

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 konstrukty mogą również mieć nieokreśloną kontrolę pętli, albo „zawsze” lub dopóki dana warunek jest spełniony

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

lub

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

Pozwala to również na nieskończoną pętlę do poprzez .true. komunikat

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

do konstrukt może również zostawić kolejność iteracji nieokreślony

do concurrent (i=1:5)
end do

zauważając, że forma kontroli pętli jest taka sama jak w kontroli forall .

Istnieją różne ograniczenia dotyczące instrukcji, które mogą być wykonywane w zakresie konstruktu do concurrent które są zaprojektowane w celu zapewnienia, że nie ma zależności danych między iteracjami konstrukcji. To wyraźne wskazanie przez programistę może umożliwić większą optymalizację (w tym równoległość) przez kompilator, co może być trudne do ustalenia inaczej.

Zmienne „prywatne” w interakcji mogą być realizowane za pomocą konstrukcji block w ramach do concurrent :

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

Inną formą bloku do zastosowań skonstruować oznaczone continue oświadczenie zamiast end do :

    do 100, i=1, 5
100 continue

Możliwe jest nawet zagnieżdżanie takich konstrukcji za pomocą wspólnej instrukcji zakończenia

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

Zasadniczo należy unikać obu tych form, a zwłaszcza drugiej (która jest przestarzała) w celu zachowania przejrzystości.


Wreszcie istnieje również konstrukcja nie blokowa do . Jest to także uznane za przestarzałe i opisano w innym miejscu , a także sposobami restrukturyzacji jako blok do konstruktu.

GDZIE konstrukcja

where konstrukt dostępne Fortran90 r oznacza zamaskowaną do konstrukt. Instrukcja maskowania podlega tym samym regułom, co instrukcja if , ale jest stosowana do wszystkich elementów danej tablicy. Użycie where pozwala na wykonywanie operacji na tablicy (lub wielu tablicach tego samego rozmiaru), których elementy spełniają określoną regułę. Można to wykorzystać do uproszczenia jednoczesnych operacji na kilku zmiennych.

Składnia:

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

Tutaj,

  • nazwa - to nazwa nadana blokowi (jeśli jest nazwana)
  • maska - jest logicznym wyrażeniem stosowanym do wszystkich elementów
  • blok - seria poleceń do wykonania

Przykłady:

! 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow