Aller au contenu

Exercices

Crédits⚓︎

Les exercices 1 à 6 compris ont été créés par Gilles Lassus et publiés sous licence cc nc-by-sa

Exercice 1

  1. Écrire une classe Eleve qui contiendra les attributs nom, classe et note.
  2. Instancier trois élèves de cette classe.
  3. Écrire une fonction compare(eleve1, eleve2) qui renvoie le nom de l'élève ayant la meilleure note.
Exemple d'utilisation de la classe
>>> henri = Eleve("Henri", "TG2", 12)
>>> philippe = Eleve("Philippe", "TG6", 15)
>>> louis = Eleve("Louis", "TG1", 8)
>>> compare(henri, philippe)
'Philippe'

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

class Eleve:
    def __init__(self, nom, classe, note):
        self.nom = nom
        self.classe = classe
        self.note = note

def compare(eleve1, eleve2):
    if eleve1.note > eleve2.note:
        return eleve1.nom
    else:
        return eleve2.nom

Exercice 2

Écrire une classe TriangleRect qui contiendra les attributs cote1, cote2 et hypotenuse.

La méthode constructeur ne prendra en paramètres que cote1 et cote2, l'attribut hypotenuse se calculera automatiquement.

⚠️ Attention, hypotenuse n'est pas une méthode.

Exemple d'utilisation de la classe
>>> mon_triangle = TriangleRect(3,4)
>>> mon_triangle.cote1
3
>>> mon_triangle.cote2
4
>>> mon_triangle.hypotenuse
5.0

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 4/4

