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 :

Problème sur un programme d'âge


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Ynov Aix
    Inscrit en
    Octobre 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ynov Aix
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 1
    Par défaut Problème sur un programme d'âge
    Bonjour je débute le C++, et j'ai comme exercice de demander la date du jour à l'utilisateur et la date de son anniversaire et du lui dire l'age qu'il a en prenant compte de si son anniversaire est passé ou non
    Voici mon code:
    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
     
    #include <iostream>
    using namespace std;
     
    int j, m, a, bd, mb, ab, diff;
     
    int main() {
    	cout << "Quelle est la date du jour ? (jj mm aaaa) > ";
    	cin >> j >> m >> a;
     
    	cout << "Quelle est la date de votre anniversaire ? (jj mm aaaa) > ";
    	cin >> bd >> mb >> ab;
     
    diff = abs(a-ab);
     
    	cout << diff << endl; //Verification (à supprimer)
     
    	if (m > mb & j > bd) {
     
    			cout << "Vous avez " << diff << " ans !";
    }
      else if (m < mb & j < bd){
    	diff--;
    	cout << "Vous avez" << " " << diff << " ans !";
    	}
    	else if (m==mb && j==bd) {
     
    		cout << "Vous avez" << diff << " ans ! Joyeux anniversaire !";
     
    	}
    	return 0;
    }
    Le problème etant qu'il ne rentre jamais dans la boucle if sans que je comprenne pourquoi
    Merci de vôtre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par défaut
    Ne te prends pas le chou

    Converti les 2 dates en temps UNIX (qui sont le nombre de secondes depuis l'EPOCH 1 javanier 1970 minuit), et ensuite c'est trivial

    struct tm (<- lien cplusplus en anglais)

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Pourquoi utiliser & certaines fois et && d'autres fois ?

    Pour rappel :
    - && => https://en.cppreference.com/w/cpp/la...erator_logical
    - & => https://en.cppreference.com/w/cpp/la...ogic_operators

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Alors, avant de commencer :
    1. Tu vas nous faire le plaisir de virer la directive using namespace std;, car c'est une possibilité qui a été offerte au tout début de la normalisation pour permettre à la base de code qui existait déjà (et qui était déjà importante) de continuer à fonctionner lorsqu'il a été décidé de faire passer la bibliothèque standard dans l'espace de noms std, et qu'on ne peut pas dire que le code écrit aujourd'hui entre dans cette catégorie.
    2. Tu vas nous faire le plaisir de virer ces variables globales, par ce que C'EST MAL : prends plutôt l'habitude de les déclarer au plus près de leur première utilisation
    3. Tu vas -- enfin -- nous faire le plaisir de mettre en place un schéma d'indentation correct, car c'est essentiel à une lecture aisée : tout ce qui se trouve au même niveau (par exemple au niveau 0 d'une fonction) doit se trouver au même niveau d'indentation
    4. Nous ne sommes plus au temps où le moindre caractère coûtait un demi bras : nous pouvons donc utiliser des noms de variables plus longs, qui désignent correctement l'usage auquel on les destine. Que penserais tu de
      • jour au lieu de j
      • mois au lieu de m
      • annee au lieu de a
      • jourAnniversaire au lieu de jb
      • moisAnniversaire au lieu de mb
      • anneeAnniversaire au lieu de ab

      Ne trouves tu pas que cela rend les choses tout de suite plus "faciles à comprendre"


    Maintenant, pour répondre à ta question :

    Dans l'idéal, tu devrais regrouper les données qui vont bien ensembles, qui ne peuvent pas fonctionner les unes sans les autres, au sein d'une structure.

    Tu aurais -- par exemple -- largement intérêt à regrouper les notions de jour, de mois et d'année au sein d'une structure "Date", par exemple.

    Ensuite, la notion de date doit respecter certaines règles :
    • Les mois ne peuvent être compris que entre 1 et douze inclus
    • les jours ne peuvent être comris que entre 1 et 28, 29, 30 ou 31 inclus en fonction du mois et de l'année.
    • certaines années sont "bissextiles", et d'autres ne le sont pas

    Tu devrais donc mettre en place un "système" qui te permettra de vérifier que les dates sont "correctes", et que l'utilisateur n'essaye pas d'introduire -- par exemple 45/19/1980 (j / m /a ), parce que cela ne représente pas une date valide!

    Ensuite, tu dois te dire que l'utilisateur est imbécile distrait, et qu'il n'attend que la moindre possibilité de faire une connerie pour pouvoir la faire:

    si tu lui laisses la possibilité de faire une connerie, ne perd pas ton temps à te demander SI il la fera ou non, car tu peux être certain qu'il la fera forcément un jour ou l'autre.

    Demandes toi tout de suite QUAND il la fera. Seulement, la réponse sera toujours la même : au pire moment qui soit

    Or, un utilisateur ne peut pas "ne pas encore être né" : tu ne peux donc pas avoir une date de naissance qui soit ... postérieure à la date actuelle!!!

    Si c'est le cas, il faudra engueuler l'utilisateur et lui demander de recommencer

    La ligne diff = abs(a-ab); n'a donc aucun sens, car a ne peut pas être plus petit que ab, et que, si c'est le cas, tu auras pris soin d'engueuler l'utilisateur et de lui demander de recommencer

    Pour être précis, tu devras demander à l'utilisateur de recommencer l'introduction des deux dates
    • si l'année de naissance est plus grande que l'année actuelle OU
    • si l'année de naissance est égale à l'année actuelle ET si le mois de naissance est plus grand que le mois actuel OU
    • si l'année de naissance est égale à l'année actuelle ET si le mois de naissance est égal au mois actuel ET si le jour de naissance est plus grand que le mois actuel

    (oufff, nous y sommes arrivés )

    En outre, il faut faire attention : l'opérateur & et l'opérateur && sont deux opérateurs tout à fait différents! : Dans le cas présent, celui que tu dois utiliser, c'est toujours &&.
    [EDIT]En outre, la logique de tes tests est foireuse, car, si tu as -- effectivement -- trois possibilités, mais deux d'entre elles se dérivent en deux possibilités à chaque fois:
    • Soit le jour de naissance et le mois de naissance coincident avec la date actuelle : tu dois souhaiter un joyeux anniversaire
    • soit l'anniversaire de l'utilisateur est déjà passé par rapport à la date actuelle, ce qui revient, si la date du jour est le 4/5/2018 à considérer
      • les 1,2, et 3/5/XX
      • toutes les dates de janvier, février, mars et avril
    • Soit, l'anniversaire de l'utilisateur n'est pas encore passé, ce qui revient, si la date du jour est (toujours) le 4 / 5/2018 à considérer
      • Tous les jours de mais compris entre le 5 et le 31 inclus
      • Toutes les dates de juin, juillet, aout, septembre octobre, novembre et décembre

    En l'état actuel, pour le 4/5/2018 (pour garder la même valeur), tu ne considère que la possibiltié
    • que ce puisse être l'anniversaire de l'utilisateur
    • les dates comprises entre le 5 et le 31 (ou le 30) inclus des mois de juin, juillet, aout, septembre, octobre, novembre et décembre
    • les dates comprises entre le 1 et le 3 inclus pour les mois de janvier, février, mars et avril

    Il semble que ton agenda soit sérieusement trouvé, non
    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

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

Discussions similaires

  1. Petit problème sur petit programme
    Par tamerla dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 19/01/2014, 11h32
  2. [bash] Problème sur un programme en bash
    Par nekcorp dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 22/02/2013, 05h49
  3. Problème sur un programme
    Par Hunshy dans le forum Débuter
    Réponses: 5
    Dernier message: 19/09/2012, 21h33
  4. Débutant en Ruby - Problème sur un programme
    Par Mo0oN dans le forum Ruby
    Réponses: 17
    Dernier message: 16/12/2008, 12h33
  5. Problème sur la commande COPY depuis un programme Java
    Par klereth dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 10/02/2006, 14h14

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