Devinette avec Random

Poster un nouveau sujet   Répondre au sujet

Page 1 sur 2 1, 2  Suivante

Voir le sujet précédent Voir le sujet suivant Aller en bas

Devinette avec Random

Message par methodiX le Jeu 24 Jan - 23:46

Ecrire un programme qui permet de faire deviner un nombre choisi
aléatoirement entre 0 et 100 (fonction
random de la librairie stdlib). le
programme signalera à chaque tentative si le nombre proposé est plus
petit ou plus grand que la solution.


C'est un exercice qui m'a été proposé.
Sami - Methodix, tunis
Le génie de Newton a consisté à dire que la lune tombe alors que tout le monde voit bien qu'elle ne tombe pas.
(Paul Valéry)

methodiX
Admin
Admin

Sexe:Masculin
Messages : 811
Inscrit le : 22 Mar 2007
Localisation : marsa - IPEST

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par mosa le Ven 25 Jan - 0:22

Code:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
      srand(time(NULL));
      int a,b;

a = rand()%100;

printf("deviner la solution");
scanf("%d",&b);

if (a<b)
{printf("ce nombre est plus grand que la silution");}
else
{ if (a>b)
{printf("ce nombre est plus petit que la solution");}}

else{printf("bravo");}


Dernière édition par le Ven 25 Jan - 0:47, édité 6 fois

mosa
Modérateur
Modérateur

Sexe:MasculinScorpionBuffle
Messages : 635
Inscrit le : 11 Nov 2007
Age : 22
Localisation : los angeles

