diff --git a/TD1/correction/code/formes.py b/TD1/correction/code/formes.py
new file mode 100755
index 0000000000000000000000000000000000000000..b010707d7ad2a5847c630babc695437e8419f47d
--- /dev/null
+++ b/TD1/correction/code/formes.py
@@ -0,0 +1,85 @@
+class Forme:
+    def __init__(self, x, y):
+        self.__x = x
+        self.__y = y
+    
+    def get_pos(self):
+        return self.__x, self.__y
+    
+    def set_pos(self, x, y):
+        self.__x = x
+        self.__y = y
+    
+    def translation(self, dx, dy):
+        self.__x += dx
+        self.__y += dy
+
+class Rectangle(Forme):
+    def __init__(self, x, y, l, h):
+        Forme.__init__(self, x, y)
+        self.__l = l
+        self.__h = h
+    
+    def __str__(self):
+        return f"Rectangle d'origine {self.get_pos()} et de dimensions {self.__l}x{self.__h}"
+    
+    def get_dim(self):
+        return self.__l, self.__h
+    
+    def set_dim(self, l, h):
+        self.__l = l
+        self.__h = h
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return X <= x <= X + self.__l and \
+               Y <= y <= Y + self.__h
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos(min(x0, x1), min(y0, y1))
+        self.__l = abs(x0 - x1)
+        self.__h = abs(y0 - y1)
+
+class Ellipse(Forme):
+    def __init__(self, x, y, rx, ry):
+        Forme.__init__(self, x, y)
+        self.__rx = rx
+        self.__ry = ry
+    
+    def __str__(self):
+        return f"Ellipse de centre {self.get_pos()} et de rayons {self.__rx}x{self.__ry}"
+    
+    def get_dim(self):
+        return self.__rx, self.__ry
+    
+    def set_dim(self, rx, ry):
+        self.__rx = rx
+        self.__ry = ry
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return ((x - X) / self.__rx) ** 2 + ((y - Y) / self.__ry) ** 2 <= 1
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos((x0 + x1) // 2, (y0 + y1) // 2)
+        self.__rx = abs(x0 - x1) / 2
+        self.__ry = abs(y0 - y1) / 2
+
+class Cercle(Ellipse):
+    def __init__(self, x, y, r):
+        Ellipse.__init__(self, x, y, r, r)
+    
+    def __str__(self):
+        return f"Cercle de centre {self.get_pos()} et de rayon {self.get_dim()}"
+    
+    def get_dim(self):
+        return Ellipse.get_dim(self)[0]
+    
+    def set_dim(self, r):
+        Ellipse.set_dim(self, r, r)
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        r = min(abs(x0 - x1), abs(y0 - y1)) / 2
+        self.set_dim(r)
+        self.set_pos(round(x0 + r if x1 > x0 else x0 - r),
+                     round(y0 + r if y1 > y0 else y0 - r))
diff --git a/TD1/correction/code/formes_avec_dessin.py b/TD1/correction/code/formes_avec_dessin.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9717a60503a24884b4750dff75ba6d07c413c90
--- /dev/null
+++ b/TD1/correction/code/formes_avec_dessin.py
@@ -0,0 +1,125 @@
+class Forme:
+    def __init__(self, x, y):
+        self.__x = x
+        self.__y = y
+        
+        self.__dessins = []
+    
+    def get_pos(self):
+        return self.__x, self.__y
+    
+    def set_pos(self, x, y):
+        self.__x = x
+        self.__y = y
+    
+    def translation(self, dx, dy):
+        self.__x += dx
+        self.__y += dy
+        
+    def add_dessin(self,d):
+        self.__dessins.append(d)
+    
+    def del_dessin(self,d):
+        self.__dessins.remove(d)
+
+    def print_dessins(self):
+        print("Liste des dessins de la forme : ")
+        for d in self.__dessins:
+            print(d.get_nom())
+
+class Rectangle(Forme):
+    def __init__(self, x, y, l, h):
+        Forme.__init__(self, x, y)
+        self.__l = l
+        self.__h = h
+    
+    def __str__(self):
+        return f"Rectangle d'origine {self.get_pos()} et de dimensions {self.__l}x{self.__h}"
+    
+    def get_dim(self):
+        return self.__l, self.__h
+    
+    def set_dim(self, l, h):
+        self.__l = l
+        self.__h = h
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return X <= x <= X + self.__l and \
+               Y <= y <= Y + self.__h
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos(min(x0, x1), min(y0, y1))
+        self.__l = abs(x0 - x1)
+        self.__h = abs(y0 - y1)
+
+class Ellipse(Forme):
+    def __init__(self, x, y, rx, ry):
+        Forme.__init__(self, x, y)
+        self.__rx = rx
+        self.__ry = ry
+    
+    def __str__(self):
+        return f"Ellipse de centre {self.get_pos()} et de rayons {self.__rx}x{self.__ry}"
+    
+    def get_dim(self):
+        return self.__rx, self.__ry
+    
+    def set_dim(self, rx, ry):
+        self.__rx = rx
+        self.__ry = ry
+    
+    def contient_point(self, x, y):
+        X, Y = self.get_pos()
+        return ((x - X) / self.__rx) ** 2 + ((y - Y) / self.__ry) ** 2 <= 1
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        self.set_pos((x0 + x1) // 2, (y0 + y1) // 2)
+        self.__rx = abs(x0 - x1) / 2
+        self.__ry = abs(y0 - y1) / 2
+
+class Cercle(Ellipse):
+    def __init__(self, x, y, r):
+        Ellipse.__init__(self, x, y, r, r)
+    
+    def __str__(self):
+        return f"Cercle de centre {self.get_pos()} et de rayon {self.get_dim()}"
+    
+    def get_dim(self):
+        return Ellipse.get_dim(self)[0]
+    
+    def set_dim(self, r):
+        Ellipse.set_dim(self, r, r)
+    
+    def redimension_par_points(self, x0, y0, x1, y1):
+        r = min(abs(x0 - x1), abs(y0 - y1)) / 2
+        self.set_dim(r)
+        self.set_pos(round(x0 + r if x1 > x0 else x0 - r),
+                     round(y0 + r if y1 > y0 else y0 - r))
+
+class Dessin:
+    def __init__(self,n):
+        self.__nom = n
+        self.__formes = []
+
+    def get_nom(self):
+        return self.__nom
+
+    def add_forme(self,f):
+        self.__formes.append(f)
+        f.add_dessin(self)
+        
+    def del_forme(self,position):
+        f = self.__formes.pop(position)
+        f.del_dessin(self)
+
+    def print_formes(self):
+        print('--- Dessin ---')
+        for f in self.__formes:
+            print(f)
+
+    def __str__(self):
+        s = '--- Dessin (avec print) ---'
+        for f in self.__formes:
+            s += '\n' + str(f)
+        return s
\ No newline at end of file
diff --git a/TD1/correction/code/test_formes.py b/TD1/correction/code/test_formes.py
new file mode 100755
index 0000000000000000000000000000000000000000..171840f6290ef94f6a718c39381446c3f96d05e0
--- /dev/null
+++ b/TD1/correction/code/test_formes.py
@@ -0,0 +1,33 @@
+from formes import *
+
+def test_Rectangle():
+    r = Rectangle(10, 20, 100, 50)
+    str(r)
+    assert r.contient_point(50, 50)
+    assert not r.contient_point(0, 0)
+    r.redimension_par_points(100, 200, 1100, 700)
+    assert r.contient_point(500, 500)
+    assert not r.contient_point(50, 50)
+
+def test_Ellipse():
+    e = Ellipse(60, 45, 50, 25)
+    str(e)
+    assert e.contient_point(50, 50)
+    assert not e.contient_point(11, 21)
+    e.redimension_par_points(100, 200, 1100, 700)
+    assert e.contient_point(500, 500)
+    assert not e.contient_point(101, 201)
+
+def test_Cercle():
+    c = Cercle(10, 20, 30)
+    str(c)
+    assert c.contient_point(0, 0)
+    assert not c.contient_point(-19, -9)
+    c.redimension_par_points(100, 200, 1100, 700)
+    assert c.contient_point(500, 500)
+    assert not c.contient_point(599, 500)
+
+if __name__ == '__main__':
+    test_Rectangle()
+    test_Ellipse()
+    test_Cercle()
diff --git a/TD1/correction/code/test_formes_avec_dessin.py b/TD1/correction/code/test_formes_avec_dessin.py
new file mode 100644
index 0000000000000000000000000000000000000000..343b02cffd73bf486a1ea1a6667adb8323885668
--- /dev/null
+++ b/TD1/correction/code/test_formes_avec_dessin.py
@@ -0,0 +1,68 @@
+from formes_avec_dessin import *
+
+def test_Rectangle():
+    r = Rectangle(10, 20, 100, 50)
+    str(r)
+    assert r.contient_point(50, 50)
+    assert not r.contient_point(0, 0)
+    r.redimension_par_points(100, 200, 1100, 700)
+    assert r.contient_point(500, 500)
+    assert not r.contient_point(50, 50)
+
+def test_Ellipse():
+    e = Ellipse(60, 45, 50, 25)
+    str(e)
+    assert e.contient_point(50, 50)
+    assert not e.contient_point(11, 21)
+    e.redimension_par_points(100, 200, 1100, 700)
+    assert e.contient_point(500, 500)
+    assert not e.contient_point(101, 201)
+
+def test_Cercle():
+    c = Cercle(10, 20, 30)
+    str(c)
+    assert c.contient_point(0, 0)
+    assert not c.contient_point(-19, -9)
+    c.redimension_par_points(100, 200, 1100, 700)
+    assert c.contient_point(500, 500)
+    assert not c.contient_point(599, 500)
+    
+def test_Dessin():
+    # Partie pour aller plus loin : Creation et manipulation d'objets Dessin
+    
+    r = Rectangle(10, 20, 100, 50)
+    e = Ellipse(60, 45, 50, 25)
+    c = Cercle(10, 20, 30)
+    
+    print("Création d'un dessin A composé des trois formes")
+    d1 = Dessin("A")
+    d1.add_forme(r)
+    d1.add_forme(e)
+    d1.add_forme(c)
+    d1.print_formes()
+
+    print("Création d'un dessin B composé de l'ellipse et du cercle")
+    d2 = Dessin("B")
+    d2.add_forme(e)
+    d2.add_forme(c)
+    d2.print_formes()
+
+    print("Affichage des dessins auxquels les formes sont associées")
+    r.print_dessins()
+    e.print_dessins()
+    c.print_dessins()
+
+    print("Suppression de l'ellipse dans le dessin A")
+    d1.del_forme(1)
+    print(d1)
+
+    print("Affichage des dessins auxquels les formes sont associées")
+    r.print_dessins()
+    e.print_dessins()
+    c.print_dessins()
+
+if __name__ == '__main__':
+    test_Rectangle()
+    test_Ellipse()
+    test_Cercle()
+    test_Dessin()
diff --git a/TD1/correction/diagramme_classes_formes.png b/TD1/correction/diagramme_classes_formes.png
new file mode 100644
index 0000000000000000000000000000000000000000..0368318a11ea4296a45af7e69fe928c7d5df2f73
Binary files /dev/null and b/TD1/correction/diagramme_classes_formes.png differ
diff --git a/TD1/correction/diagramme_classes_formes_avec_dessin.png b/TD1/correction/diagramme_classes_formes_avec_dessin.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a1993089d4961025a34b24c9e1409f9c7aca18f
Binary files /dev/null and b/TD1/correction/diagramme_classes_formes_avec_dessin.png differ
diff --git a/TD2/correction/code/bibliotheque.py b/TD2/correction/code/bibliotheque.py
new file mode 100755
index 0000000000000000000000000000000000000000..b493ead3f83228ce29420791f060f780736fec5e
--- /dev/null
+++ b/TD2/correction/code/bibliotheque.py
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+"""
+
+@author: dellandrea
+"""
+from lecteur import *
+from livre import *
+from emprunt import *
+    
+      
+# ***** classe Bibliotheque *****
+class Bibliotheque:
+    def __init__(self,nom):
+        self.__nom = nom
+        self.__lecteurs = []
+        self.__livres = []
+        self.__emprunts = []
+        
+    def get_nom(self):
+        return self.__nom
+        
+    def ajout_lecteur(self,nom,prenom,adresse,numero):
+        self.__lecteurs.append(Lecteur(nom,prenom,adresse,numero))
+        
+    def retrait_lecteur(self,numero):
+        # On cherche le lecteur
+        lecteur = self.chercher_lecteur_numero(numero)
+        if lecteur == None:
+            return False
+        # On verifie qu'il n'a pas d'emprunt en cours
+        for e in self.__emprunts:
+            if e.get_numero_lecteur()==numero:
+                return False
+        # On peut ici retirer le lecteur de la liste
+        self.__lecteurs.remove(lecteur)
+        return True                
+                
+    def ajout_livre(self,auteur,titre,numero,nb_total):
+        self.__livres.append(Livre(auteur,titre,numero,nb_total))
+    
+    def retrait_livre(self,numero):
+        # On cherche le livre
+        livre = self.chercher_livre_numero(numero)
+        if livre == None:
+            return False
+        # On verifie que le livre n'est pas en cours d'emprunt
+        for e in self.__emprunts:
+            if e.get_numero_livre()==numero:
+                return False
+        # On peut ici retirer le livre de la liste
+        self.__livres.remove(livre)
+        return True        
+        
+    def chercher_lecteur_numero(self,numero):
+        for l in self.__lecteurs:
+            if l.get_numero() == numero:
+                return l
+        return None
+
+    def chercher_lecteur_nom(self,nom,prenom):
+        for l in self.__lecteurs:
+            if l.get_nom() == nom and l.get_prenom() == prenom:
+                return l
+        return None    
+        
+    def chercher_livre_numero(self,numero):
+        for l in self.__livres:
+            if l.get_numero() == numero:
+                return l
+        return None
+
+    def chercher_livre_titre(self,titre):
+        for l in self.__livres:
+            if l.get_titre() == titre:
+                return l
+        return None    
+        
+    def chercher_emprunt(self, numero_lecteur, numero_livre):
+        for e in self.__emprunts:
+            if e.get_numero_lecteur() == numero_lecteur and e.get_numero_livre() == numero_livre:
+                return e
+        return None
+
+    def emprunt_livre(self, numero_lecteur, numero_livre):
+        # On verifie que le numero de livre est valide
+        livre = self.chercher_livre_numero(numero_livre)
+        if livre == None:
+            print('Emprunt impossible : livre inexistant')
+            return None
+            
+        # On verifie qu'il reste des exemplaires disponibles pour ce livre
+        if livre.get_nb_dispo() == 0:
+            print('Emprunt impossible : plus d\'exemplaires disponibles')
+            return None
+            
+        # On verifie que le numero de lecteur est valide
+        lecteur = self.chercher_lecteur_numero(numero_lecteur)
+        if lecteur == None:
+            print('Emprunt impossible : lecteur inexistant')
+            return None
+        # On verifie que ce lecteur n'a pas deja emprunte ce livre
+        e = self.chercher_emprunt(numero_lecteur, numero_livre)
+        if e != None:
+            print('Emprunt impossible : deja en cours')
+            return None
+
+        # Les conditions sont reunies pour pouvoir faire cet emprunt            
+        self.__emprunts.append(Emprunt(numero_lecteur, numero_livre))
+        livre.set_nb_dispo(livre.get_nb_dispo()-1)
+        lecteur.set_nb_emprunts(lecteur.get_nb_emprunts()+1)
+        return self.__emprunts[-1]
+
+    def retour_livre(self, numero_lecteur, numero_livre):
+        # On recherche l'emprunt identifie par le numero de livre et de lecteur
+        e = self.chercher_emprunt(numero_lecteur, numero_livre)
+        if e != None: # l'emprunt existe, on le retire de la liste et on met a jour nb_emprunt pour le lecteur et nb_dispo pour le livre
+            self.__emprunts.remove(e)
+            lecteur = self.chercher_lecteur_numero(numero_lecteur)
+            if lecteur != None : lecteur.set_nb_emprunts(lecteur.get_nb_emprunts()-1)
+            livre = self.chercher_livre_numero(numero_livre)
+            if livre != None: livre.set_nb_dispo(livre.get_nb_dispo()+1)
+            print('Retour effectue')
+            return True
+        else:
+            print('Aucun emprunt ne correspond a ces informations')
+            return False
+        
+    def affiche_lecteurs(self):
+        for l in self.__lecteurs:
+            print(l)
+
+    def affiche_livres(self):
+        for l in self.__livres:
+            print(l)           
+            
+    def affiche_emprunts(self):
+        for e in self.__emprunts:
+            print(e)     
+           
diff --git a/TD2/correction/code/emprunt.py b/TD2/correction/code/emprunt.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ca812a9f9322525f814b71f624d75f64c5ab1c0
--- /dev/null
+++ b/TD2/correction/code/emprunt.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:27:13 2022
+
+@author: dellandrea
+"""
+
+from datetime import date
+from lecteur import *
+from livre import *
+
+# ***** classe Emprunt *****        
+class Emprunt:
+    def __init__(self,numero_lecteur,numero_livre):
+        self.__numero_lecteur = numero_lecteur
+        self.__numero_livre = numero_livre
+        self.__date = date.isoformat(date.today())
+
+    def get_numero_lecteur(self):
+        return self.__numero_lecteur
+        
+    def get_numero_livre(self):
+        return self.__numero_livre
+        
+    def get_date(self):
+        return self.__date
+
+    def __str__(self):
+        return 'Emprunt - Numero lecteur : {}, Numero livre: {}, Date : {}'.format(self.__numero_lecteur,self.__numero_livre,self.__date)
+  
\ No newline at end of file
diff --git a/TD2/correction/code/lecteur.py b/TD2/correction/code/lecteur.py
new file mode 100644
index 0000000000000000000000000000000000000000..5fca8b826a59cee5e379ce205faa32948d92a761
--- /dev/null
+++ b/TD2/correction/code/lecteur.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:25:52 2022
+
+@author: dellandrea
+"""
+
+from personne import *
+
+# ***** classe Lecteur *****        
+class Lecteur(Personne):
+    def __init__(self,nom,prenom,adresse,numero):
+        Personne.__init__(self,nom,prenom,adresse)        
+        self.__numero = numero
+        self.__nb_emprunts = 0
+        
+    def set_numero(self,numero):
+        self.__numero = numero
+        
+    def get_numero(self):
+        return self.__numero
+        
+    def set_nb_emprunts(self,nb_emprunts):
+        self.__nb_emprunts = nb_emprunts
+        
+    def get_nb_emprunts(self):
+        return self.__nb_emprunts
+        
+    def __str__(self): #Permet d'afficher les proprietes de l'objet avec la fonction print
+        return 'Lecteur - Nom : {}, Prenom : {}, Adresse : {}, Numero : {}, Nb emprunts : {}'.format(self.get_nom(),self.get_prenom(),self.get_adresse(),self.__numero,self.__nb_emprunts)
diff --git a/TD2/correction/code/livre.py b/TD2/correction/code/livre.py
new file mode 100644
index 0000000000000000000000000000000000000000..06ec6cca573cdd5325ea5e93f32e7cee6a0711e4
--- /dev/null
+++ b/TD2/correction/code/livre.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:26:54 2022
+
+@author: dellandrea
+"""
+
+# ***** classe Livre *****          
+class Livre:
+    def __init__(self,titre,auteur,numero,nb_total):
+        self.__titre = titre        
+        self.__auteur = auteur
+        self.__numero = numero
+        self.__nb_total = nb_total
+        self.__nb_dispo = nb_total
+
+    def set_auteur(self,auteur):
+        self.__auteur = auteur
+        
+    def get_auteur(self):
+        return self.__auteur
+        
+    def set_titre(self,titre):
+        self.__titre = titre
+        
+    def get_titre(self):
+        return self.__titre
+        
+    def set_numero(self,numero):
+        self.__numero = numero
+        
+    def get_numero(self):
+        return self.__numero
+    
+    def set_nb_total(self,nb_total):
+        self.__nb_total = nb_total
+        
+    def get_nb_total(self):
+        return self.__nb_total
+
+    def set_nb_dispo(self,nb_dispo):
+        self.__nb_dispo = nb_dispo
+        
+    def get_nb_dispo(self):
+        return self.__nb_dispo
+        
+    def __str__(self):
+        return 'Livre - Auteur : {}, Titre : {}, Numero : {}, Nb total : {}, Nb dispo : {}'.format(self.__auteur,self.__titre,self.__numero,self.__nb_total,self.__nb_dispo)
diff --git a/TD2/correction/code/personne.py b/TD2/correction/code/personne.py
new file mode 100644
index 0000000000000000000000000000000000000000..3acd65ef8a305d9301b8bbebab4fc76b26313ca7
--- /dev/null
+++ b/TD2/correction/code/personne.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:21:05 2022
+
+@author: dellandrea
+"""
+
+# ***** classe Personne *****
+class Personne:
+    def __init__(self,nom,prenom,adresse):
+        self.__nom = nom
+        self.__prenom = prenom
+        self.__adresse = adresse
+        
+    def __str__(self):
+        return f"Classe Personne - Nom : {self.__nom}, Prenom : {self.__prenom}, Adresse : {self.__adresse}"
+        
+    def set_nom(self,nom):
+        self.__nom = nom
+        
+    def get_nom(self):
+        return self.__nom
+        
+    def set_prenom(self,prenom):
+        self.__prenom = prenom
+        
+    def get_prenom(self):
+        return self.__prenom
+        
+    def set_adresse(self,adresse):
+        self.__adresse = adresse
+        
+    def get_adresse(self):
+        return self.__adresse
\ No newline at end of file
diff --git a/TD2/correction/code/test_bibliotheque.py b/TD2/correction/code/test_bibliotheque.py
new file mode 100755
index 0000000000000000000000000000000000000000..da5096ee2c8fa3bd0e96c6ab6853fb1924c0f275
--- /dev/null
+++ b/TD2/correction/code/test_bibliotheque.py
@@ -0,0 +1,171 @@
+# -*- coding: utf-8 -*-
+"""
+
+@author: dellandrea
+"""
+
+from bibliotheque import *
+
+# Creation d'une bibliotheque
+b = Bibliotheque('Bibliotheque ECL')
+
+# Ajout de lecteurs
+b.ajout_lecteur('Duval','Pierre','rue de la Paix',1)
+b.ajout_lecteur('Dupond','Laurent','rue de la Gare',2)
+b.ajout_lecteur('Martin','Marie','rue La Fayette',3)
+b.ajout_lecteur('Dubois','Sophie','rue du Stade',4)
+
+# Ajout de livres
+b.ajout_livre('Le Pere Goriot','Honore de Balzac',101,2)
+b.ajout_livre('Les Hauts de Hurlevent','Emilie Bronte',102,2)
+b.ajout_livre('Le Petit Prince','Antoine de Saint Exupery',103,2)
+b.ajout_livre('L\'Etranger','Albert Camus',104,2)
+
+# Affichage des lecteurs et des livres
+print('\n--- Liste des lecteurs :')
+print('-------------------------------')
+b.affiche_lecteurs()
+print('\n--- Liste des livres :')
+print('-------------------------------')
+b.affiche_livres()
+
+# Recherches de lecteurs par numero
+print('\n--- Recherche de lecteurs :')
+print('-------------------------------')
+lect = b.chercher_lecteur_numero(1)
+if lect != None:
+    print(lect)
+else:
+    print('Lecteur non trouve')
+
+lect = b.chercher_lecteur_numero(6)
+if lect != None:
+    print(lect)
+else:
+    print('Lecteur non trouve')
+
+# Recherches de lecteurs par nom
+lect = b.chercher_lecteur_nom('Martin','Marie')
+if lect != None:
+    print(lect)
+else:
+    print('Lecteur non trouve')
+    
+lect = b.chercher_lecteur_nom('Le Grand','Paul')
+if lect != None:
+    print(lect)
+else:
+    print('Lecteur non trouve')
+
+# Recherches de livres par numero
+print('\n--- Recherche de livres :')
+print('-------------------------------')
+livre = b.chercher_livre_numero(101)
+if livre != None:
+    print('Livre trouve :',livre)
+else:
+    print('Livre non trouve')
+
+livre = b.chercher_livre_numero(106)
+if livre != None:
+    print('Livre trouve :',livre)
+else:
+    print('Livre non trouve')
+
+# Recherches de livres par titre
+livre = b.chercher_livre_titre('Les Hauts de Hurlevent')
+if livre != None:
+    print('Livre trouve :',livre)
+else:
+    print('Livre non trouve')
+
+livre = b.chercher_livre_titre('Madame Bovarie')
+if livre != None:
+    print('Livre trouve :',livre)
+else:
+    print('Livre non trouve')
+
+# Quelques emprunts
+print('\n--- Quelques emprunts :')
+print('-------------------------------')
+b.emprunt_livre(1,101)
+b.emprunt_livre(1,104)
+b.emprunt_livre(2,101)
+b.emprunt_livre(2,105)
+b.emprunt_livre(3,101)
+b.emprunt_livre(3,104)
+b.emprunt_livre(4,102)
+b.emprunt_livre(4,103)
+
+# Affichage des emprunts, des lecteurs et des livres
+print('\n--- Liste des emprunts :')
+print('-------------------------------')
+b.affiche_emprunts()
+print('\n--- Liste des lecteurs :')
+print('-------------------------------')
+b.affiche_lecteurs()
+print('\n--- Liste des livres :')
+print('-------------------------------')
+b.affiche_livres()
+
+# Quelques retours de livres
+print('\n--- Quelques retours de livres :')
+print('-------------------------------')
+b.retour_livre(1,101)
+b.retour_livre(1,102)
+b.retour_livre(3,104)
+b.retour_livre(10,108)
+
+# Affichage des emprunts, des lecteurs et des livres
+print('\n--- Liste des emprunts :')
+print('-------------------------------')
+b.affiche_emprunts()
+print('\n--- Liste des lecteurs :')
+print('-------------------------------')
+b.affiche_lecteurs()
+print('\n--- Liste des livres :')
+print('-------------------------------')
+b.affiche_livres()
+
+# Suppression de quelques livres
+rep = b.retrait_livre(101)
+if not rep:
+    print('Retrait du livre impossible')
+else:
+    print('Retrait du livre effectue')
+
+b.retour_livre(2,101)
+
+rep = b.retrait_livre(101)
+if not rep:
+    print('Retrait du livre impossible')
+else:
+    print('Retrait du livre effectue')
+
+# Suppression de quelques lecteurs
+rep = b.retrait_lecteur(1)
+if not rep:
+    print('Retrait du lecteur impossible')
+else:
+    print('Retrait du lecteur effectue')
+
+b.retour_livre(1,104)
+
+rep = b.retrait_lecteur(1)
+if not rep:
+    print('Retrait du lecteur impossible')
+else:
+    print('Retrait du lecteur effectue')
+
+# Affichage des emprunts, des lecteurs et des livres
+print('\n--- Liste des emprunts :')
+print('-------------------------------')
+b.affiche_emprunts()
+print('\n--- Liste des lecteurs :')
+print('-------------------------------')
+b.affiche_lecteurs()
+print('\n--- Liste des livres :')
+print('-------------------------------')
+b.affiche_livres()
+
+
diff --git a/TD2/correction/code/test_emprunt.py b/TD2/correction/code/test_emprunt.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f4f2f5614d9c57f166d8128d72f545d68a9975b
--- /dev/null
+++ b/TD2/correction/code/test_emprunt.py
@@ -0,0 +1,16 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:46:54 2022
+
+@author: dellandrea
+"""
+
+from emprunt import *
+
+e = Emprunt(3,5)
+print(e)
+
+print(e.get_numero_lecteur())
+print(e.get_numero_livre())
+print(e.get_date())
\ No newline at end of file
diff --git a/TD2/correction/code/test_lecteur.py b/TD2/correction/code/test_lecteur.py
new file mode 100644
index 0000000000000000000000000000000000000000..6cacc7ae3241f26279841088db0a2fe70daed211
--- /dev/null
+++ b/TD2/correction/code/test_lecteur.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:21:29 2022
+
+@author: dellandrea
+"""
+
+from lecteur import *
+
+l = Lecteur("Durand","Marie","Ecully",13)
+
+print(l)
+
+l.set_nom("Dupond")
+print(l.get_nom())
+
+    
+l.set_prenom("Emilie")
+print(l.get_prenom())
+    
+l.set_adresse("Lyon")
+print(l.get_adresse())   
+
+l.set_numero(14)
+print(l.get_numero())
+        
+l.set_nb_emprunts(2)
+print(l.get_nb_emprunts())
+
+print(l)
\ No newline at end of file
diff --git a/TD2/correction/code/test_livre.py b/TD2/correction/code/test_livre.py
new file mode 100644
index 0000000000000000000000000000000000000000..5a5cc23fd313cc67fb9553b22548c7c41c759f68
--- /dev/null
+++ b/TD2/correction/code/test_livre.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:41:02 2022
+
+@author: dellandrea
+"""
+
+from livre import *
+
+l = Livre('Le Pere Goriot','Honore de Balzac',101,2)
+print(l)
+
+l.set_auteur("Emilie Bronte")
+print(l.get_auteur())
+    
+l.set_titre("Les Hauts de Hurlevent")
+print(l.get_titre())
+    
+l.set_numero(102)
+print(l.get_numero())
+
+l.set_nb_total(5)
+print(l.get_nb_total())
+
+l.set_nb_dispo(4)
+print(l.get_nb_dispo())
+
+print(l)
\ No newline at end of file
diff --git a/TD2/correction/code/test_personne.py b/TD2/correction/code/test_personne.py
new file mode 100644
index 0000000000000000000000000000000000000000..1134161fc498ca55555c61607a2d72d5344983e5
--- /dev/null
+++ b/TD2/correction/code/test_personne.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Sep 20 07:21:29 2022
+
+@author: dellandrea
+"""
+
+from personne import *
+
+p = Personne("Durand","Marie","Ecully")
+
+print(p)
+
+p.set_nom("Dupond")
+print(p.get_nom())
+
+    
+p.set_prenom("Emilie")
+print(p.get_prenom())
+    
+p.set_adresse("Lyon")
+print(p.get_adresse())    
+
+print(p)
\ No newline at end of file
diff --git a/TD2/correction/diagramme_classes_biblio.png b/TD2/correction/diagramme_classes_biblio.png
new file mode 100644
index 0000000000000000000000000000000000000000..1248f4b9e31c6ee35c116a391ea8fa1ab8a4333e
Binary files /dev/null and b/TD2/correction/diagramme_classes_biblio.png differ
diff --git a/TD2/correction/diagramme_classes_biblio.vpd b/TD2/correction/diagramme_classes_biblio.vpd
new file mode 100644
index 0000000000000000000000000000000000000000..b49a0b316c8cb64ad9752c369290081b2d5dd98c
--- /dev/null
+++ b/TD2/correction/diagramme_classes_biblio.vpd
@@ -0,0 +1 @@
+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16lxy104
\ No newline at end of file