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 pour calculer le jour de naissance


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Programme pour calculer le jour de naissance
    Salut à tous.

    Je débute en C++ et j'ai voulu faire un petit programme pour calculer le jour la semaine de notre naissance, mais il donne de mauvais résultats... Je ne comprends pas ou est le problème.

    J'ai utilisé l'algorithme décrit ici : http://myriade.editions-bordas.fr/eleve/webfm_send/19

    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
    #include <iostream>
    #include <string>
    using namespace std;
     
    int main() {
     
    	int annee, mois, jour;
     
    	cout << "Quel est votre année de naissance ?" << endl;  cin >> annee;
    	cout << endl;
    	cout << "Quel est votre mois de naissance ?" << endl;  cin >> mois;
    	cout << endl;
    	cout << "Quel est votre jour de naissance ?" << endl;  cin >> jour;
    	cout << endl;
     
    	int a (1901 - annee);
    	int q (a/4);
     
    	bool bissextile(0), n;
     
    	if (annee % 4 == 0 && (annee % 100 != 0 || annee % 400 == 0)) bissextile = 1;
     
    		if (mois == 1) n = 0;
    		if (mois == 2) n = 31;
     
    		if (bissextile == 0 && mois == 3) n = 28+31;
    		if (bissextile == 0 && mois == 4) n = 31+28+31;
    		if (bissextile == 0 && mois == 5) n = 30+31+28+31;
    		if (bissextile == 0 && mois == 6) n = 31+30+31+28+31;
    		if (bissextile == 0 && mois == 7) n = 30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 8) n = 31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 9) n = 31+31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 10) n = 30+31+31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 11) n = 31+30+31+31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 12) n = 30+31+30+31+31+30+31+30+31+28+31;
     
    		if (bissextile == 1 && mois == 3) n = 29+31;
    		if (bissextile == 1 && mois == 4) n = 31+29+31;
    		if (bissextile == 1 && mois == 5) n = 30+31+29+31;
    		if (bissextile == 1 && mois == 6) n = 31+30+31+29+31;
    		if (bissextile == 1 && mois == 7) n = 30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 8) n = 31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 9) n = 31+31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 10) n = 30+31+31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 11) n = 31+30+31+31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 12) n = 30+31+30+31+31+30+31+30+31+29+31;
     
    	int s(a + q + n + jour + 1);
    	int r(s % 7);
     
    	string resultat;
     
    		if (r == 0) resultat = "dimanche";
    		if (r == 1) resultat = "lundi";
    		if (r == 2) resultat = "mardi";
    		if (r == 3) resultat = "mercredi";
    		if (r == 4) resultat = "jeundi";
    		if (r == 5) resultat = "vendredi";
    		if (r == 6) resultat = "samedi";
     
     
    	cout << "Vous êtes nés un " << resultat << " !" << endl;
     
     
    return 0;
     
    }

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Plusieurs choses ne vont pas dans ton code (sans parler de l’indentation un peu aléatoire par endroit…).
    Et il est aussi possible de le simplifier

    Oublie ça.
    C’est une mauvaise idée d’importer tout l’espace de nom standard (il contient de nombreux noms très courant, les risques de collisions ne sont pas négligeables). De plus le préfixe a été choisi court pour être facile à taper.
    Et si vraiment tu trouves ça trop long, fait au moins des using ciblé du genre :
    Ça reste plus propre.

    En général, je préfère éviter de déclarer plusieurs variables par ligne, je trouve ça moins lisible (avis personnel) et c’est moins pratique si tu veux changer le type d’une unique variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Quel est votre année de naissance ?" << endl;  cin >> annee;
    De même, toujours pour des raisons de lisibilité, on évite de mettre plusieurs instructions bout à bout sur la même ligne.
    Au passage, ici on peut remplacer std::endl par '\n' (mais tu peux aussi laisser std::endl, je ne veux pas relancer un débat ici )

    Pour les types primitifs, j’ai plutôt l’habitude de voir la syntaxe avec affectation.
    Mais bon, la manière dont tu l’as fait est tout à fait valide donc tu fais comme tu préfères.
    Par contre, il faut récupérer la valeur absolue du résultat (via std::abs) sinon tu vas avoir des soucis par la suite (dans tes if pour déterminer le jour).

    Héhé, voilà le cœur du problème.
    Ici tu déclares n comme un booléen, alors que ça devrait être un entier.
    Déclare n en tant qu’entier, et ton code va fonctionner.
    Au passage, comme bissextile est un booléen, autant l’initialiser à false plutôt que 0 (c’est plus parlant).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (bissextile == 0 && mois == 3) n = 28+31;
    Encore une fois, bissextile est un booléen donc il est plus logique de le comparer contre true ou false plutôt que 0 et 1.

    Sinon, pour ce qui est de la simplification.
    Grâce au pouvoir des maths tu peux remplacer :
    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
    bool bissextile(0), n;
     
    	if (annee % 4 == 0 && (annee % 100 != 0 || annee % 400 == 0)) bissextile = 1;
     
    		if (mois == 1) n = 0;
    		if (mois == 2) n = 31;
     
    		if (bissextile == 0 && mois == 3) n = 28+31;
    		if (bissextile == 0 && mois == 4) n = 31+28+31;
    		if (bissextile == 0 && mois == 5) n = 30+31+28+31;
    		if (bissextile == 0 && mois == 6) n = 31+30+31+28+31;
    		if (bissextile == 0 && mois == 7) n = 30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 8) n = 31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 9) n = 31+31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 10) n = 30+31+31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 11) n = 31+30+31+31+30+31+30+31+28+31;
    		if (bissextile == 0 && mois == 12) n = 30+31+30+31+31+30+31+30+31+28+31;
     
    		if (bissextile == 1 && mois == 3) n = 29+31;
    		if (bissextile == 1 && mois == 4) n = 31+29+31;
    		if (bissextile == 1 && mois == 5) n = 30+31+29+31;
    		if (bissextile == 1 && mois == 6) n = 31+30+31+29+31;
    		if (bissextile == 1 && mois == 7) n = 30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 8) n = 31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 9) n = 31+31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 10) n = 30+31+31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 11) n = 31+30+31+31+30+31+30+31+29+31;
    		if (bissextile == 1 && mois == 12) n = 30+31+30+31+31+30+31+30+31+29+31;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        int correction;
        if (month <= 2)
            correction = 0;
        else if (year%4 == 0 && (year%100 != 0 || year%400 == 0))
            correction = -1;
        else
            correction = -2;
        int n = static_cast<int>(std::floor((367*month - 362) / 12.0)) + correction;

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse grim7reaper !

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Points : 870
    Points
    870
    Par défaut
    De rien

    Si ton problème est résolu, n’oublie pas de passer le sujet en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Python 3.2 programme pour calcul d'une suite
    Par Amnael dans le forum Général Python
    Réponses: 5
    Dernier message: 22/10/2011, 20h53
  2. Réponses: 11
    Dernier message: 19/09/2010, 14h37
  3. programme pour calculer les puissances
    Par zakariaforever dans le forum C#
    Réponses: 2
    Dernier message: 07/03/2010, 19h13
  4. programme pour calculer la date
    Par zoheir13 dans le forum Delphi
    Réponses: 3
    Dernier message: 05/05/2007, 19h33
  5. Recherche langage et logiciel pour programme de calcul
    Par guismoman33 dans le forum Basic
    Réponses: 8
    Dernier message: 01/02/2007, 14h04

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