# Examen 2 - 2023

## Exercice 1 : gestion de places disponibles d'un restaurant

### Partie 1

Vous devez créer un programme Python pour gérer les places disponibles dans un restaurant. Le restaurant a une capacité maximale de 50 places.

Le programme doit permettre à l'utilisateur de choisir parmi les options suivantes afin d’utiliser les fonctions décrites par la suite :

1. Occuper des places au restaurant (personnes qui entrent dans le restaurant).
2. Libérer des places au restaurant (personnes qui quittent le restaurant).
3. Quitter le programme.

La proposition et l’exécution de ces choix doit se faire en continu tant que l'utilisateur ne choisit pas de quitter.

Pour les 2 premières fonctions, vous devez d’abord créer un pseudo-code.

1. Créez une fonction qui ajuste le nombre de places disponibles dans le restaurant selon le nombre de personnes qui entrent.&#x20;

   Lorsque les places disponibles du restaurant ne permettent pas d'accueillir toutes les personnes souhaitant entrer, il est essentiel d'informer du nombre de personnes réellement autorisées.&#x20;

   Assurez-vous d’inclure la gestion des exceptions et les vérifications appropriées sur le nombre de personnes et de places disponibles, et afficher des messages d'erreur en cas de besoin.
2. Créez une fonction qui ajuste le nombre de places disponibles dans le restaurant selon le nombre de personnes qui quittent.&#x20;

   Si le nombre de personnes sortantes dépasse le nombre de personnes présentes dans le restaurant, une erreur doit être affichée.&#x20;

   Assurez-vous d’inclure la gestion des exceptions et les vérifications appropriées sur le nombre de personnes et de places disponibles, et afficher des messages d'erreur en cas de besoin.

#### &#x20;Exemple d’exécution

```python
**************************************************************
************* Gestion des places au restaurant *************
**************************************************************
Le nombre de places disponibles : 50
Souhaitez-vous : 
	 1. Occuper des places au restaurant.
	 2. Libérer des places au restaurant.
	 3. Quitter
**************************************************************
Réponse : 1
Combien de personnes souhaitent entrer ? 10
10 personnes sont autorisées à entrer.
Il reste 40 places disponibles dans le restaurant.

**************************************************************
Le nombre de places disponibles : 40
Souhaitez-vous : 
	 1. Occuper des places au restaurant.
	 2. Libérer des places au restaurant.
	 3. Quitter
**************************************************************
Réponse : 2
Combien de personnes ont quitté le restaurant ? 5
5 personnes quittent le restaurant.
Il reste 45 places disponibles dans le restaurant.

**************************************************************
Le nombre de places disponibles : 45
Souhaitez-vous : 
	 1. Occuper des places au restaurant.
	 2. Libérer des places au restaurant.
	 3. Quitter
**************************************************************
Réponse : 2
Combien de personnes ont quitté le restaurant ? 30
Erreur. Il y'a moins de 30 personnes dans le restaurant.

**************************************************************
Le nombre de places disponibles : 45
Souhaitez-vous : 
	 1. Occuper des places au restaurant.
	 2. Libérer des places au restaurant.
	 3. Quitter
**************************************************************
Réponse : 1
Combien de personnes souhaitent entrer ? 50
La capacité maximale du restaurant est atteinte. Uniquement 45 personnes sont admises.
Il reste 0 places disponibles dans le restaurant.

**************************************************************
Le nombre de places disponibles : 0
Souhaitez-vous : 
	 1. Occuper des places au restaurant.
	 2. Libérer des places au restaurant.
	 3. Quitter
**************************************************************
Réponse : 8
Action non valide. Veuillez choisir entre 1, 2, 3 ou 4.
**************************************************************
Le nombre de places disponibles : 0
Souhaitez-vous : 
	 1. Occuper des places au restaurant.
	 2. Libérer des places au restaurant.
	 3. Quitter
**************************************************************
Réponse : 3

```

### Partie 2

(Dans un autre fichier python)

Soit la liste à deux dimensions suivante qui représente les informations sur les tables du restaurant. Vous devez utiliser cette liste telle quelle dans votre programme.

```python
[[0, 4, True], [1, 2, False], [2, 4, True], [3, 10, True], [4, 6, True]]
```

Chaque sous-liste contient le numéro de la table, le nombre de chaises que contient la table et si la table est disponible ou non.

* **Exemple** : `[1, 2, False]` veut dire que la table numéro 1 est une table pour 2 personnes et elle n’est pas disponible.

1. Créez une fonction qui trouve (ou non) une table disponible pour installer un groupe de personnes parmi les tables de la liste. Le nombre de personnes du groupe doit être entré par l’utilisateur dans le programme principal.
   * **Exemple** : On peut installer un groupe de 4 personnes dans une tables qui a minimum 4 chaises.
2. Créez une fonction qui affiche toutes les informations sur les tables comme dans l’exemple ci-dessous.
3. Utilisez ces fonctions dans votre programme principal et affichez les résultats.

**Voici un exemple d’exécution :**&#x20;

```python
Entrez le nombre de personnes du groupe à installer : 5
Une table disponible a été trouvée : Table 3
Tables du restaurant :
Table 0 - Capacité : 4 - État : Disponible
Table 1 - Capacité : 2 - État : Occupée
Table 2 - Capacité : 4 - État : Disponible
Table 3 - Capacité : 10 - État : Occupée
Table 4 - Capacité : 6 - État : Disponible
```

## Exercice 2 : jeu du pendu

