수색…


구성

if 구문 (FORTRAN 77의 블록 IF 문이라고 함)은 많은 프로그래밍 언어에서 공통적으로 사용됩니다. 논리적 표현식이 참으로 평가 될 때 코드 블록을 조건부로 실행합니다.

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

어디에,

  • name - if 구조체의 이름 (옵션)
  • expr - 괄호로 묶인 스칼라 논리식
  • 블록 - 0 개 이상의 명령문 또는 구문의 시퀀스

if then .의 시작 부분에있는 구성 이름은 end if .의 구성 이름과 동일한 값을 가져야하며 현재 범위 지정 유니트에 대해 고유해야합니다.

if 문에서, (평등) 평등과 진술을 평가하는 논리 표현식은 다음 연산자와 함께 사용할 수 있습니다.

.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

예 :

! 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

if 구문의 역사적인 사용법은 "산술 if"문에 있습니다. 그러나 이것은 더 현대적인 구조로 대체 될 수 있기 때문에, 여기서 다루지 않습니다. 자세한 내용은 여기 에서 찾을 수 있습니다 .

SELECT CASE 구문

select case 구조는 조건부의 스칼라 식의 값에 따라 구조 또는 명령문 실행 한 블록 select case 문. 이 제어 구조는 계산 된 goto 대체하는 것으로 간주 될 수 있습니다.

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

어디에,

  • name - select case 구조의 이름 (옵션)
  • expr - 정수, 논리 또는 문자 유형의 스칼라 표현식 (괄호로 묶음)
  • case-value - 괄호로 묶인 하나 이상의 스칼라 정수, 논리 또는 문자 초기화 표현식
  • 블록 - 0 개 이상의 명령문 또는 구문의 시퀀스

예 :

! 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

이 예에서 (:-1) 대소 문자 값은 0보다 작은 모든 값과 일치하는 값의 범위이며 (0)(0) 과 일치하고 (1:) 은 0보다 큰 모든 값과 일치하며, default 섹션은 다른 섹션이 수행 한 것과 관련됩니다. 실행되지 않았습니다.

DO 구성 차단

do 구조는 루프 제어에 의해 제어되는 반복 횟수를 갖는 루핑 구조입니다

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

위의 양식에서 루프 변수 i 는 루프를 5 회 통과하며 1에서 5까지의 값을 차례대로 사용합니다. 구문이 완료된 후 루프 변수의 값은 6이됩니다. 즉 루프 변수가 루프 완료 후 다시 한 번 증가합니다 .

보다 일반적으로 do 루프 구조는 다음과 같이 이해할 수 있습니다.

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

루프는 시작 i 값과 first 에 의해 반복 할 때마다 증가시키는 step 까지 i 보다 큰 last (또는 그 미만의 last 스텝 사이즈가 음수 인 경우).

Fortran 95 이후 루프 변수와 루프 제어 표현식은 정수 여야한다는 점에 유의해야합니다.

반복문은 cycle 문으로 너무 일찍 종료 될 수 있습니다.

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

전체 구문은 exit 문을 사용하여 실행을 중단 할 수 있습니다.

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

do 구조체의 이름을 지정할 수 있습니다.

do_name: do i=1, 5
end do do_name

중첩 된 do 구조가있을 때 특히 유용합니다.

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 구조는 또한 "영원히"또는 주어진 조건이 충족 될 때까지 불확정 루프 제어를 가질 수 있습니다

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

또는

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

무한가이 또한 허용 do 비아 루프를 .true. 성명서

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

do 구조는 반복의 순서를 불확실하게 할 수도 있습니다

do concurrent (i=1:5)
end do

루프 제어의 형식이 forall 제어와 동일하다는 것을 알 수 있습니다.

구조의 반복간에 데이터 의존성이 없도록 설계된 do concurrent 구조의 범위 내에서 실행될 수있는 명령문에는 다양한 제한 사항이 있습니다. 프로그래머에 의한이 명시적인 지시는 컴파일러에 의한 더 큰 최적화 (병렬화 포함)를 가능케 할 수 있는데, 이는 컴파일러가 달리 결정하는 것이 어려울 수 있습니다.

interaction 내의 "private"변수는 do concurrent 내부에서 block 구조를 사용하여 구현할 수 있습니다.

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

블록 do 구문의 또 다른 형식은 end do 대신에 continue 라는 명령문을 사용합니다.

    do 100, i=1, 5
100 continue

공유 종료 문을 사용하여 이러한 구문을 중첩 할 수도 있습니다

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

이 두 가지 형태, 특히 둘째 (구식이다)는 일반적으로 명확성을 위해 피해야한다.


마지막으로, non-block do 구조도 있습니다. 이것은 또한 퇴행성 것으로 간주되고, 다른 설명 블록으로 재구성하는 방법과 함께, do 구성.

WHERE 구문

Fortran90 이후 버전에서 사용할 수있는 where 구문은 마스크 된 do 구조를 나타냅니다. masking 문은 if 문과 동일한 규칙을 따르지만 지정된 배열의 모든 요소에 적용됩니다. 하여 where 동작은 어레이 (또는 동일한 크기의 다수의 어레이들)에 대해 수행 될 수 있으며, 요소는 특정 규칙을 만족시킨다. 이것은 여러 변수에 대한 동시 작업을 단순화하는 데 사용할 수 있습니다.

통사론:

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

이리,

  • name - 블록에 주어진 이름입니다 (명명 된 경우).
  • 마스크 - 모든 요소에 적용되는 논리적 표현식입니다.
  • 블록 - 실행될 일련의 명령

예 :

! 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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow