IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Calcul du julian day number


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Par défaut Calcul du julian day number
    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

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    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:
    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
    Si une annee est bissextile, il suffit d'ajouter 1 au nombre de jours en fevrier.

    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.

  3. #3
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Par défaut
    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

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Par défaut
    Premièrement, ce n'est pas une subroutine, c est une fonction.
    A ta place, je déclarerais chaque fonction séparément et non pas une fonction dans une autre.
    Citation Envoyé par fatma hamdi Voir le message
    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

  5. #5
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Par défaut
    J'ai essayé et j'ai toujours le même problème

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Citation Envoyé par fatma hamdi Voir le message
    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
    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 :
    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
    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
     
    if (((mod(a,4) == 0) .and. (mod(a,100) /= 0)) .or. (mod(a,400) == 0)) then
    De plus, la fonction principale se termine au CONTAINS. Tu ne dois donc pas insérer de return entre les 2 end function.

    Finalement, une amélioration (à mon goût !) est d'utiliser des logical. Ta fonction bissectile devient alors :
    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
    Dans la fonction principale, tu peux alors faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    if (bissectile(annee)) nb_jour(2)=29
    ...

  7. #7
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Par défaut
    Le nombre d'erreurs s'est réduit mais toujours j'ai l'erreur de syntaxe au niveau de
    bissectile=((mod(a,4) == 0).and.(mod(a,100) /= 0)).or.(mod(a,400) == 0)
    de la fonction bissectile

    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

  8. #8
    Membre expérimenté Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Citation Envoyé par fatma hamdi Voir le message
    le nombre d'erreur c'est reduit mais tjr j'ai l'erreur de syantax au niveau de
    de la fonction bissectile

    et voilà le programme final
    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)

Discussions similaires

  1. Calculer l'indice CDD consecutive dry day
    Par ju_cayenne dans le forum MATLAB
    Réponses: 3
    Dernier message: 20/10/2014, 21h12
  2. [AS2] problème d'utilisation d'une variable number dans un calcul
    Par Mosler dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 12/06/2008, 21h44
  3. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo