Sunday, December 24, 2017

Aflarea poziției zilei în an

Aflarea poziției zilei în an este un bun exercițiu pentru a inițializa un vector la definire și pentru a face calcule cu elementele sale. Ziua din an se dă sub forma ZI, LUNA, ANUL, fiecare fiind variabile de tip întreg. În FORTRAN există posibilitatea de a face acestă definire a tipurilor de date IMPLICIT. Algoritmul este simplu și presupune însumarea zilelor din lunile ce preced luna din data introdusă pe cartelă. Se verifică dacă anul este bisect pentru a aduna în loc de 28 de zile pentru februarie, 29.Subprogramul returnează IK=1 dacă s-a calculat poziția din an și IK=0 dacă din cauză că datele sunt greșite nu s-a calculat această poziție. Prin dată greșită se înțelege că luna nu este un număr întreg pozitiv mai mic strict decât 13, că ziua nu este un număr întreg strict pozitiv mai mic decât 32 și despre an că nu este un număr întreg strict pozitiv.
Subprogramul arată astfel:

           SUBROUTINE (ZI,LUNA,AN, IPOZ, IK)
           DIMENSION X(12) /31,28,31,30,31,30,31,31,30,31,30,31/
           IK=0
           IF(AN.LE.0) GO TO 30
           IF((LUNA.LE.0).OR.(LUNA.GT.12)) GO TO 30
           IF((ZI.LE.0).OR.(ZI.GT.31)) GO TO 30
           IK=1
           IPOZ=1
           ALFA=MOD(AN,4)
           IF(ALFA.EQ.0) GOTO 10
           IPOZ=0
10       DO 20 I=1,LUNA-1
20       IPOZ=IPOZ+X(I)
           IPOZ=IPOZ+X(LUNA)
30       CONTINUE
           RETURN
           STOP
           
Dacă la Compilatorul FORTRAN IV este implementată facilitatea de a avea în lista de apel a funcțiilor încorporate alte apeluri de funcții, expresia:
           IPOZ=IPOZ+X(LUNA)
s-ar fi scris:
           IPOZ=IPOZ+X(LUNA)+NOD(NOD(AN,2),2)
și nu ar mai fi fost nevoie secvența:
           IPOZ=1
           ALFA=MOD(AN,4)
           IF(ALFA.EQ.0) GOTO 10
           IPOZ=0
Neavând la dispoziție acum un compilator de FIRTRAN IV, evident nu am cum să testez această facilitate, dar așa cum sunt prezentate funcții nu-mi crează senzația că ar accepta, deși tabelul dă senzația prin modul în care este definită funcția MOD().
Aflarea poziției zilei în an este un exercițiu interesant, dar și mai interesant este de văzut care sunt diferențele față de implementarea în limbajul C++ unde definirea ZI, LUNĂ, AN se face așa cum suntem obișnuiți în scrierea curentă zz.ll.yyyy, existând posibilitatea de tratare șiruri de caractere și de conversii.


(24 decembrie 2017)

No comments:

Post a Comment