Fortran
Kontrola wykonania
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 step
aż i
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