.128013/oblvn-Ru_yhPp342Tamkw:S7ig,rs) *5q.=6+1edtf(c050Q0P0R0t0A0e0E0G0U0e0t0E0E0L010R0A0o010406050E0j0u0u0t0D0l040y0c0e0j0/0c0g050b0_0{0}0 0@0o04051f181i0b1f0@0Q0A0f0%0)0+0-0)0g0B0j0t0B0P0h0o0l0R0m160G0m0A0B0m0e1K0m0R0=050Y0d0e0P1r0*0,011J1L1N1L0R1T1V1R0R0D1g1F0%120E0o0t0g0-0r011X1t010S0!0P0g0t0u0P1R1?1^1}1Z201V23250=0a0G0n0D0c0o0c0E0A150g0G0W1;0D0D0P0U2q18280g1g0b1F2D1-1/1.1S0Q2a1u0A0g222n1R1o1q0(1Y2N2P0g0c2T1R0o2w1g2B2D2*0^1@2r2V1~2Z0D0|0e1R0t1I2w0S0-030k0k0U2!0P1N2Y0c0h0p0h0O0=0O180t2+2.0?2-292:1Z2=2@2_2{0P2}012 3133352Q380h1{040r3e3g1^3i2B2M013n0t2^1g2`0m2|2~30320W3x2Z3z0p0=0p3E2A3h0@3I3l0-3L3N053P3R3t3T3w2O3y390q0=0q3$193(3j2/1s3m0c2?3M3p3Q3r3S3v3V3^3X390I0=0I3~2*3)2.3J3-483;3u3U344e37390M0=0M4k403*433,453o3O3q3s4s3@363z0z0=0z4B3G1j2(182T2G0Q1/2L3+014t2S1p1g2%0P2)3h3%4T4t4.290A0Q0-302B3z3b4I4^4`4c4u4N393b0G2e0P514t3W4w3a1R0b3f413J0v0g0=0S2k0u4:2C5i4$0w0=0G5q4?422W3K5l040|1F5x5s4E015u045w3 4T4D5A5k0=0A0u2m0D0R5x5w5P2;0=0E0J5W5x0@5N5r3I50014{2.3z3B3/0G5/3?4d543A1|585a4M3_5~2D3f5+2,5.4_5:0k4|393Z4 6a5{53633Z5724596b5b4v3Y5f5h5!1Z0v0=3l5G6v0-5K5M684n4$0g0U0=0s0D0A1^0B1V0i2x5X5,5y3J0;040x5*6A4n5`6c5=3`3p6%6q5}3{6m25615|633{655L0G6{5H5Q0=0W0S6#3k5I6D725z1~0S0u0=302O2p30766W0=0T7g4$0d6X0E34716U6}1~6X0C5Y7s3m6y0c0R0P3d7r6B017u7w7F5C327B3D7E6G5I6X0F6Z6U674/69516d0h4h6g6=6j4f7!5 6n7%5c3z7#3E6{7=7=7x0-7m5$7p7k5I0c0=0K7}5A7K7A7C7I7P5A7 040L8773837z7B7D4l7g6%7Z4y7$6p627)4y6:6o6i7.4x6t6`7?6|7F7`047o0e7q6F8e1~8a817O8J7y047L0P7N2*5Z888K0=8c6U8V8O3,8g8S6!8N2r8l6)0h4P8o8v6r394P8t7-8?8/8y8A7@8C7n7|8+3J8L825#040m0l2m7B0g0j7o8d771Z8a8Z8U7^3K5$5(6T8I9h0-6X7j936H8(8i7W8W9i0=0H0H961Z0u0A0=8T3h8#9s018a0N9g4o8(9L5O9B0-8a9E9G0-9I9K9#7G0=0F8*2,0b4=4U4-4W4*180R4Z9^2J2E0t1U9=0b4X5+0W0Y0!0E04.

Exercice 3

  1. Écrire une classe Chrono qui contiendra les attributs heures, minutes et secondes.
  2. Doter la classe d'une méthode affiche() qui fera affichera le temps t.
  3. Doter la classe d'une méthode avance(s) qui fera avancer le temps t de s secondes.
Exemple d'utilisation de la classe
>>> t = Chrono(17,25,38)
>>> t.heures
17
>>> t.minutes
25
>>> t.secondes
38
>>> t.affiche()
'Il est 17 heures, 25 minutes et 38 secondes'
>>> t.avance(27)
>>> t.affiche()
'Il est 17 heures, 26 minutes et 5 secondes'

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

class Chrono:
    def __init__(self, h, m, s):
        self.heures = h
        self.minutes = m
        self.secondes = s

    def affiche(self):
        return "Il est "+ str(self.heures) + " heures " + str(self.minutes) + \
    " minutes et " + str(self.secondes) + " secondes."

    def avance(self, s):
        self.secondes = self.secondes + s
        # il faut ajouter les minutes supplémentaires si les secondes dépassent 60
        self.minutes = self.minutes + self.secondes // 60
        # il ne faut garder des secondes que ce qui n'a pas servi
        # à fabriquer des minutes supplémentaires
        self.secondes = self.secondes % 60
        # il faut ajouter les heures supplémentaires si les minutes dépassent 60
        self.heures = self.heures + self.minutes // 60
        # il ne faut garder des minutes que ce qui n'a pas servi
        # à fabriquer des heures supplémentaires
        self.minutes = self.minutes % 60

Exercice 4

Écrire une classe Player qui :

  • ne prendra aucun argument lors de son instanciation.
  • affectera à chaque objet créé un attribut energie valant 3 par défaut.
  • affectera à chaque objet créé un attribut alive valant True par défaut.
  • fournira à chaque objet une méthode blessure() qui diminue l'attribut energie de 1.
  • fournira à chaque objet une méthode soin() qui augmente l'attribut energie de 1.
  • si l'attribut energie passe à 0, l'attribut alive doit passer à False et ne doit plus pouvoir évoluer.
Exemple d'utilisation de la classe
>>> mario = Player()
>>> mario.energie
3
>>> mario.soin()
>>> mario.energie
4
>>> mario.blessure()
>>> mario.blessure()
>>> mario.blessure()
>>> mario.alive
True
>>> mario.blessure()
>>> mario.alive
False
>>> mario.soin()
>>> mario.alive
False
>>> mario.energie
0

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

class Player:
    def __init__(self):
        self.energie = 3
        self.alive = True

    def blessure(self):
        self.energie -= 1
        if self.energie <= 0:
            self.alive = False

    def soin(self):
        if self.energie > 0:
            self.energie += 1

Exercice 5

Créer une classe CompteBancaire dont la méthode constructeur recevra en paramètres :

  • un attribut titulaire stockant le nom du propriétaire.
  • un attribut solde contenant le solde disponible sur le compte.

Cette classe contiendra deux méthodes retrait() et depot() qui permettront de retirer ou de déposer de l'argent sur le compte.

Exemple d'utilisation de la classe
>>> compteGL = CompteBancaire("G.Lassus", 1000)
>>> compteGL.retrait(50)
Vous avez retiré 50 euros
Solde actuel du compte : 950 euros
>>> compteGL.retrait(40000)
Retrait impossible
>>> compteGL.depot(10000000)
Vous avez déposé 10000000 euros
Solde actuel du compte : 10000950 euros

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

class CompteBancaire:
    def __init__(self, titulaire, solde):
        self.titulaire = titulaire
        self.solde = solde

    def retrait(self, somme):
        if somme > self.solde:
            print("Retrait impossible")
        else :
            self.solde -= somme
            print("Vous avez retiré ", somme, " euros.")
            print("Solde actuel du compte : ", self.solde, " euros.")
    def depot(self, somme):
        self.solde += somme
        print("Vous avez déposé ", somme, " euros.")
        print("Solde actuel du compte : ", self.solde, " euros.")

Exercice 6 : Une bibliothèque

👉 Gestion d'une bibliothèque

Il s'agit de gérer les livres d'une bibliothèque, à l'aide de deux classes, la classe Livre et la classe Bibliotheque.

Le cahier des charges ci-dessous comporte la description des deux classes, ainsi qu'un exemple concret de leur utilisation.

👉 classe Livre Elle comporte 3 attributs :

  • titre : le titre du livre
  • auteur : le nom de l'auteur
  • etat : un nombre entier entre 0 et 5. Si l'état vaut 0, le livre est trop abîmé et doit être retiré de la bibliothèque. L'état d'un livre ne peut pas être négatif.

Elle comporte 2 méthodes : - degrade : enlève 1 à l'état du livre. - description : affiche les renseignements sur le livre

👉 classe Bibliotheque

Elle comporte 1 attribut :
- livres : une liste (vide à la création de l'objet)

Elle comporte 3 méthodes :

  • ajoute : prend un livre en paramètre et l'ajoute à la bibliothèque.
  • supprime_livres_abimes : enlève de la bibliothèque les livres trop abîmés.
  • inventaire : affiche le contenu de la bibliothèque

👉 Exemple d'utilisation des classes

>>> ma_bibli = Bibliotheque()
>>> livre1 = Livre("Les Misérables", "Victor Hugo", 3)
>>> livre2 = Livre("Les fleurs du mal", "Charles Baudelaire", 1)
>>> ma_bibli.ajoute(livre1)
>>> ma_bibli.ajoute(livre2)
>>> livre1.description()
Titre : Les Misérables
Auteur : Victor Hugo
Etat : 3
>>> livre2.degrade()
>>> livre2.description()
Titre : Les fleurs du mal
Auteur : Charles Baudelaire
Etat : 0
>>> ma_bibli.inventaire()
-------------------------------
contenu de ma bibliothèque :
-------------------------------
Titre : Les Misérables
Auteur : Victor Hugo
Etat : 3
Titre : Les fleurs du mal
Auteur : Charles Baudelaire
Etat : 0
>>> ma_bibli.supprime_livres_abimes()
>>> ma_bibli.inventaire()
-------------------------------
contenu de ma bibliothèque :
-------------------------------
Titre : Les Misérables
Auteur : Victor Hugo
Etat : 3

Question

Proposer un code pour la classe Livre et la classe Bibliotheque répondant au cahier des charges.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

class Livre():

    def __init__(self, titre, auteur, etat):
        self.titre = titre
        self.auteur = auteur
        self.etat = etat

    def degrade(self):
        if self.etat > 0:
            self.etat -= 1

    def description(self):
        print("Titre :", self.titre)
        print("Auteur :",self.auteur)
        print("Etat :", self.etat)

class Bibliotheque:

    def __init__(self):
        self.livres = []

    def ajoute(self, livre):
        self.livres.append(livre)

    def supprime_livres_abimes(self):
        for livre in self.livres:
            if livre.etat == 0:
                self.livres.remove(livre)

    def inventaire(self):
        print("---------------")
        print("contenu de ma bibliothèque :")
        print("---------------")
        for livre in self.livres:
            livre.description()
            print()
ma_bibli = Bibliotheque()
livre1 = Livre("Les Misérables", "Victor Hugo", 3)
livre2 = Livre("Les fleurs du mal", "Charles Baudelaire", 1)
livre1.description()
ma_bibli.ajoute(livre1)
ma_bibli.ajoute(livre2)
ma_bibli.inventaire()

Exercice 7 : Un jeu de carte

Paquet de cartes sur CodEx

Exercice 8 : exercice "papier" - Les comptes

Créez une classe Compte. Un objet de type Compte devra posséder 4 attributs :

  • solde : float : le solde du compte - lors de la création du compte le solde sera 0
  • nom: str: le nom du titulaire du compte
  • prenom: str: le prénom du titulaire du compte
  • num_compte: int : un entier identifiant du compte

Les 3 derniers paramètres devront être définis lors de l'instanciation d'un compte.

Ajoutez des méthodes :

  • une méthode str qui permettra l'affichage du compte avec print(). La méthode doit renvoyer une chaine de caractères comme :

Nom : DURAND
Prénom : Jacques
Solde : 200

👉 pour insérer des retours à la ligne dans une chaîne on ajoute le caractère "\n"

  • une méthode ajouter qui permettra de verser de l'argent sur le compte

  • une méthode debiter qui permettra de retirer de l'argent du compte.
    La méthode débiter doit effectuer le retrait si le solde est suffisant (supérieur au montant qu'on souhaite retirer). Sinon elle doit afficher un message et ne pas effectuer le débit.

  • une méthode get_solde qui renvoie le solde du compte.

Enfin, vous ajouterez dans votre code les instructions pour créer un compte, verser de l'argent puis effectuer un débit.

Solution
class Compte:
    def __init__(self, nom ,prenom, numero )  -> None:
        """
        params : nom: str; prenom: str; numero: int (numéro de compte)
        Le constructeur initialise les attributs, solde est initialisé à 0
        """
        self.solde = 0
        self.nom = nom
        self.prenom = prenom
        self.num_compte = numero


    def __str__(self) -> str :
        """
        param : self : un objet de type compte
        sortie : la fonction renvoie une chaîne de caractère. __str__ est utilisée par print()
        """
        return "Nom : "+self.nom+"\nPrénom : "+self.prenom+"\nSolde : "+str(self.solde)


    def ajouter(self, montant: float) -> None:
        self.solde = self.solde + montant


    def debiter(self, montant:float) -> None:
        if self.solde >= montant :
            self.solde = self.solde - montant
        else:
            print( 'solde insuffisant' )


    def get_solde(self) -> float:
        return self.solde


mon_compte = Compte('Durand', 'Jacques', 13215)
mon_compte.ajouter(200)
mon_compte.debiter(20)
print(mon_compte)
print(mon_compte.solde)
Exercice 9 : Corrigez l'erreur - Les voitures

Le code suivant est faux. Vous devez le corriger.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution

Dans la méthode nom_puissance les variables nom et puissance ne sont pas définies. Il faut utiliser des attributs.

class Voiture:

    def __init__(self, nom, couleur, puissance):
        self.nom = nom
        self.couleur = couleur
        self.puissance = puissance

    def nom_puissance(self):
        return self.nom + " - puissance : " + str(self.puissance)

voiture_1 = Voiture("Coccinelle", "rouge", 5)
print(voiture_1.nom_puissance())

Exercice 10: Coriger l'erreur

Correction d'erreurs (3)