Aller au contenu

Exercices d'entraînement

Les exercices de cette page vont vous amener à programmer, puis à améliorer le jeu du « Plus ou Moins ».

Conseils habituels

Ces exercices doivent être utilisés pour vous entraîner à programmer. Ils sont généralement accompagnés d'aide et de leur solution pour vous permettre de progresser.

Avant de vous précipiter sur ces solutions dès la première difficulté, n'oubliez pas les conseils suivants :

  • Avez-vous bien fait un schéma au brouillon pour visualiser le problème posé ?
  • Avez-vous essayé de rédiger un algorithme en français, avec vos propres mots, avant de vous lancer dans la programmation sur machine ?
  • Avez-vous utilisé des affichages intermédiaires, des print(), pour visualiser au fur et à mesure le contenu des variables ?
  • Avez-vous testé le programme avec les propositions de tests donnés dans l'exercice ?
  • Avez-vous testé le programme avec de nouveaux tests, différents de ceux proposés ?
Rappels
  • Chaque programme Python doit être sauvegardé sous forme de fichier texte avec l'extension .py.
    Enregistrez ce fichier dans le dossier [G04_Dichotomie] avec le nom donné à l'exercice : ProgG04.61.py, ProgG04.62.py, etc...
  • Pour exécuter ce programme, il suffit de le sauvegarder puis d'appuyer sur la touche [F5].
  • Le programme principal doit contenir un appel au module doctest :
    ##----- Programme principal et tests -----##
    if __name__ == '__main__':
        import doctest
        doctest.testmod()
    

ProgG04.61 - Programmer le « Plus ou Moins ? »

Copiez/collez et compléter les codes des fonctions reponse() et jeu() pour obtenir un jeu du « Plus ou Moins ? » où l'utilisateur cherche la valeur d'un entier aléatoire compris entre mini et maxi.

 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
from random import randint

def reponse(prop, nb):
    """
    prop - entier correspondant à la proposition du joueur
    nb - entier correspondant au nombre cherché
    Sortie: string - 'Bravo', 'Plus' ou 'Moins' selon les comparaisons entre prop et nb
    """
    if prop == nb:
        return ...
    elif ...:
        return ...
    ...


def jeu(mini, maxi):
    """
    mini, maxi - entiers entre lesquels le nombre est cherché
    Sortie: str - chaîne de caractères donnant le nombre cherché et le nombre de coups nécessaires pour le trouver
    """
    nb_a_trouver = ...
    prop = int(input(f"Entrez un nombre compris entre {mini} et {maxi} : "))
    nb_prop = 1
    print(reponse(prop, nb_a_trouver))
    while ...
        ...
        ...
        ...
    return ...

Exécutez ensuite la fonction jeu() pour tester votre programme et vérifier qu'il renvoie un texte indiquant le nombre à trouver ainsi que le nombre de propositions effectuées.

Exemple d'interaction

>>> jeu(0, 100)
Entrez un nombre compris entre 0 et 100 : 50
Moins
Entrez un nombre compris entre 0 et 100 : 25
Plus
Entrez un nombre compris entre 0 et 100 : 37
Plus
Entrez un nombre compris entre 0 et 100 : 43
Plus
Entrez un nombre compris entre 0 et 100 : 46
Moins
Entrez un nombre compris entre 0 et 100 : 44
Plus
Entrez un nombre compris entre 0 et 100 : 45
Bravo
'Le nombre à trouver était 45. Il vous a fallu 7 propositions.'
Une solution
 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
from random import randint

def reponse(prop, nb):
    """
    prop - entier correspondant à la proposition du joueur
    nb - entier correspondant au nombre cherché
    Sortie: string - 'Bravo', 'Plus' ou 'Moins' selon les comparaisons entre prop et nb
    """
    if prop == nb:
        return 'Bravo'
    elif prop < nb:
        return 'Plus'
    else:
        return 'Moins'