Feuille de personnage
Capacité linguistique:
995/1000  (995/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par Timon le Ven 25 Jan - 0:23

methodiX a écrit:
[...] (fonction random de la librairie stdlib)[...]

Attention, random() n'est pas une fonction standard. Il est préférable d'utiliser rand() (déclarée dans le fichier d'en-tête stdlib.h). Wink

EDIT :
mosa a écrit:
Code:
void main()

La norme n'autorise pas cette écriture.
main() doit renvoyer une valeur de type int. Tout code ne respectant pas cette règle invoque un comportement indéterminé.
Bref, voici les deux signatures reconnues (du moins, tant qu'on veut écrire du code portable) :
Code:
int main(void)
int main(int argc, char **argv)

Timon
Membre important
Membre important

Sexe:Masculin
Messages : 57
Inscrit le : 14 Jan 2008
Localisation : France

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par nabiL le Ven 25 Jan - 8:43

Je te félicite pour ta réponse. Elle est très claire et bien rédigée.
Il manque juste un petit truc, c'est qu'il ne s'agit pas d'une seule tentative proposée par l'utilisateur, mais de plusieurs jusqu'à ce que le nombre secret soit trouvé. Pensez à la boucle While.
Nabil - tunis
خير الناس أنفعهم للناس

nabiL
Admin
Admin

Sexe:Masculin
Messages : 1906
Inscrit le : 19 Mar 2007
Localisation : Tunisie

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par Timon le Ven 25 Jan - 10:21

nabiL a écrit:Je te félicite pour ta réponse. Elle est très claire et bien rédigée.

Merci Smile
Il manque juste un petit truc, c'est qu'il ne s'agit pas d'une seule tentative proposée par l'utilisateur, mais de plusieurs jusqu'à ce que le nombre secret soit trouvé. Pensez à la boucle While.

En effet.
Il faut aussi rappeler que l'énoncé indique :
entre 0 et 100

Donc, en appliquant un modulo 100, la valeur 100 n'a aucune chance d'apparaître :
Code:
rand() % 101

J'ai d'autres remarques mais je vous laisse d'abord terminer votre code. Smile

Timon
Membre important
Membre important

Sexe:Masculin
Messages : 57
Inscrit le : 14 Jan 2008
Localisation : France

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par manianis le Ven 25 Jan - 14:42

Je propose une autre amélioration c'est d'ajouter un score et de permettre aussi à l'ordinateur de deviner un nombre que l'humain cache.

manianis
Admin
Admin

Sexe:Masculin
Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par mosa le Ven 25 Jan - 20:16

Code:

i=0;
do
{
    printf("deviner le nombre");
    scanf("%d",&b);
    i=i+1;}

while(a!=b)


certes, il y a une autre amélioration plus intelligente si à chaque itération on sait si le nombre proposé est plus grand que le nombre secret ou non.

mosa
Modérateur
Modérateur

Sexe:MasculinScorpionBuffle
Messages : 635
Inscrit le : 11 Nov 2007
Age : 22
Localisation : los angeles

Feuille de personnage
Capacité linguistique:
995/1000  (995/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par mosa le Ven 25 Jan - 20:20

manianis a écrit:Je propose une autre amélioration c'est d'ajouter un score et de permettre aussi à l'ordinateur de deviner un nombre que l'humain cache.


j'ai pas encore réfléchi à cette amélioration dans mon essai situé ci-dessus.

mosa
Modérateur
Modérateur

Sexe:MasculinScorpionBuffle
Messages : 635
Inscrit le : 11 Nov 2007
Age : 22
Localisation : los angeles

Feuille de personnage
Capacité linguistique:
995/1000  (995/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par Timon le Ven 25 Jan - 21:10

mosa a écrit:
Code:

i=0;
do
{
    printf("deviner le nombre");
    scanf("%d",&b);
    i=i+1;}

while(a!=b)

C'est (presque) correct si on excuse l'oubli du point-virgule. Il ne reste plus qu'à indiquer à l'utilisateur à chaque itération si la valeur entrée est supérieure ou inférieure à celle attendue.

Cependant, veillez à la présentation de votre code : indentation, nommage, etc.
Plus de détails ici
Code:
compteur = 0;

do
{
  printf("Devinez le nombre secret : ");
  scanf("%d", &valeur_entree);
  compteur = compteur + 1;
}while(valeur_entree != valeur_attendue);

Ensuite, il faut savoir que suivant les implémentations, un appel de printf(), dans lequel ne figure pas le caractère de saut de ligne '\n', peut retarder l'affichage. Il est donc possible que l'utilisateur doive taper quelque chose pour voir enfin s'afficher "Devinez le nombre secret : ".
C'est pourquoi on va forcer l'affichage :
Code:
compteur = 0;

do
{
  printf("Devinez le nombre secret : ");
  fflush(stdout);
  scanf("%d", &valeur_entree);
  compteur = compteur + 1;
}while(valeur_entree != valeur_attendue);

Ainsi, l'affichage se fait au moment voulu, quelle que soit la machine ! Smile

Enfin, je vous déconseille l'usage de scanf() qui n'est réservée qu'à ceux qui ont l'habitude du langage (et du temps à perdre). Si vous vous en sentez le courage, lisez ceci.
Sinon, si vous tenez vraiment à scanf(), la lecture de ce document s'impose.
Wink

Timon
Membre important
Membre important

Sexe:Masculin
Messages : 57
Inscrit le : 14 Jan 2008
Localisation : France

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par mosa le Ven 25 Jan - 21:16

Code:

i=0;
do
{
    printf("deviner le nombre");
    scanf("%d",&b);

if (a>b) {printf("oups, ce nombre est plus petit que la solution");}
else
{ if (a
else{printf("vraiment chapeau to you");}}

i=i+1;}

while(a!=b);


c'est possible?

mosa
Modérateur
Modérateur

Sexe:MasculinScorpionBuffle
Messages : 635
Inscrit le : 11 Nov 2007
Age : 22
Localisation : los angeles

Feuille de personnage
Capacité linguistique:
995/1000  (995/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par Timon le Ven 25 Jan - 21:20

mosa a écrit:c'est possible?

Vous n'avez pas de compilateur à votre disposition pour le vérifier ?

Timon
Membre important
Membre important

Sexe:Masculin
Messages : 57
Inscrit le : 14 Jan 2008
Localisation : France

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par manianis le Ven 25 Jan - 22:36

Je propose une amélioration. L'utilisateur devra deviner en moins de 10 essais.
Code:

int essai=10;
do
{
    printf("deviner le nombre");
    scanf("%d",&b);

if (a>b) {
    printf("oups, ce nombre est plus petit que la solution");
} else if (a < b) {
    printf("oups, ce nombre est plus grand que la solution");
} else {
    printf("vraiment chapeau to you");
}

essai--;
} while(a!=b && essai > 0);

manianis
Admin
Admin

Sexe:Masculin
Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par manianis le Ven 25 Jan - 23:08

Comme tout le monde fait des propositions j'ai moi aussi concotté le programme C++ suivant, l'ordinateur devra deviner en 10 essais maximum :
Code:
#include <iostream>

using namespace std;

int main()
{
    cout << "Sélectionner un nombre entre 0..1000 je vais le deviner en moins de 10 essais." << endl;

    char rep;

    int min,
        max,
        prop,
        essais;

      min = 0; max = 1000; essais = 10;
      do
      {
        prop = (min + max) / 2,
        essais--;
        cout << endl << endl << "Essai : " << (10-essais) << endl;
        cout << "Je propose : " << prop << endl << endl;
        cout << "Que pensez vous." << endl;
        cout << "< : si votre nombre est inférieur à ma proposition" << endl;
        cout << "> : si votre nombre est supérieur à ma proposition" << endl;
        cout << "= : si j'ai trouvé" << endl;

          do {
            cout << "Votre réponse (<, >, =) : " ;
            cin >> rep;
          } while (rep != '<' && rep != '>' && rep != '=');

          if (rep == '<') {
            max = prop-1;
          }
          else if (rep == '>') {
            min = prop+1;
          } else {
            cout << "j'ai trouvé " << prop << " en " << (10-essais) << " essais !" << endl;
          }
        } while (essais > 0 && rep != '=');
        if (rep != '=')
          cout << "Je n'ai pas trouvé votre nombre" << endl;


    return 0;
}

// 835

manianis
Admin
Admin

Sexe:Masculin
Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par methodiX le Ven 25 Jan - 23:10

Bravo manianis !!!
Sami - Methodix, tunis
Le génie de Newton a consisté à dire que la lune tombe alors que tout le monde voit bien qu'elle ne tombe pas.
(Paul Valéry)

methodiX
Admin
Admin

Sexe:Masculin
Messages : 811
Inscrit le : 22 Mar 2007
Localisation : marsa - IPEST

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: Devinette avec Random

Message par Timon le Ven 25 Jan - 23:12

manianis a écrit:Je propose une amélioration. L'utilisateur devra deviner en moins de 10 essais.
Code:

int essai=10;
do
{
    printf("deviner le nombre");
    scanf("%d",&b);

if (a>b) {
    printf("oups, ce nombre est plus petit que la solution");
} else if (a < b) {
    printf("oups, ce nombre est plus grand que la solution");
} else {
    printf("vraiment chapeau to you");
}

essai--;
} while(a!=b && essai > 0);

C'est pas mal mais il reste encore des variables au nom abscons (a et b).
Aussi, j'insiste sur la nécessité de la présence soit de fflush(stdout) soit du caractère '\n'. Voici ce que ce code donne chez moi :
deviner le nombre1
oups, ce nombre est plus petit que la solutiondeviner le nombre2
oups, ce nombre est plus petit que la solutiondeviner le nombre3
oups, ce nombre est plus petit que la solutiondeviner le nombre4
oups, ce nombre est plus petit que la solutiondeviner le nombre5
vraiment chapeau to you

Et enfin, je pense que l'utilisateur apprécierait de voir un petit message de consolation lorsqu'il n'a pas réussi à deviner le nombre secret.
Smile

Timon
Membre important
Membre important

Sexe:Masculin
Messages : 57
Inscrit le : 14 Jan 2008
Localisation : France

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Page 1 sur 2 1, 2  Suivante

Voir le sujet précédent Voir le sujet suivant Revenir en haut


Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum