Bonjour;
Dans le cadre de mes études, voici l'énoncé d'un exercice que j'ai à faire:
Donnez le jour de semaine d'une date comprise entre le

1er janvier de l'an -2000 au 31 décembre de l'an 4000.

Gérer si possible les différentents calendriers qui

ont été utilisés dans l'hitoire de France.

Voici mon code actuel de calendrier perpétuel en C (de l'an -2000 à 4000): permettant l'affichage du jour de la semaine (lundi, mardi,mercredi...) en fonction de la date, mais il reste perfectible.
En effet, il y a des jours qui n'existent pas comme les 29 févriers des années non bissextiles qui sont affichées. Je voudrais que ces jours ne soient pas affichées (message d'erreur à la place).
Je suis en train de plancher sur le code, si vous avez des solutions ou des astuces ou même des remarques quant à l'analyse, n'hésitez pas à me les communiquer.
Merci.

Voici le code du programme à perfectionner (élimination des jours n'ayant jamais existé comme les 29 févriers des années non bissextiles):

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
 
#include <stdio.h>
#include <stdlib.h>
 
int ansup (int an)
{
	int an_bis, an_nbis;
	an_bis = an_nbis = 0;
 
	while (an >= 2003)
	 {
	 	if ( an%4==0 && an%100!=0 || an%400==0 )
			an_bis+=1;
		else
			an_nbis+=1;
		an--;
	}
 
  		return(an_bis * 366  + an_nbis * 365);  /* c'est le nombre de jours entre le 01/01/2003 et le 01/01 de l'année rentrée */
}
 
int aninf (int an)
{
	int an_bis, an_nbis;
	an_bis = an_nbis = 0;
 
	while (an < 2003)
	{
		if (an%4 == 0 && an%100 !=0 || an%400 == 0)
			an_bis+=1;
		else
			an_nbis+=1;
		an++;
	}
 	return(an_bis * 366 + an_nbis * 365); /* c'est le nombre de jours entre le 01/01 de l'année rentrée et le 01/01/2003 */
}
 
int nb_jr (int mois, int an) /* calcul du nombre de jours passés en fonction de l'année (bissextile ou non) et du mois rentrés */
{
	int bissextile[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
	int n_bissextile[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	int som = 0;
 
	if ( an%4==0 && an%100!=0 || an%400==0 )
	{
		while (mois>0)
		{
			som = som + bissextile[mois-1];
			mois--;
		}
	}
	else
	{
		while (mois>0)
		{
			som = som + n_bissextile[mois-1];
			mois--;
		}
	}
	return som;
}
 
int main ()
{
	int ans, ms, jr, jrs;
	char *jouri[7] = {"mardi", "lundi", "dimanche", "samedi", "vendredi", "jeudi", "mercredi"};
	char *jours[7] = {"mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche", "lundi"};
 
 	printf("rentrer une annee (entre -2000 et 4000) :");
	scanf("%d",&ans);
	printf("\n");
	printf("rentrer un mois (entre 1 et 12) :");
	scanf("%d",&ms);
	printf("\n");
    printf("rentrer un jour (entre 1 et 31) :");
	scanf("%d",&jr);
	printf("\n");
 
    if ((ans >= -2000) && (ans <=4000) && (ms >=1) && (ms<=12) && (jr >=1) && (jr <= 31))
    {
	    if(ans < 2003)   /*si l'année saisie est inférieure à 2003*/
	    {
  		    printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jouri[(aninf (ans) - nb_jr (ms, ans) - jr)%7]);
	    }
	    else if (ans >= 2003) /*si l'année saisie est sup ou égale à 2003*/
	    {
		    if ( ans%4==0 && ans%100!=0 || ans%400==0 )
			    jrs = 366 - nb_jr (ms, ans);
		    else
			    jrs = 365 - nb_jr (ms, ans); /*jrs est le nombre de jours restant de l'année rentrée*/
 
            printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jours[(ansup (ans) - jrs + jr)%7]);
	    }
    }
    else 
    {
    printf ("\n");
    printf ("Erreur de saisie.\n");
    printf ("Saisir obligatoirement une date dont: \n");
    printf ("L'annee varie de -2000 a 4000 inclus.\n");
    printf ("Le mois varie de 1 a 12 inlus.\n");
    printf ("Le jour varie de 1 a 31 inclus.");
    }
	return 0;
}