salut,
je veux faire une fonction qui calcule l'ordre du jour (julian day number) à partir de la date
par exemple le 14 janvier 2008 correspond au num 14
le 3 mars 2008 correspond au num 63 ( car février cette est de 29 jours)
merci
salut,
je veux faire une fonction qui calcule l'ordre du jour (julian day number) à partir de la date
par exemple le 14 janvier 2008 correspond au num 14
le 3 mars 2008 correspond au num 63 ( car février cette est de 29 jours)
merci
C'est assez trivial. A toi de faire le code. Tu peux le poster ici si tu as des problemes.
Pour les annees bissextiles dans le calendrier gregorien, l'algorithme est:
Si une annee est bissextile, il suffit d'ajouter 1 au nombre de jours en fevrier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (annee modulo 4 is 0) and (annee modulo 100 is not 0) or (annee modulo 400 is 0) then bissextile else non-bissextile
Pour le numero du jour dans l'annee, il suffit d'additionner le nombre de jours des mois precedent le mois voulu, puis d'additionner le nombre de jours ecoules dans le mois voulu.
j'ai ecrit cette subroutine mais elle ne marche pas
je sais pas pourquoi?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 INTEGER function julain_day_number(jour,mois,annee) !tableau qui contient le nombre de jour pour chaque mois de l'année integer,dimension(12)::nb_jour integer ::jour,mois,annee,x !vérifier si l'année est bssectile nb_jour = (/31,28,31,30,31,30,31,31,30,31,30,31/) if (bissectile(annee).eq.1) then nb_jour(2)=29 end if x=jour do i=1,mois-1 x=x+nb_jour(i) end do julian_day_number=x !declaration de la fonction bissectile CONTAINS integer function bissectile(a) integer a if (annee modulo 4 is 0) and (annee modulo 100 is not 0) or (annee modulo 400 is 0) then bissextile=1 else bissextile=0 end if return end function bissectile return end function julain_day_number
J'ai essayé et j'ai toujours le même problème
La principale raison est que ce n'est pas tout à fait du Fortran. Les lignes que t'a fournies DaZumba sont en pseudo language. Elles devraient s'écrire :
Comme je ne me souviens jamais des priorités entre le .and. et le .or., j'ajouterais des parenthèses :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if ((mod(a,4) == 0) .and. (mod(a,100) /= 0) .or. (mod(a,400) == 0)) then bissextile=1 else bissextile=0 end if
De plus, la fonction principale se termine au CONTAINS. Tu ne dois donc pas insérer de return entre les 2 end function.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (((mod(a,4) == 0) .and. (mod(a,100) /= 0)) .or. (mod(a,400) == 0)) then
Finalement, une amélioration (à mon goût !) est d'utiliser des logical. Ta fonction bissectile devient alors :
Dans la fonction principale, tu peux alors faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 logical function bissectile(a) integer a bissectile = ((mod(a,4) == 0) .and. (mod(a,100) /= 0)) .or. (mod(a,400) == 0) end function bissectile
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ... if (bissectile(annee)) nb_jour(2)=29 ...
Le nombre d'erreurs s'est réduit mais toujours j'ai l'erreur de syntaxe au niveau dede la fonction bissectilebissectile=((mod(a,4) == 0).and.(mod(a,100) /= 0)).or.(mod(a,400) == 0)
et voilà le programme final
INTEGER function julain_day_number(jour,mois,annee)
!tableau qui contient le nombre de jour pour chaque mois de l'année
integer,dimension(12)::nb_jour
integer ::jour,mois,annee,x
!vérifier si l'année est bssectile
nb_jour = (/31,28,31,30,31,30,31,31,30,31,30,31/)
if (bissectile(annee)) nb_jour(2)=29
x=jour
do i=1,mois-1
x=x+nb_jour(i)
end do
julian_day_number=x
!declaration de la fonction bissectile
CONTAINS
logical function bissectile(a)
integer a
bissectile=((mod(a,4) == 0).and.(mod(a,100) /= 0)).or.(mod(a,400) == 0)
end function bissectile
end function julain_day_number
Il y a (au moins) 1 chose qui ne va pas (d'où l'intérêt de implicit none)
Le nom de la fonction est julain_day_number (julain pas julian)
alors que l'affectation finale se fait à julian_day_number
En corrigeant çà, je n'ai pas d'erreur de compilation
(sous openuse 10.3 avec gfortran)
Partager