def jeu(mini, maxi):
    """
    mini, maxi - entiers entre lesquels le nombre est cherché
    Sortie: str - chaîne de caractères donnant le nombre cherché et le nombre de coups nécessaires pour le trouver
    """
    nb_a_trouver = randint(mini, maxi)
    prop = int(input(f"Entrez un nombre compris entre {mini} et {maxi} : "))
    nb_prop = 1
    print(reponse(prop, nb_a_trouver))
    while reponse(prop, nb_a_trouver) != 'Bravo':
        nb_prop += 1
        prop = int(input(f"Entrez un nombre compris entre {mini} et {maxi} : "))
        print(reponse(prop, nb_a_trouver))
    return f"Le nombre à trouver était {nb_a_trouver}. Il vous a fallu {nb_prop} propositions."

ProgG04.62 - Même chose, en « trichant »

Préambule

Jouez au jeu du « Plus ou Moins ? » ci-dessous, en cherchant un entier aléatoire compris entre 1 et 100.
Effectuez plusieurs parties. Que pouvez-vous constater ?

À vous

Copiez/collez et compléter le code de la fonction jeu_avec_triche() pour obtenir un jeu du « Plus ou Moins ? » où l'utilisateur cherche la valeur d'un entier aléatoire compris entre mini et maxi.

Il faut programmer la fonction pour que le nombre cherché soit cohérent avec les propositions de l'utilisateur mais qu'il faille à cet utilisateur le maximum d'essai possible dans le cas d'une recherche par dichotomie.

1
2
3
4
5
6
7
8
9
def jeu_avec_triche(mini, maxi):
    """
    mini, maxi - entiers entre lesquels le nombre est cherché
    Sortie: string - chaîne de caractères donnant le nombre cherché et le nombre de coups nécessaires pour le trouver
            La fonction est programmée de sorte que l'utilisateur utilise un
            maximum d'essai pour trouver le nombre avec un algorithme par dichotomie
            tout en restant cohérente avec les propositions de l'utilisateur
    """
    pass

Exemple d'interaction

>>> jeu_avec_triche(0, 100)
Entrez un nombre compris entre 0 et 100 : 50
Plus
Entrez un nombre compris entre 0 et 100 : 75
Moins
Entrez un nombre compris entre 0 et 100 : 62
Plus
Entrez un nombre compris entre 0 et 100 : 68
Plus
Entrez un nombre compris entre 0 et 100 : 71
Plus
Entrez un nombre compris entre 0 et 100 : 73
Moins
Entrez un nombre compris entre 0 et 100 : 72
'Le nombre à trouver était 72. Il vous a fallu 7 propositions'
Une solution
 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
from random import randint

def jeu_avec_triche(mini, maxi):
    """
    mini, maxi - entiers entre lesquels le nombre est cherché
    Sortie: string - chaîne de caractères donnant le nombre cherché et le nombre de coups nécessaires pour le trouver
            La fonction est programmée de sorte que l'utilisateur utilise un
            maximum d'essai pour trouver le nombre avec un algorithme par dichotomie
            tout en restant cohérente avec les propositions de l'utilisateur
    """
    borne_inf, borne_sup = mini, maxi
    prop = int(input(f"Entrez un nombre compris entre {borne_inf} et {borne_sup} : "))
    nb_prop = 1
    while maxi-mini >= 1:
        if maxi-prop < prop-mini:
            print('Moins')
            maxi = prop-1
        elif maxi-prop > prop-mini:
            print('Plus')
            mini = prop+1
        elif randint(0, 1) == 0:
            print('Moins')
            maxi = prop-1
        else:
            print('Plus')
            mini = prop+1
        prop = int(input(f"Entrez un nombre compris entre {borne_inf} et {borne_sup} : "))
        nb_prop += 1
    return f"Le nombre à trouver était {mini}. Il vous a fallu {nb_prop} propositions."