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,
Partager