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 :

Blocage sur un exercice du livre de Bjarne Stroustrup


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 182
    Points : 61
    Points
    61
    Par défaut Blocage sur un exercice du livre de Bjarne Stroustrup
    Bonjour à toutes et tous .

    Le but de l'exercice :
    Réaliser un programme qui trouve un nombre pensé entre 1 à 100 en sept questions :
    Question du programme :
    (Le nombre auquel vous pensez est inférieur à 50.)

    Je suis complétement perdu ..

    D'avance merci .
    Cordialement.

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    C'est un exercice pour vous faire comprendre le principe de la dichotomie

    Exemple pour trouver 6 (entre 1 et 10).

    Est-ce que le nombre est inférieure à 5 ? Non
    Est-ce que le nombre est inférieure à 7 ? Oui
    Est-ce que le nombre est inférieure à 6 ? Non

    Le nombre est 6.

  3. #3
    Membre régulier Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    Février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 43
    Points : 71
    Points
    71
    Par défaut
    Trademark a raison, c'est le principe de la dichotomie qu'il faut utiliser: à chaque étape, on coupe en deux parties (pas forcément égales) un espace de recherche qui devient restreint à l'une de ces deux parties.

    Le nombre maximal M de questions à poser afin d'obtenir la réponse est la valeur du premier exposant entier de 2 supérieur ou égal au nombre N de réponses possibles, ou encore M est le premier entier supérieur ou égal au logarithme en base 2 de N.

    le premier exposant de 2 supérieur à 100 est 128, soit 2^7, il faut donc un maximum M = 7 essais

    ainsi si une personne choisi le nombre 46, les questions seront:

    - est-ce que le nombre est supérieur à 50 ?
    réponse = non
    - est-ce que le nombre est supérieur à 25 ?
    réponse = oui
    - est-ce que le nombre est supérieur à 37 ?
    réponse = oui
    - est-ce que le nombre est supérieur à 43 ?
    réponse = oui
    - est-ce que le nombre est supérieur à 47 ?
    réponse = non
    - est-ce que le nombre est supérieur à 45 ?
    réponse = oui
    - est-ce que le nombre est 46 ?
    réponse = oui

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 182
    Points : 61
    Points
    61
    Par défaut Blocage exercice livre Bjarne Stroustrup
    Bonjour à toutes et tous .

    @aslo92 , Trademark , Merci pour vos réponses .

    C'était bien ce que je pensais avoir compris .

    J'essaye d'écrire le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "std_lib_facilities.h"
     
    int main()
    {
        int debut = 0,fin = 100 ;
     
        int mil = (debut+(fin-debut)/2);
        cout << "Le nombre auquel vous pensez est inférieur à " << mil << "?";
        cin >> mil;
        vector <int> tb (0,100) ;
        int t ;
        while (cin>>mil)
        mil.push_back(tb);
    }
    C'est un début , qui ne fonctionne pas .
    Sauriez-vous m'indiquer mes erreurs ..

    Merci .
    Cordialement.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Pourquoi utiliser un vector pour récupérer des données de l'utilisateur et... ne rien en faire ?

    L'exercice consiste à afficher la valeur pensée ((borne sup + borne inf) / 2) et demander à l'utilisateur s'il est inférieur ou non, puis changer la borne correspondante.
    Rien de tout cela n'apparait dans ton 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
    int main()
    {
     int inf = 0, sup = 100;
     int iTry = 0;
     char yes_no;
     bool ok = false;
     do {
        // afficher les questions ici, et gérer les réponses
        std::cin>>yes_no;
        ++iTry;
        if (yes_no == 'y')
            ok = true;
     } while (!ok && iTry < 7);
     return 0;
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre régulier Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    Février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 43
    Points : 71
    Points
    71
    Par défaut
    voici le code qui fait ce que tu veux.
    Dans le tien il manque une boucle.

    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
     
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        int  debut = 0;
        int  fin   = 100 ;
        int  ok    = 0;
     
        do
        {
            int mil = (debut + (fin - debut) / 2);
     
            std::cout << "Le nombre auquel vous pensez est-il inférieur à " << mil << " ?";
     
            char yes_no;
            std::cin >> yes_no;
     
            if (yes_no == 'y')
               fin = mil;
            else
               debut = mil;
     
            if (debut == fin - 1)
            {
               ok = 1;
               if (yes_no == 'y')
                   std::cout << "Le nombre auquel vous pensez est " << debut << endl;
               else
                   std::cout << "Le nombre auquel vous pensez est " << fin << endl;
            }
        }
        while (ok == 0);
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 182
    Points : 61
    Points
    61
    Par défaut Blocage exercice livre Bjarne Stroustrup
    Bonjour à toutes et tous .

    Merci pour vos réponses .@aslo92 , @Bousk .

    Alors je parviens à obtenir une partie du résultat escompté :

    L'invite : Le nombre auquel vous pensez est inférieur à 50 s'affiche .
    Si j'écris oui , la question deviens ... est inférieur à 25 , ensuite 12 , 6 , 3 et 0
    Ok .. Mais je ne parviens pas à comprendre pourquoi non n'est pas pris en compte .
    après 25 si j'écris 'non' cela devrait remonter à 37 puis 18 ...etc ..

    Voilà 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
    33
    34
    #include "std_lib_facilities.h"
     
    int main()
    {
        int  debut = 0;
        int  fin   = 100 ;
        int  ok    = 0;
     
        do
        {
            int mil = (debut + (fin - debut) / 2);
     
            cout << "Le nombre auquel vous pensez est-il inférieur à " << mil << " ? \n";
     
            string oui , non ;
            cin >> oui , non ;
     
            if ( oui == oui)
               fin = mil;
            else if (non == non)
             debut = mil +1 ;
     
            if (debut == fin -1)
            {
               ok = 1;
               if (oui == oui)
                   cout << "Le nombre auquel vous pensez est " << (debut) << "  ! \n ";
     
            }
        }
        while (ok == 0);
     
        return 0;
    }
    Si vous pouviez m'expliquer ou je me trompe et pourquoi ... ???
    Pas me donner la solution toute crue ...

    Merci .
    Cordialement.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cin >> oui , non ;
     
            if ( oui == oui)
               fin = mil;
            else if (non == non)
             debut = mil +1 ;
    Honnêtement, je ne sais pas ce que fait ce code (pour la première ligne), mais les if sont juste... cohérents avec ce que tu dis.
    Pourquoi vouloir 2 entrées clavier de l'utilisateur ?
    Tu ne demandes pas oui ou non à l'utilisateur, tu lui demandes une réponse.
    Puis tu vérifies si la réponse vaut oui ou non.

    Là, si tu lis ce que tu écris:
    " si oui vaut oui, alors fin = mil"
    "sinon, si non vaut non, alors fin = mil+1"
    et à quel moment tu t'attends que "quelque chose toujours vraie" soit faux ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            string oui , non ;
            cin >> oui , non ;
    C'est un problème de syntaxe en C++, as-tu vraiment réfléchis à ce que ce code pouvait vouloir dire ? En plus, oui == oui ou non == non sera toujours vrai ! Il n'existe rien qui n'est pas égal à lui-même...

    Fait quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::string reponse;
    std::cin >> reponse;
     
    if(reponse == "oui")
    // ...
    else // Pas besoin de vérifier que c'est "non", c'est censé être forcément le cas.
    // ..
    Par contre, si l'utilisateur entre autre chose que exactement "oui", la réponse sera considérer comme un non.

    Le mieux est d'écrire une fonction qui récupère exactement "oui" ou "non" et redemande à l'utilisateur d'entrer "oui" ou "non" tant que celui-ci ne l'a pas fait exactement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::string saisir_reponse()
    {
      std::string reponse;
      do
      {
       std::cout << "Veuillez saisir une réponse [oui | non] : " ; 
        std::cin >> reponse;
      }while (/* Trouve la condition qui va bien :) */);
      return reponse;
    }
    Tu te simplifieras souvent la vie en découpant ton code en fonction. Dans certain ouvrage, ils conseillent de ne pas faire des fonctions de plus de 5 lignes par exemple. (Y compris la fonction main). D'une manière général c'est souvent bien d'essayer de tendre vers cette règle.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 182
    Points : 61
    Points
    61
    Par défaut Blocage exercice livre Bjarne Stroustrup
    Bonjour à toutes et tous .

    Je pense avoir compris ce que je ne comprends pas ...
    1ère invite : plus petit que cinquante . oui
    2eme : plus petit que vingt-cinq .non . Comment lui dire que 25 est le début et 50 la fin ???

    Cordialement.

  11. #11
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Ça tu le fais déjà...

    A la première saisie tu dois juste dire que 50 est la fin :
    A la deuxième saisie tu recadres en disant que 25 est le début :
    Ahh mais quoi tu n'avais pas compris ton code ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 182
    Points : 61
    Points
    61
    Par défaut Blocage exercice livre Bjarne Stroustrup
    Bonjour à toutes et tous .

    @Trademark . Merci .

    Ahh mais quoi tu n'avais pas compris ton code ?
    Euh .... Si en partie .

    Si je dit oui à la 1ére invite , j'obtiens bien 25 , mais si ensuite , je répond non
    j'obtiens quant même 12 alors que je devrais obtenir 32 ????.
    Je suis vraiment nul car je ne comprend pas mon erreur et ou elle ce situe .

    Je me posais la question de la possible réalisation de l'exercice ...... Sans commentaires .

    Cordialement.

  13. #13
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Quand on y arrive pas, on limite la portée de l'algorithme, càd tu prends un nombre entre 0 et 5 et puis tu suis les étapes de l'algorithme sur un papier en notant les états des variables. Et tu verras bien où ça coince

  14. #14
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Peux-tu nous dire où tu en es dans ton code ? As-tu mis en œuvre les conseils de Trademark ?

    Dans ton code précédent, tu confonds la notion de nom d'une variable avec celle de la valeur de la variable.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 182
    Points : 61
    Points
    61
    Par défaut Blocage exercice livre Bjarne Stroustrup
    Bonsoir à toutes et tous .

    Je cherche depuis plusieurs jours à comprendre l'algorithme de ce "jeu".

    @aslo92 Me la donné , mais je voulais comprendre .

    En fait il ne " fonctionnerait pas avec un string " ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string oui_non  // Cela ne marche pas
    Pourquoi ? ais-je raison ?

    Le code qui fonctionne :
    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
    #include "std_lib_facilities.h"
     
    int main()
    {
        int  debut = 0;
        int  fin   = 100 ;
        int  ok    = 0;
     
        do
        {
            int mil = (debut + (fin - debut) / 2);
     
            cout << "Le nombre auquel vous pensez est-il inférieur à " << mil << " ? \n";
     
     
            char oui_non;
            cin >> oui_non;
     
            if (oui_non == 'y')     // 1ère condition
            fin = mil ;         // La valeur du milieu deviens la valeur de départ
     
            else               // 2ème condition
            debut = mil ;        // Si autre entrée que oui la valeur du milieu deviens celle de fin
     
     
            if ( debut == fin -1)
            {
               ok = 1;
               if (oui_non == 'y')
                   cout << "Le nombre auquel vous pensez est " << debut << "  ! \n ";
    			else 
    				cout << "Le nombre auquel vous pensez est " << fin << " ! \n ";
     
            }
        }
        while (ok == 0);
     
        return 0;
    }
    Cordialement.

    Encore MERCI à vous tous .

  16. #16
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Pourquoi est-ce que ça ne fonctionne pas avec un string ? Quel message d'erreur as-tu ?

    Ensuite tu poses la question :

    Le nombre auquel vous pensez est-il inférieur à n ?

    Si il est inférieur, il n'est pas égal !

    Il faut aussi que tu réfléchisses mieux à la condition de sortie de ta boucle. Est-il vraiment nécessaire de mettre ton if(fin == debut) dans la boucle ? Non car c'est un bloc qui ne sera exécuté que à la fin de ta boucle, donc il est plus naturel de le placer en dehors de ta boucle.

    Ensuite d'autres remarques non sur le fond mais sur la forme :

    1. Le nom de variable "oui_non" laisse à désirer. Si tu attendais un phrase, est-ce que tu donnerais le nom de la phrase attendue à ta variable ?
    2. Il faut que tu indentes correctement ton code au niveau des if-else;
    3. Et finalement, tes commentaires sont inutiles. Première condition, deuxième condition... pourquoi ne pas ré-écrire le code à côté en français tant qu'on y est. Tu peux partir du principe qu'un code avec des noms de variable judicieusement (et assez long) choisi valent tous les commentaires du monde.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 182
    Points : 61
    Points
    61
    Par défaut Blocage exercice livre Bjarne Stroustrup
    Bonjour à toutes et tous .

    @Trademake , merci pour ton aide .

    Donc si je t'écoute , il devrais fonctionner avec un string . Je vais trouver .

    @JolyLoic ,Pour ce qui est de l'écriture de mon code en brouillon sur un papier ....3 blocs rempli .... Et pour le reste , je suis un peu dyslexique ...

    Cordialement.

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Ce n'est pas le fait que ce soit un std::string ou non qui fait que le code marche ou pas.
    C'est ton utilisation du string qui ne doit pas être correcte.

    Cf le code de trademark plus haut qui devrait parfaitement fonctionner.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. besoin d'une correction sur un exercice.
    Par phakso dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 03/03/2006, 11h01
  2. [10g1][OCI][C++][IIS] Blocage sur un update
    Par Herode dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 21/02/2006, 10h32
  3. [c++] second problème avec exercices du livre Big c++
    Par TERRIBLE dans le forum Contribuez
    Réponses: 6
    Dernier message: 06/11/2005, 22h07
  4. Réponses: 4
    Dernier message: 26/10/2005, 00h40

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