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

C Discussion :

Convertisseur de calendrier gréegorien vers musulman


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut Convertisseur de calendrier gréegorien vers musulman
    Bonjour !
    Je suis en train de développer un logiciel permettant de convertir une date provenant d'un calendrier grégorien (le plus commums, celui que vous tous utilisez chaques jours), dans un calendrier musulman. Il faut savoir quelques petits détails sur la différence des deux calendriers avant que je commence à vous présentez mon problème.
    Le calendrier musulman est composé de 12 mois.
    Les mois 1-3-5-7-9-11 sont composés de 30 jours.
    Les mois 2-4-6-8-10 sont composés de 29 jours.
    Pour définir le nombre de jours du 12ième mois, il existe un cycle de 30 ans. Ce cycle débute au début du calendrier musulman (sois l'équivalent de notre 9 septembre 622). En gros, les années (musulmanes) qui sont divisibles par 30 (sans reste dans la division) définisse le début d'un cycle.
    Sur ce cycle de 30 ans, les années 2-5-7-10-13-16-18-21-24-26-29 ont leur 12ième mois composés de 30 jours.
    Les années 1-3-4-6-8-9-11-12-14-15-17-19-20-22-23-25-27-28 ont leur 12ième mois composés de 29 jours.
    Pour infos : Une année musulman est plus courte d'en moyenne 11 jours par rapport a une année grégorienne (en moyenne 354,37 jours musulman contre 365,2425 jours grégorien)

    Voila toutes les infos à savoir, c'est un peu casse tête je l'avoue, mais la mesure du temps n'est jamais facile xD

    Donc j'ai réussi dans mon logiciel à convertir les années, et le jour (ce module n'est par contre pas intégré dans le code ci dessous, car ici on en aura pas besoin).

    Le principe de mes calculs est simple : je convertis la date grégorienne en nombre de jours total grégorien (que j'ai appelé x dans mon code), et qu'ensuite je convertis en nombre de jour musulman (qui est définis par x-227180.835 avec 227180.835 le nombre de jours grégoriens correspond au début du calendrier musulman, sois le 9 septembre 622.

    J'ai appelé annee29 les années du cycle ayant 29jours le 12ième mois, et anne30e les années du cycle ayant 30 jours le 12ième mois.
    m1,m2,m3...mx,m12 correspond au nom des mois (pour nous simplifier la vie ^^).
    Un cycle est ainsi définit par cycle=annee29*19 + annee30*11.

    Alors mon problème est simple. J'ai créé une boucle dont je prédéfinis le nombre de boucle. Le début correspond au premier cycle, et se termine au dernier cycle connu de la date que l'utilisateur entre. J'incrémente un cycle+30 annees jusqu'à ma limite (le nombre de cycle totaux existant étant définis par ((x-227180.835)/(354.37))/30 (sachant qu'une année musulmane compte en moyenne 354.37 jours.)

    Mon problème est maintenant simple, comment faire pour savoir à quel moment du cycle (le mois) le décompte vas s'arrété?
    Je n'arrive pas à trouver de solution pour faire le compte de l'ensemble de mes mois, et puis s'arrété au mois correspondant à ma limite de temps? (la limite etant le nombre de jours totaux musulmans comptés au debut par(x-227180.835).

    Je pensé faire une boucle qui a chaque boucle me compte un cycle, et dans la boucle mettre le contenu du cycle, c'est à dire la succession des mois. Et lorsque mon cycle s'arrête, il s'arrête au mois voulu (en prenant en compte le nombre de jours de chaque mois). Mais je pense pas que c'est la bonne solution vu que j'arrive à rien, et à côté je ne vois pas vraiment comment le faire d'autre. Si vous avez des idées !
    Je vous poste la partie de mon code où je bloque (j'ai laissé la conversion des années pour donner un point de repère, sachant que le premier cycle du calendrier musulman débute le 09/09/622 et finis le 09/09/652.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
    int main()
    {
     
        fflush(stdin);
        int jour,mois,annee,y,nbf,anneem,moism;
        int annee29,annee30,mois29,mois30,cycle,cyclef,nb_cycle,cyclec,cyclei;
        int m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13;
        float x,u;
        char jourm;
     
     
        do
        {
                       system("cls");fflush(stdin);
                       printf("Veuillez entrer une date Gregorienne sous la forme suivante : (jj/mm/aaaa)\n>> ");
                       scanf("%d/%d/%d",&jour,&mois,&annee);
     
                       if((annee%4==0&&annee%100!=0) || (annee%400==0)) nbf=29;
                       else nbf=28;
     
                       if(mois==02&&jour>nbf)y=0; 
                       else y=1;
     
        }while(jour<1 || jour>31 || mois<1 || mois>12 || y==0);
     
      switch (mois)
                           {
                           case 1:x=jour+(annee*365.2425)+251;break;
                           case 2:x=(31+jour)+(annee*365.2425)+251;break;
                           case 3:x=(31+nbf+jour)+(annee*365.2425)+251;break;
                           case 4:x=(62+nbf+jour)+(annee*365.2425)+251;break;
                           case 5:x=(92+nbf+jour)+(annee*365.2425)+251;break;
                           case 6:x=(123+nbf+jour)+(annee*365.2425)+251;break;
                           case 7:x=(153+nbf+jour)+(annee*365.2425)+251;break;
                           case 8:x=(184+nbf+jour)+(annee*365.2425)+251;break;
                           case 9:x=(214+nbf+jour)+(annee*365.2425)+251;break;
                           case 10:x=(245+nbf+jour)+(annee*365.2425)+251;break;
                           case 11:x=(275+nbf+jour)+(annee*365.2425)+251;break;
                           case 12:x=(306+nbf+jour)+(annee*365.2425)+251;break;
                           default:printf("Mois invalide");break;
                           }
     
                           anneem=(x-227180.835)/354.37;
                           printf("Annee musulmane:%d\n\n",anneem);
     
          m1=m3=m5=m7=m9=m11=mois30=30;
          m2=m4=m6=m8=m10=mois29=29;
     
     
          nb_cycle=((x-227180.835)/(354.37))/30;
     
          annee29=m2+m4+m6+m8+m10+mois29;
          annee30=m1+m3+m5+m7+m9+m11+mois30;
     
          cycle=annee29*19 + annee30*11;
     
     
          for(cyclei=0; cyclei>=nb_cycle ; cyclei=cyclei+30)
          {
     
     
     
     
                }
     
          printf("cycle= %d\n\n",cyclef);
     
    system("pause");
    return 0;
    }

    Merci pour vos aides !
    Cordialement,

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Soa,

    Pour convertir des dates de calendrier à calendrier, cherche du côté de

    Algorithme de D.A. Hatcher.


  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Je viens de trouver un document d'une trentaine de page dessus. Je m'y plonge immédiatement et vous donne des nouvelles si j'arrive à trouver une solution =)
    En attendant, je ne crache pas sur d'autres idées ^^

    Merci de ta réponse droggo

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Joa,

    Une solution est d'utiliser les Jours Juliens :

    Pour les 2 calendriers à gérer, on crée la transformation

    calendrier <==> Jour Julien

    et on peut ainsi facilement passer d'un à l'autre.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Par défaut
    Salut

    J'ai eu le même problème que toi, et finalement j'y suis parvenue en convertissant la date du calendrier grégorien en jour julien. Il existe une formule mathématique qui permet la conversion des deux calendriers a partir du jour julien la voici :
    //Calendrier hégirien
    jd(jour julien), ah(année hégire), mh(mois hégire), jh(jour hégire):
    z=jd+0.5;
    ah=(z*30-58442554)/10631;
    r=(ah*10631+58442583);
    rb=r/30;
    rbis=z-rb;
    mh=(rbis*11+330)/325;
    rr=rbis-(mh*325-320)/11;
    jh=rr+1;

    Ciao !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Mais ça dépend de quelle façon tu définis le jour julien de la date grégorienne.
    Pour ma part, l'ajout de ton module ne fonctionne pas.

    La définition du jour julien dans mon code est ;

    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
      /*definition des valeurs*/
        y=4716;
        m=3;
        n=12;
        /* ------- */
        p=1461;
        r=4;
        q=0;
        j=1401;
        s=153;
        t=2;
        u=5;
        /*fin definition des valeurs*/
     
     
                   /* calcul du jour julien*/
        YF=Y+y-(n+m-1-M)/n;
     
        MF=(M-m+n)%n;
     
        DF=D-1;
     
        jj=(p*YF+q)/r+(s*MF+t)/u+DF-j;
                /*fin du calcul du jour julien*/
    Sachant que la définition des valeurs sont spécifiques au calendrier Gregorien.
    Les formules qui suivent sont universelles, il suffit de changer la définition des valeurs pour changer de calendrier de départ.
    Avec la valeur du jour julien (jj) que je trouve, je ne peux pas convertir du calendrier grégorien à l'hégirien.

    Peux tu me dire comment ton 'j' de départ est calculé?

    Cordialement,

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8
    Par défaut jour et mois affichage faut
    Citation Envoyé par Infosams Voir le message
    Salut

    J'ai eu le même problème que toi, et finalement j'y suis parvenue en convertissant la date du calendrier grégorien en jour julien. Il existe une formule mathématique qui permet la conversion des deux calendriers a partir du jour julien la voici :
    //Calendrier hégirien
    jd(jour julien), ah(année hégire), mh(mois hégire), jh(jour hégire):
    z=jd+0.5;
    ah=(z*30-58442554)/10631;
    r=(ah*10631+58442583);
    rb=r/30;
    rbis=z-rb;
    mh=(rbis*11+330)/325;
    rr=rbis-(mh*325-320)/11;
    jh=rr+1;

    Ciao !
    Bonjour Infosams,
    Date grégorienne.
    11.08.2010
    jd(jour julien)
    2455419.5
    J'ai refait ton module, seul l'année est juste.

    ah(année hégire)
    1431
    Impossible pour le jour et le mois.
    Est ce que la transposition du copier /coller introduit une erreur.

    mh(mois hégire)
    0.982666667

    jh(jour hégire)
    0.090909091

    Merci pour ta futur réponse

Discussions similaires

  1. [SP-2010] Migration Calendrier SP2007 vers SP 2010
    Par Montagna73 dans le forum SharePoint
    Réponses: 1
    Dernier message: 30/01/2011, 15h14
  2. Réponses: 0
    Dernier message: 22/04/2010, 10h02
  3. Partage de calendrier 2k7 vers 2k3
    Par DeeVoiD dans le forum Outlook
    Réponses: 3
    Dernier message: 07/01/2010, 17h49
  4. [OL-2003] Copie automatique d'un calendrier partagé vers mes calendriers
    Par cybersnake dans le forum VBA Outlook
    Réponses: 3
    Dernier message: 31/08/2009, 09h29
  5. convertisseur de classe C++ vers classe Java ?
    Par novice12 dans le forum C++
    Réponses: 3
    Dernier message: 16/12/2004, 21h37

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