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 :

Programme de détection du jour de la semaine : problème de calcul


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 58
    Points
    58
    Par défaut Programme de détection du jour de la semaine : problème de calcul
    Bien le bonjour,

    Je vous écris car j'ai un soucis avec un petit programme que je développe, il consiste comme suit :

    Le programme me demande d'entrer une date sous forme jj,mm,aaa et me retourne le jour de la semaine du premier janvier de l'année concernée ainsi que le jour de la semaine de la dite-date donnée, le programme doit fonctionner pour toutes les dates après le 1er janvier 1900.

    Petit hic : J'ai des gros décallages, je pense donc que j'ai du faire une erreur dans mon programme, certainement au niveau des calculs mais je me casse les dents dessus depuis hier matin en vain...

    Si une âme charitable pouvait m'éclairer, merci d'avance

    Je vous poste le code afin que vous puissiez voir ça

    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
     
     
    #include <iostream>
    #include <math.h>
    #include <string.h>
     
    using namespace std;
     
     int annee, mois, jour;
     int jr, bissextile, difference, decalage, choix;
     int somme = 0, total = 0;
     int nom_jr, position, position2;
     char day[2]; 
     char month[2]; 
     char year[4];
     char date[11];
     int tab_aux[12];
     int tab_duree[12]={31,28,31,30,31,30,31,31,30,31,30,31};
     char calendrier[13][10]={"janvier","fevrier","mars","avril","mai","juin",
                                       "juillet","aout","septembre","octobre","novembre","decembre"};
     char semaine[8][10]={"lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"};
     
    int main()
    { 
       cout << "Entrez une date après le premier janvier 1900 sous la forme jj,mm,aaaa" << endl;
       cin >> date;
     
       for(int i = 0; i <= strlen(date); i++)
       {
               if(date[i] == 44) /* ... 44 est le code ASCII de la virgule ',' ... */
                          position = i; /* ... On mémorise l'emplacement de la première virugle ',' ... */
               for(int j = position; j <= strlen(date); j++)
               {
                     if(date[i] == 44) /* ... 44 est le code ASCII de la virgule ',' ... */
                                position2 = i; /* ... On mémorise l'emplacement de la seconde virugle ',' ... */
               }
       }
     
       /* ... On sépare la chaîne de caractères en jour, mois année dans 3 chaînes distinctes ... */
     
       for (int k = 0; k < position; k++)
       {
           day[k] = date[k];
       }
     
       for(int l = position; l < position2; l++)
       {
               month[l-position] = date[l+1];
       }
     
       for(int m = position2; m <= strlen(date); m++)
       {
              year[m-position2] = date[m+1];
       }
     
       /* ... On convertit les chaînes de caractères en entiers ... */
     
       jour = atoi(day);
       mois = atoi(month);
       annee = atoi(year);     
     
    /* ... Savoir si l'annee est bissextile ... */
     
        if((annee - 1900) % 4 == 0) 
               bissextile = 1;
        else
               bissextile = 0;
     
     tab_duree[1] = 28 + bissextile;
     
    /* ... ... */
     
    /* ...  
    Référence choisie : l'année 2000 qui est bissextile et dont le premier 
                      janvier tombait un samedi. 
    ... */
     
     
    /* ...
    Déterminer le jour de la semaine correspondant au premier janvier d'une
               année quelconque après le premier janvier 1900
    ... */
     
      difference = annee - 1900;
      decalage = difference + (difference / 4);      /* ... On tient compte du nombre d'années bissextiles ... */
      jr = (decalage % 7) - 1;                              /* ... Lundi = 1, mardi = 2, etc... Ici le premier janvier 2000 était un samedi donc 6 ... */
      if(jr == 0)
            jr = 7;
      cout << "Le premier janvier de l'annee choisie est un: " << semaine[jr-1] << endl;
     
     
    /* ... 
    Dans la date entrée, compter le nombre de jours écoulés du premier janvier jusqu'au jour 
                de l'année voulu et en déduire alors le jour de la semaine correspondant.   
    ... */
     
     for(int n = 0; n < 12; n++)
       { 
         if(n < mois - 1)
              tab_aux[n] = 1;
         else 
              tab_aux[n] = 0;
       }
     for(int o = 0; o < 12; o++)
             somme = somme + tab_duree[o] * tab_aux[o];    /* ... mois entiers précédant le mois choisi ... */
     
     total = somme + jour - 1;                       
     jr = jr + total % 7;                       
     
     nom_jr = jr % 7;
     
     if(nom_jr == 0)
                    nom_jr = 7;
     
     cout << "La date choisie etait un : " << semaine[nom_jr - 1] << endl;
     
     
     cout << "Voulez-vous continuer sur ce programme ?" << endl << "Si oui tapez 1" << endl << "Si non tapez 0" << endl << endl;
     
     cin >> choix;
     
     switch(choix)
     {
                     case 0:
                          break;
                     case 1:
                          main();
                          break;
     }
     
     
     //system("PAUSE");
     
     
    }


    Merci d'avance à toutes les personnes qui tenteront de me décoincer !

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Je n'ai pas regardé dans le détail mais il y a au moins une anomalie car il n'existe pas de 29 février 1900.
    Les années séculaires autres que les multiples de 400 ne sont pas bissextiles.

    http://fr.wikipedia.org/wiki/Ann%C3%A9e_bissextile

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Cela n'a rien à voir avec le problème mais appeler la fonction "main" dans la fonction "main", c'est pas bien.

    Utilisez une boucle while.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 613
    Points : 30 616
    Points
    30 616
    Par défaut
    Salut,

    Ce que tu devrais déjà faire, c'est essayer de créer un certain nombre de fonctions séparées, de manière à ce que chaque fonction ne s'occupe que d'une seule chose, mais que tu sois sur qu'elle le fasse bien.

    Ensuite, je ne peux m'empêcher de constater que tu mélange allègrement les fichiers d'en-tête issus du C (string.h, par exemple) et ceux issus du C++ (iostream), ce qui fait que tu te retrouve plus ou moins le "cul entre deux chaises" à faire un odieux mélange des deux langages

    Ainsi, l'idéal est très certainement d'utiliser la classe string, disponible (comme tout ce qui est fourni par le standard) dans l'espace de noms std, par simple inclusion du fichier d'en-tête <string> (remarque l'absence d'extension ), et tu pourrais envisager la création des fonctions:
    • bool bissextile(int annee) qui vérifie si l'année passée en paramètre est bissextile
    • int jourParMois(int mois, int annee) qui profite de bissextile pour te renvoyer le nombre de jours que l'on rencontre sur le mois donné, en fonction de l'année
    • bool dateValide(int jour, int mois, int annee) qui profitera avantgeusement de jourParMois pour déterminer si la date introduite est valide
    • int nombreJour(int jour, int mois, int annee)qui profitera (également) de jourParMois afin de déterminer le nombre de jour qui sépare la date indiquée d'une date de référence
    • std::string const jourDeLaSemaine(int jour, int mois, int annee) qui profitera de toutes les autres pour déterminer quel jour de la semaine nous sommes à la date indiquée
    Par exemple, la fonction bissextile pourrait prendre la forme de
    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
    bool bissextile(int annee)
    {
        if(annee%4 == 0) // si l'annee est divisible par 4
        {
            if(annee%100 == 0) // si l'année est divisible par 100
            {
                if(annee%400 == 0) // et qu'elle est divisible par 400
                    return true; 
                else
                    return false;
            }
            // si on arrive ici, elle est divisible par 4 mais pas par 100
            return true;
        }
        // si on arrive ici, l'année n'est déjà pas divisible par 4
        return false;
    }
    ou la fonction jourParMois pourrait ressembler à
    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
    int jourParMois(int mois, int annee)
    {
        /* le nombre de jours des différents mois
         * j'ai mis 0 pour février, car il faut évaluer son nombre de jours
         * en fonction de l'année
         */
        int jours[12]={31,0,31,30,31,30,31,31,30,31,30,31};
        if(mois!=2) // si le mois n'est pas fevrier, on n'a aucun problème
            return jours[mois-1]; // à part le fait que l'index de janvier est 0 et
                                  // que c'est... le premier mois de l'annee
        /* si on arrive ici, c'est que l'on doit renvoyer le nombre de jour de
         * février... on doit donc vérifier si on a affaire à une année bissextile
         */
        if(bissextile(annee)) // si c'est le cas, on renvoie 29 jours
            return 29;
        /* si on arrive ici, l'année n'était pas bissextile, on renvoie dont 
         * 28 jours
         */
        return 28;
    }
    Je vais m'arrêter là, parce que ce serait un bien mauvais service à te rendre que de tout faire pour toi...

    Mais tu sais maintenant les fonctions que tu devrais créer, et ce que tu dois leur demander de faire.

    A toi de jouer
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/05/2011, 09h05
  2. Récuperer le jour de la semaine
    Par BigBeni dans le forum Assembleur
    Réponses: 5
    Dernier message: 05/04/2006, 19h50
  3. [LG]programme détermination du jour de la semaine
    Par flo.baet dans le forum Langage
    Réponses: 15
    Dernier message: 03/04/2005, 18h01
  4. Récupérez premier jour de la semaine
    Par Krapulax dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/10/2003, 17h18
  5. Réponses: 3
    Dernier message: 19/04/2002, 00h11

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