Le jeu du Pendu est un jeu de mots dans lequel un joueur tente de deviner un mot secret en proposant des lettres. Le mot à deviner est initialement caché sous forme de tirets bas, chaque tiret représentant une lettre du mot. Le joueur a un nombre limité d'essais pour deviner le mot correctement en proposant des lettres. Si le joueur devine une lettre qui est dans le mot, cette lettre est révélée dans le mot caché. Si le joueur devine une lettre qui n'est pas dans le mot, il perd un essai. Le jeu se termine de l'une des deux manières suivantes :

* Le joueur gagne s’il devine toutes les lettres du mot avant d'épuiser le nombre d'essais disponibles.
* Le joueur perd s’il épuise le nombre d'essais sans avoir deviné le mot complet.

**Règles :**

* Le joueur ne peut proposer qu'une lettre à la fois.
* Les lettres peuvent être en majuscules ou en minuscules.
* Les nombres et les caractères spéciaux ne sont pas autorisés.
* Le nombre d'essais disponibles est limité à un nombre prédéfini (6 essais dans le programme).

**Exemple d’exécution correcte :**

```python
Bienvenue au jeu du Pendu!

Mot à deviner: ______
Devinez une lettre : y
Bonne devinette!

Mot à deviner: _y____
Devinez une lettre : t
Bonne devinette!

Mot à deviner: _yt___
Devinez une lettre : n
Bonne devinette!

Mot à deviner: _yt__n
Devinez une lettre : d
Mauvaise devinette!

Mot à deviner: _yt__n
Devinez une lettre : h
Bonne devinette!

Mot à deviner: _yth_n
Devinez une lettre : q
Mauvaise devinette!

Mot à deviner: _yth_n
Devinez une lettre : p
Bonne devinette!

Mot à deviner: pyth_n
Devinez une lettre : o
Bonne devinette!
Félicitations, vous avez trouvé le mot python!
Nombre d'essais erronés : 2

```

#### Ce qui est demandé

1. Corriger toutes les erreurs de syntaxe dans le code.
2. Testez votre programme et corrigez toutes les erreurs d’exécution et de logique (il y en a 4). Pour chaque erreur trouvée :&#x20;
   * Décrivez ou montrez le teste qui vous a permis de trouver l’erreur.
   * Pour UNE SEULE ERREUR DE LOGIQUE, expliquez l’erreur produite (résultat attendu vs résultat observé) à l’aide du débogueur avec des captures d’écran.
   * Corrigez l’erreur. N’oubliez pas de faire un commit avec git et donner ici le message de commit utilisé.

**Utilisez le gabarit suivant pour répondre aux questions 2. pour chaque erreur :**&#x20;

| Erreur                                                                                        |   |
| --------------------------------------------------------------------------------------------- | - |
| Teste qui reproduit l’erreur                                                                  |   |
| Explication de l’erreur avec captures d’écran du débogueur (pour UNE SEULE ERREUR DE LOGIQUE) |   |
| Message du commit qui corrige l’erreur                                                        |   |

#### Le code Python avec erreurs&#x20;

* Pour faciliter les tests, le mot à deviner est toujours *`python`*.&#x20;
* Notez qu’il n’y a pas d’erreurs dans la fonction *`progression_mot`*.

```python
def progression_mot(mot:str, lettres_devinees:list) -> str:
    """
    Retourn la progression du mot à deviner en remplaçant
    les lettres non devinées par des tirets bas.

    :param mot: Le mot à deviner.
    :param lettres_devinees: Liste de lettres déjà devinées
                             par le joueur.
    :return: Une chaîne de caractères représentant le mot
             actuel avec les lettres devinées et des
             tirets bas pour les lettres manquantes.
    """

    mot_actuel = ""
    for lettre in mot:
        if lettre in lettres_devinees:
            mot_actuel += lettre
        else:
            mot_actuel += "_"
    return mot_actuel

def pendu() -> None:
    """
    Simule le jeu du Pendu. Le joueur doit deviner un mot
    en proposant des lettres. Le jeu se termine lorsque
    le joueur trouve le mot ou épuise le nombre d'essais
    érronés.

    :return: Aucun
    """

    max_essais = 6
    mot_a_deviner = "python"

    lettres_devinees = []

    print("Bienvenue au jeu du Pendu!")

    etat_progression_mot = progression_mot(mot_a_deviner, lettres_devinees)

    while True
        print("\nMot à deviner:", etat_progression_mot)
        lettre = input("Devinez une lettre : ").lower()

        # Posez le curseur de la souris sur la fonction .isalpha() pour voir sa définition
        if lettre.isalpha() or len(lettre) != 1:
        print("Veuillez entrer une seule lettre valide.")
        continue

        if lettre in lettres_devinees:
            print("Vous avez déjà proposé cette lettre.")
            continue

        lettres_devinees.append(lettre)

        if lettre in mot_a_deviner:
            print("Bonne devinette!")
        else:
            print("Mauvaise devinette!")
            essais += 1

        etat_progression_mot = progression_mot(mot_a_deviner, lettres_devinees)

        if "_" in etat_progression_mot:
            print(f"Félicitations, vous avez trouvé le mot {mot_a_deviner}!")
            print(f"Nombre d'essais erronés : {essais}")

        if essais >= max_essais:
            print(f"Vous avez épuisé vos {essais} essais ! Le mot était: {mot_a_deviner}")
            break

if __name__ = "__main__":
    pendu()

```
