vekoros | Salut !
c'est mon premier post sur le forum. Je suis étudiant en DUT Informatique en 1ère année. J'aurai besoin d'un petit peu d'aide ! Au niveau des tableaux en C++, il y a quelque chose dans le programme que je dois faire que je ne comprends pas.
En gros, mon programme doit être le suivant : l'utilisateur rentre une date (il rentre le jour dans une première variable, puis le mois, puis l'année), et le programme doit dire de quel jour de la semaine il s'agit. Par exemple, le 31/12/2003 est le jour 3. 0 correspond à Lundi, 2 à mardi, etc... jusqu'à 6 qui correspond au dimanche.
Pour ce faire, j'ai l'aide suivante : on doit saisir une date postérieure au 1/1/2000. Et le 1/1/2000 est le jour 5, donc un samedi.
J'ai fait mon programme en utilisant 3 procédures. Voici le code :
Programme principal
Code :
- #include <iostream>
- using namespace std;
- int main()
- {
- int jour, mois, annee, num = 0;
- void SaisieDate(int& jour, int& mois, int& annee);
- void ControleFev(int jour, int mois, int annee, bool& fin);
- void JourSem(int jour, int mois, int annee, int& num);
- bool continu = true; // declaration d'un booleen utilisé dans la procedure de controle du mois de fevrier
- // ce booleen devient faux lorsqu'une date rentree au niveau du mois de fevrier est invalide
- // exemple : le 30 fevrier 2016 n'existe pas
- // procedure de controle des saisies de la date
- SaisieDate(jour, mois, annee);
- // procedure de controle du mois de fevrier dans le cas d'annees bissextiles
- ControleFev(jour, mois, annee, continu);
- if (continu) // booleen de contrôle du mois de février : si il est vrai, l'annee n'est pas bissextile
- {
- // procedure pour trouver le jour
- JourSem(jour, mois, annee, num);
- cout << "Le " << jour << "/" << mois << "/" << annee << " est le jour " << num << "." << endl;
- }
- system("PAUSE" );
- return 0;
- }
|
Procédure de saisie de la date
Code :
- #include <iostream>
- using namespace std;
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- //
- // PROCEDURE DE SAISIE ET DE CONTROLE DE LA DATE
- // Entree : rien
- // Sortie : le jour, le mois, l'annee saisie stockés dans 3 variables jour, mois, annee
- // Note: des boucles de controles sont utilisées afin de vérifier que la date est valide
- // le cas de février est traité dans une autre procédure
- //
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- void SaisieDate(int& jour, int& mois, int& annee)
- {
- cout << "Entrez une date posterieure au 1/1/2000." << endl;
- // Contrôle des saisies
- do
- {
- cout << "Saisir le jour : ";
- cin >> jour;
- cout << endl;
- } while (jour <= 0 || jour >= 32);
- do
- {
- cout << "Saisir le mois : ";
- cin >> mois;
- cout << endl;
- } while (mois <= 0 || mois >= 13);
- do
- {
- cout << "Saisir l'annee : ";
- cin >> annee;
- cout << endl;
- } while (annee < 2000);
- }
|
Procédure de contrôle au niveau du mois de février
Code :
- #include <iostream>
- using namespace std;
- ///////////////////////////////////////////////////////////////////
- //
- // PROCEDURE DE CONTROLE DU MOIS DE FEVRIER (ANNEE BISSEXTILE OU NON)
- // Entree : les dates saisies
- // Sortie : booleen devenant faux si la date rentrée de février est invalide
- //
- //////////////////////////////////////////////////////////////////
- void ControleFev(int jour, int mois, int annee, bool& continu)
- {
- // ANNEE BISSEXTILE
- if (((annee % 4 == 0) && (annee % 100 != 0)) || (annee % 400 == 0))
- {
- cout << "L'annee " << annee << " est bissextile ! " << endl;
- if (mois == 2) // FEVRIER
- {
- if (jour > 29)
- {
- cout << "Le " << jour << "/" << mois << "/" << annee << " est invalide." << endl;
- continu = false;
- }
- }
- }
- else // ANNEE NON BISSEXTILE
- {
- if (mois == 2) // FEVRIER
- {
- if (jour > 28)
- {
- cout << "Le " << jour << "/" << mois << "/" << annee << " est invalide." << endl;
- continu = false;
- }
- }
- }
- }
|
Procédure de calcul du jour de la semaine
Code :
- #include <iostream>
- using namespace std;
- void JourSem(int jour, int mois, int annee, int& num)
- {
- int Jour[200000];
- int Mois[12]{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- int Num[7]{ 0, 1, 2, 3, 4, 5, 6 };
- int i, p, c, b, d, e, f;
- int div;
- if (((annee % 4 == 0) && (annee % 100 != 0)) || (annee % 400 == 0))
- {
- Mois[1] = 29;
- }
- else
- {
- Mois[1] = 28;
- }
- p = 0;
- Jour[p] = 0;
- i = annee - 2000;
- while (Jour[p] < (365 * i))
- {
- Jour[p+1] = p + 1;
- p = p + 1;
- }
- div = ((annee - 2000) / 4);
- c = 1;
- while (c < div)
- {
- Jour[p + 1] = p + 1;
- p = p + 1;
- }
- b = mois - 1;
- d = 0;
- while (d < b)
- {
- e = 0;
- for (Mois[d] = 1; Mois[d] < Mois[e]; Mois[d]++)
- {
- Jour[p + 1] = p + 1;
- p = p + 1;
- }
- e = e + 1;
- d = d + 1;
- }
- f = 1;
- while (f < jour)
- {
- Jour[p + 1] = p + 1;
- p = p + 1;
- }
- if (((Jour[p] % 7) == 0) || (Jour[p] == 1))
- {
- num = 5;
- }
- else
- {
- if (((Jour[p] % 7) == 1) || (Jour[p] == 2))
- {
- num = 6;
- }
- else
- {
- if (((Jour[p]) % 7 == 2) || (Jour[p] == 3))
- {
- num = 0;
- }
- else
- {
- if (((Jour[p]) % 7 == 3) || (Jour[p] == 4))
- {
- num = 1;
- }
- else
- {
- if (((Jour[p]) % 7 == 4) || (Jour[p] == 5))
- {
- num = 2;
- }
- else
- {
- if (((Jour[p]) % 7 == 5) || (Jour[p] == 6))
- {
- num = 3;
- }
- else
- {
- if (((Jour[p]) % 7 == 6) || (Jour[p] == 7))
- {
- num = 4;
- }
- }
- }
- }
- }
- }
- }
- }
|
Mon problème se situe plutôt au niveau de la dernière procédure, celle du calcul du jour de la semaine. J'ai décidé de déclarer un tableau assez grand, et d'attribuer un numéro à chaque jour, jusqu'au jour saisi. Ensuite, je regarde la divisibilité de ce nombre par 7, et j'en déduis le numéro du jour.
Le truc c'est que ça marche pour le 1/1/2000, mais dès que j'essaie le 2/1/2000 j'ai un debug error... Et pas la peine de parler d'un jour en 2001, le programme cesse tout bonnement de fonctionner...
J'ai l'impression que l'erreur se situe au niveau du tableau Jour[P]. Est-ce véritablement comme ça qu'on doit utiliser un tableau ? Ma méthode est-elle adéquate ? Qu'ai-je fait de mal ?
Si quelqu'un pourrait éclairer ma lanterne, ce serait vraiment sympa...
En tout cas, merci par avance !
EDIT : désolé, j'ai mis des balises spoiler pour que ce soit un peu moins chiant, mais ça n'a pas l'air de fonctionner... |