Laboratoire débogage et gestion des erreurs -solution

But

  • Correction d'erreurs de syntaxe, d'exécution et de logique.

  • Utiliser le débogueur et les techniques de débogage.

  • Continuer à pratiquer le pseudo-code (algo).

Énoncé

Vous devez trouver les erreurs dans le code Python de l’enseignant, les réparer et documenter vos découvertes.

Pour chacun des exercices suivants, vous devez :

  1. Réfléchir à la logique du programme et écrire un pseudo-code qui décrit les résultats attendus en vous basant sur ce que le programme est supposé faire (et non sur le programme plein d'erreurs).

  2. Corriger les erreurs de syntaxe.

  3. Créer un plan de tests et tester votre programme.

Valeur variable 1
Valeur variable 2
Résultat attendu
Résultat obtenu

  1. Corriger le reste des erreurs d'exécution et de logique à l'aide du débogueur.

    1. Lire les messages d'erreur et corriger les erreurs évidentes sans débogueur.

    2. Utiliser le débogueur, notamment pour les erreurs de logique ou pour les erreurs d'exécution les moins évidentes. Voir dans les notes de cours la technique de base et les astuces de débogage.

Exercice 1 : Retrait d'argent au guichet automatique

Il s'agit d'un programme permettant de retirer de l'argent du guichet automatique. Votre compte débute avec 1000$ et vous demande d'effectuer 2 retraits.

  • Si un retrait est négatif, il ne doit pas avoir lieu.

  • Si un retrait est plus grand que le solde du compte, il doit retirer le solde restant seulement.

Le code suivant contient plusieurs erreurs de logique et d'exécution. Vous devez :

def retrait(solde:str = 0, retrait: float = 0) -> bool:
    if retrait > solde:
        retrait = solde
        print(f"* Solde insuffisant, retrait effectué: {retrait} $")

    else:
        solde = solde - retrait
        print(f"* Retrait effectué: {retrait}")

    return solde

if __name__ == "__main__":
    MONTANT_INITIAL = 1000

    solde = MONTANT_INITIAL

    print("*************************")
    print("***      GUICHET      ***")
    print("*************************")
    print(f"Solde initial:  {solde} $")
    print("*************************")

    retrait_1 = float(input("Retrait 1: Combien voulez-vous retirer? "))
    solde = retrait(solde, retrait_1)

    retrait_2 = float(input("Retrait 2: Combien voulez-vous retirer? "))
    solde = retrait()

    print("*********************")
    print(f"Solde initial: {MONTANT_INITIAL} $")
    print(f"Retrait 1:     {retrait_1} $")
    print(f"Retrait 2:     {retrait_2} $")
    print(f"Solde final:    {solde} $")
    print(f"*********************")
Solution

Code Python corrigé :

def retrait(solde:float, retrait: float) -> float:
    """
    Fonction qui permet de faire le retrait d'un
    montant du solde.
    :param solde: le solde du compte.
    :param retrait: le montant à retirer.
    :return: le solde restant
    """
    if retrait < 0:
        print("*** Retrait impossible!")

    elif retrait > solde:
        retrait = solde
        solde = 0
        print(f"* Solde insuffisant, retrait effectué: {retrait} $")

    else:
        solde = solde - retrait
        print(f"* Retrait effectué: {retrait}")

    return solde

if __name__ == "__main__":
    MONTANT_INITIAL = 1000

    solde = MONTANT_INITIAL

    print("*************************")
    print("***      GUICHET      ***")
    print("*************************")
    print(f"Solde initial:  {solde} $")
    print("*************************")

    try:
        retrait_1 = float(input("Retrait 1: Combien voulez-vous retirer? "))
        solde = retrait(solde, retrait_1)
    except ValueError:
        print("Erreur. Le montant entré n'est pas une valeur numérique.")

    try:
        if solde > 0:
            retrait_2 = float(input("Retrait 2: Combien voulez-vous retirer? "))
            solde = retrait(solde, retrait_2)

    except ValueError:
        print("Erreur. Le montant entré n'est pas une valeur numérique.")

    print("*********************")
    print(f"Solde initial: {MONTANT_INITIAL} $")

    try:
        print(f"Retrait 1:     {retrait_1} $")
    except NameError:
        pass

    try:
        print(f"Retrait 2:     {retrait_2} $")
    except NameError:
        pass

    print(f"Solde final:    {solde} $")
    print(f"*********************")

Exercice 2 : Roche-Papier-Ciseau

(Inspiré d'un exercice du laboratoire de Rémy Corriveau)

Le code doit afficher un menu et demander aux deux joueurs de choisir leurs armes. Ensuite, le gagnant est affiché ainsi que l’arme victorieuse.

Dans le code suivant, vous trouverez (au moins) :

def roche_papier_ciseau(choix_joueur1:str, choix_joueur2:str) -> None:
    """
    Cette fonction compare les choix du jeu Roche-Papier-Ciseaux entre deux
    joueurs et affiche le gagnant.

    :param choix_joueur1: Le choix du joueur 1 ("roche", "papier" ou "ciseau")
    :param choix_joueur2: Le choix du joueur 2 ("roche", "papier" ou "ciseau")
    :return: Aucun
    """
    armes = ["roche", "papier", "ciseau"]

    if choix_joueur1 in armes or choix_joueur2 not in armes:
        print("Vous n'avez pas entré roche, papier ou ciseau. :(")
    else:
        if choix_joueur1 = choix_joueur2:
            print("Partie nulle!")
        elif (choix_joueur1 == 'roche' and choix_joueur2 == 'ciseau') or (choix_joueur2 == 'ciseau' and choix_joueur1 == 'papier' or choix_joueur1 == 'papier' or choix_joueur2 == 'roche'):
            joueur_gagnant = "joueur2"
            arme_gagnante = choix_joueur1
        elif choix_joueur1 == 'roche' and choix_joueur2 == 'papier' or choix_joueur1 == 'ciseau' and choix_joueur1 == 'roche' or choix_joueur2 == 'papier' and choix_joueur1 == 'ciseau':
            joueur_gagnant = "joueur2"
            arme_gagnante = choix_joueur2

        print(f"\nLe gagnant est {joueur_gagnant} avec {arme_gagnante}, félicitation.")

if __name__ == "__main__":

    print("""
    Bienvenu au jeu Roche-Papier-Ciseau.
    Veuillez faire un choix parmi les suivants : 
    roche
    papier
    ciseau
     "")

    choix1 = input("Choix du joueur 1 : ")
    choix2 = input("Choix du joueur 2 : ")

    roche_papier_ciseau()

Plan de tests (avec 3 exemples)

Choix joueur 1
Choix joueur 2
Résultat attendu
Résultat obtenu

roche

ciseau

joueur 1 gagne avec roche.

joueur 2 gagne avec roche

roche

papier

joueur 2 gagne avec papier.

joueur 2 gagne avec papier.

Roche

Papier

joueur 2 gagne avec Papier

Vous n'avez pas entré roche, papier ou ciseau. :(

...

Last updated