Le nombre secret

Cours de programmation séquentielle

Buts

Énoncé

Écrire un programme permettant de jouer au nombre secret. Le but est de faire chercher à l’utilisateur·trice un nombre déterminé aléatoirement par l’ordinateur. Le nombre de coups mis pour trouver la solution sera compté et affiché à la fin de la partie. La borne maximum pour le choix du nombre caché sera demandée à l’utilisateur·trice.

Pour générer des nombres aléatoires, utiliser la fonction rand() qui retourne un nombre aléatoire entre 0 et l’entier maximum (cf. la commande man 3 rand). Pour initialiser le générateur de nombre aléatoire, appeler la fonction srand() qui prend en paramètre un entier non signé (la graine). On peut par exemple passer time(NULL) en paramètre à srand(). L’appel time(NULL) retourne l’horloge système en secondes.

Il est nécessaire d’inclure les bibliothèques suivantes dans le programme:

#include <stdio.h>      /* printf(), scanf() */
#include <stdlib.h>     /* srand(), rand(), RAND_MAX */
#include <time.h>       /* time() */
#include <math.h>       /* log() */

Lors de la compilation, il faut également lier la bibliothèque mathématique en ajoutant l’option -lm à la fin de la commande, après les fichiers sources.

Déroulement du programme

Exercice supplémentaire

Une fois ce qui précède terminé, échangez les rôles!

Écrire un programme où l’ordinateur et l’utilisateur·trice échangent leurs rôles. Afin de signifier à l’ordinateur que le nombre secret est plus grand ou plus petit que sa proposition, l’utilisateur·trice rentre < ou > respectivement et = en cas de victoire de l’ordinateur (il se pourrait que le type char vous soit utile).2 Par exemple, si l’ordinateur propose 12 et que le nombre secret est 20, il faut répondre < (car 12 < 20). Le programme demande d’abord le nombre maximum, comme dans la première partie. Le nombre auquel on pense doit être compris entre 0 et ce maximum, bornes incluses. Implémentez différentes stratégies pour l’ordinateur (recherche exhaustive, bisection, etc.).

L’ordinateur doit pouvoir détecter si vous avez triché! Il y a triche si vos réponses sont contradictoires, c’est-à-dire si plus aucun nombre entre 0 et le maximum ne peut être le nombre secret. Dans ce cas, le programme s’arrête en l’indiquant.

Remarques

Générateur de nombre aléatoire

Afin d’avoir des nombres aléatoires différents à chaque exécution, il faut utiliser la fonction srand() qui vous permet de fixer la graine du générateur de nombres pseudo-aléatoires rand(). Pour plus d’information:

man 3 rand

Boucle infinie

Il se peut que vous décidiez de vérifier les entrées utilisateurs·trices. Pour ce faire, vous utiliserez probablement la fonction scanf(). Lorsque les entrées sont mal formées vous pourriez voir apparaître une boucle infinie. Pour corriger ce problème, vous pouvez utiliser les lignes magiques après avoir appelé la fonction scanf():

int c;
while ((c = getchar()) != '\n' && c != EOF) { }

Voir le lien suivant pour plus d’informations.


  1. Par exemple: “Vous devez entrer un nombre plus grand ou égal à zéro.” ou “Vous devez entrer un nombre plus petit ou égal à ‘max’.”.↩︎

  2. Attention: pour lire un caractère avec scanf(), un espace avant le %c est nécessaire afin d’ignorer les retours à la ligne restants.↩︎