Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] О IF, end IF и CONTINUE


Автор: omican 21.9.2007, 19:13
Вот кусок кода, написанного в древности:

     DO 4 I=I1,N1
         IF(K.EQ.2) FI(I)=Q*(FTD(I+1)-FTD(I))
         S=-1.0D+00
         IF(FI(I).GE.0) S=1.0D+00
         FI(I)=DABS(FI(I))
         IF(I.EQ.I1) THEN    ***
            F3=S*FT(I+1)
            IF(F3.LT.FI(I)) FI(I)=F3
         ELSE IF(I.EQ.N1) THEN
            F1=S*FT(I-1)
            IF(F1.LT.FI(I)) FI(I)=F1
         ELSE
            F1=S*FT(I-1)
            F3=S*FT(I+1)
            IF(F1.LT.FI(I)) FI(I)=F1
            IF(F3.LT.FI(I)) FI(I)=F3
         END IF
         IF(FI(I).LT.0) THEN  *
         FI(I)=0
         ELSE
         FI(I)=S*FI(I)
         END IF
 4    CONTINUE

На строки, не выделенные жирным, обращать внимания не надо. Сейчас я пытаюсь написать на C++ идентичный код.
Итак, вопрос: мне кажется, или не хватает одного "END IF", закрывающего IF, помеченный ***? В каком случае тогда выполняется кусок начинающийся с строки помеченной *? В случае не I.EQ.I1?

Автор: popovda 24.9.2007, 15:49
Код правильный. Все нормально. 
Код

IF(I.EQ.I1) THEN    ***
            F3=S*FT(I+1)
            IF(F3.LT.FI(I)) FI(I)=F3
         ELSE IF(I.EQ.N1) THEN ---- этот if-then-else-end-if фактически один оператор, т.е. else закрывает if-then, а за else выполняется другой оператор. Дополнительный end if с точки зрения F77 - избыточен.

            F1=S*FT(I-1)
            IF(F1.LT.FI(I)) FI(I)=F1
         ELSE
            F1=S*FT(I-1)
            F3=S*FT(I+1)
            IF(F1.LT.FI(I)) FI(I)=F1
            IF(F3.LT.FI(I)) FI(I)=F3
         END IF


Автор: Cr@$h 17.1.2009, 18:03
Если быть строгим, то лучше сказать, что у If есть не только else, но и else if (кажется, их даже вместе можно писать), так что структуризовать лучше даже так:
Код

IF(I.EQ.I1) THEN    ***
    F3=S*FT(I+1)
    IF(F3.LT.FI(I))&
        FI(I)=F3
ELSE IF(I.EQ.N1) THEN
    F1=S*FT(I-1)
    IF(F1.LT.FI(I))&
        FI(I)=F1
ELSE
    F1=S*FT(I-1)
    F3=S*FT(I+1)
    IF(F1.LT.FI(I))&
        FI(I)=F1
    IF(F3.LT.FI(I))&
        FI(I)=F3
END IF

Но это для нас, фортранистов, сишникам это, может, не так легко понять  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)