diff --git a/seance2_4h/seance2_4h.md b/seance2_4h/seance2_4h.md
index 3603acc9f297335398e936ca1bb4da572c5c3caa..5fa67a059b002817114a06cb32407b31c4a9e0b7 100644
--- a/seance2_4h/seance2_4h.md
+++ b/seance2_4h/seance2_4h.md
@@ -18,23 +18,17 @@ Les formes géométriques sont représentées par des classes, et l'héritage se
 
 <center><img src="figures/formes.svg" style="width:70%"/></center>
 
-__Exercice 1 -__ Représentez les 3 classes dans un diagramme de classes UML (_voir [diagrams.net](https://app.diagrams.net) pour dessiner en ligne, avec l'onglet UML sur la gauche de l'interface_). Il est recommandé de commencer les noms des classes par une majuscule et les attributs par une minuscule. Durant tout ce BE on considèrera uniquement des attributs privés.
-
-
-Les attributs `x` et `y` étant partagés par les trois classes et le cercle étant un cas particulier d'ellipse, on introduit l'héritage pour les regrouper. Toutes les formes géométriques hériteront d'une même classe __Forme__, et le cercle héritera de l'ellipse. L'intérêt de ces relations d'héritage est double :
-
-* Du point de vue des développeurs du module, les méthodes dont le code est identique entre formes (ex. translation) sont fusionnées dans __Forme__, réduisant la quantité de code à produire (et donc la multiplication des erreurs possibles).
-* Du point de vue des utilisateurs du module, on peut écrire du code qui manipule des rectangles et des ellipses (*p. ex.* système de collisions de formes) sans avoir à écrire du code séparément pour les rectangles et les ellipses. Cet aspect sera illustré dans un prochain BE.
+__Exercice 1 -__ Représentez les 3 classes dans un diagramme de classes UML (_voir [diagrams.net](https://app.diagrams.net) pour dessiner en ligne, avec l'onglet UML sur la gauche de l'interface_). Il est recommandé de commencer les noms des classes par une majuscule et les attributs par une minuscule. Durant tout ce BE on considérera uniquement des attributs privés.
 
 __Exercice 2 -__ Mettez à jour le diagramme UML en incluant la classe __Forme__ et les relations d'héritage. Seuls les attributs seront inclus pour le moment.
 
-Enfin, on vous demande de supporter a minima pour chaque forme les méthodes suivantes :
+__Exercice 3 -__ On vous demande de supporter a minima pour chaque forme les méthodes suivantes :
 
 * `translation(dx, dy)`, qui effectue une translation selon un vecteur donné.
 * `contient_point(x, y)`, qui renvoie `True` si et seulement si le point donné est à l'intérieur de la forme ou sur sa frontière.
 * `redimension_par_points(x0, y0, x1, y1)`, qui redimensionne la forme telle qu'elle soit incluse dans le rectangle de coins (`x0`, `y0`) et (`x1`, `y1`). Dans le cas du cercle, il faudra également qu'il soit le plus proche du premier coin. Cette méthode est utile par exemple dans [diagrams.net](https://app.diagrams.net) pour le tracé de formes par appui-déplacement de souris.
 
-__Exercice 3 -__ Complétez le diagramme UML avec ces méthodes. Les constructeurs devront également être renseignés (méthode `__init__` en _Python_), ainsi que les méthodes d'accès (les fameux _getter_/_setter_) et d'affichage (méthode `__str__`).
+Complétez le diagramme UML avec ces méthodes. Les constructeurs devront également être renseignés (méthode `__init__` en _Python_), ainsi que les méthodes d'accès (les fameux _getter_/_setter_) et d'affichage (méthode `__str__`).
 
 __Exercice 4 -__ Écrivez un squelette de code correspondant à votre diagramme UML, dans un fichier _formes.py_. Seuls les constructeurs devront être implémentés. À l'intérieur des autres méthodes, vous mettrez l'instruction `pass` de _Python_ (qui ne fait rien mais vous rappelle que le code est inachevé).
 
@@ -90,7 +84,7 @@ La vérification de cette condition est faite une fois au moment de son exécuti
 
 __Exercice 5 -__ Implémentez les méthodes d'affichage (`__str__`) de chacune des classes dans _formes.py_. Vous pourrez vérifier leur bon fonctionnement en exécutant _formes.py_ (bouton `Run File - F5`), puis par exemple avec une commande `print(Rectangle(0, 0, 10, 10))` dans la console _IPython_.
 
-__Exercice 6 -__ Implémentez les méthodes d'accès (_getter_/_setter_) pour les champs privés de chacune des classes. Pour vérifier que les champs sont bien privés, le code suivant __doit__ échouer avec une erreur `AttributeError` :
+__Exercice 6 -__ Implémentez les méthodes d'accès (_getter_/_setter_) pour les champs privés de chacune des classes. Pour vérifier que les champs sont bien privés, le code suivant __doit__ échouer avec une erreur de type `AttributeError` :
 
 ```python
 r = Rectangle(0, 0, 10, 10)
@@ -102,48 +96,8 @@ __Exercice 7 -__ Implémentez les méthodes `contient_point` des deux sous-class
 __Exercice 8 -__ Implémentez les méthodes `redimension_par_points` de chacune des sous-classes. Le fichier _test_formes.py_ doit à présent s'exécuter sans problème.
 
 
----
-## Tests unitaires (bonus)
-
-Une fois développées, vos classes vont être utilisées pour des besoins que vous n'aviez pas forcément anticipés. Elles vont évoluer également pour acquérir de nouvelles fonctionnalités, et vont gagner en complexité. Dans ces conditions, il est courant de voir apparaître des bugs. Une pratique répandue pour améliorer la qualité logicielle est de définir des _tests unitaires_, c'est-à-dire de créer des situations extrêmes et vérifier que vos fonctions donnent toujours de bons résultats. Les tests unitaires serviront à documenter les cas d'utilisation supportés, et également à vous assurer qu'une modification de votre code n'a pas introduit un bug (une _régression_).
-
-Voici une liste de tests relativement exhaustive pour la classe __Rectangle__
-
-```python
-def test_Rectangle():
-    r = Rectangle(-20, -10, 40, 20)
-    assert r.contient_point(0, 0)
-    assert r.contient_point(-20, 0)
-    assert r.contient_point(0, -10)
-    assert r.contient_point(20, 0)
-    assert r.contient_point(0, 10)
-    assert not r.contient_point(-40, 0)
-    assert not r.contient_point(0, -20)
-    assert not r.contient_point(40, 0)
-    assert not r.contient_point(0, 20)
-    assert not r.contient_point(-40, -20)
-    assert not r.contient_point(40, -20)
-    assert not r.contient_point(40, 20)
-    assert not r.contient_point(-40, 20)
-    reference = str(r)
-    r.redimension_par_points(-20, 10, 20, -10)
-    assert str(r) == reference
-    r.redimension_par_points(20, 10, -20, -10)
-    assert str(r) == reference
-    r.redimension_par_points(20, -10, -20, 10)
-    assert str(r) == reference
-    r.redimension_par_points(-20, -10, 20, 10)
-    assert str(r) == reference
-```
-
 __Exercice 9 -__ Exécutez ce test sur votre code, et corrigez les éventuels bugs. Représentez ensuite, dans un logiciel de dessin (ex. [diagrams.net](https://app.diagrams.net)), le rectangle et les positions des points qui sont testés. Quels bugs sont visés par chacun de ces tests ?
 
-La rédaction de tests unitaires consiste souvent à anticiper les bugs courants, pour améliorer la qualité du logiciel dès sa conception. On cherche donc délibérément à provoquer des situations difficiles à gérer (ex. points _sur_ le bord du rectangle). De telles situations sont par exemple :
-
-* le choix de `<` ou `<=` dans le code;
-* le traitement de valeurs négatives;
-* les erreurs d'arrondis dans les opérations avec `float`;
-* la gestion de valeurs nulles (ex. largeur ou hauteur).
 
 __Exercice 10 -__ Dessinez une ellipse dans votre logiciel de dessin, et représentez tous les points qu'il convient de tester avec `contient_point`. Pour chaque point (ou groupe de points), indiquez le type de bug qu'il vise en particulier. Implémentez ces tests dans _test_formes.py_.
 
diff --git a/seance3_4h/consignes_BE#3.md b/seance3_4h/consignes_BE#3.md
index 0e4932262dca575cc708723fbd007ce7fbb3a671..860bf89db19e4b6509f2a1c283ff177efdee864e 100644
--- a/seance3_4h/consignes_BE#3.md
+++ b/seance3_4h/consignes_BE#3.md
@@ -1,11 +1,11 @@
 ### Consignes pour le rendu (BE #3 - INF-TC2)
 
-Ce BE est le premier devoir à rendre concernant INF-TC2. Le compte-rendu (CR) de ce travail devra être déposé sur `Pedagogie1`, sur l'espace de dépôt spécifique à votre groupe. Et cela dans un **délai d'une semaine après la dernière séance consacrée à ce BE** (délai de rigueur, aucun travail accepté au delà de cette date). Cette semaine ne tient pas compte d'éventuelles vacances. Si vous avez un doute, le plus simple est de contrôler la date pour votre groupe sur `Pedagogie1`.
+Ce BE est le premier devoir à rendre concernant INF-TC2. Le compte-rendu (CR) de votre travail devra être déposé sur `Pedagogie1`, sur l'espace de dépôt spécifique à votre groupe. Et cela dans un **délai d'une semaine après la dernière séance consacrée à ce BE** (délai de rigueur, aucun travail accepté au delà de cette date). Cette semaine ne tient pas compte d'éventuelles vacances. Si vous avez un doute, le plus simple est de contrôler la date pour votre groupe sur `Pedagogie1`.
 
 **Consignes:**
 
- - Le travail peut être individuel ou en binôme. Si vous travaillez en binôme, **un seul dépôt suffit !**.    
- - Le dépôt consistera en une unique archive (zip, rar) contenant l'ensemble des fichiers suivants :   
+  - Le travail peut être individuel ou en binôme. Si vous travaillez en binôme, **un seul dépôt suffit !**.    
+  - Le dépôt consistera en une unique archive (zip, rar ou tgz) contenant l'ensemble des fichiers suivants :   
      - La base de données *Hotellerie.db*, après exécution des requêtes de l'énoncé. 
      - Le fichier _HotelDB.py_, contenant la classe **HotelDB** et un programme principal permettant de rejouer l'ensemble des requêtes de cet énoncé.
      - La base de données de votre choix pour les 2 requêtes libres : si vous choisissez cette option, n'oubliez pas d'inclure la nouvelle bdd dans votre archive (si elle est très volumineuse, donnez uniquement le chemin de téléchargement dans votre rapport), ainsi que le fichier _Python_ qui réalise les requêtes que vous aurez imaginées. 
@@ -14,13 +14,17 @@ Ce BE est le premier devoir à rendre concernant INF-TC2. Le compte-rendu (CR) d
          - des commentaires sur la programmation de chacune des requêtes et les résultats obtenus.    
          - tout diagramme, toute figure ou toute explication que vous jugerez utile, mais dans un **nombre de pages limité à 10** (il n'est pas demandé de rédiger 10 pages, c'est une limite à ne pas dépasser !).
 
- - L'archive devra nécessairement porter le nom suivant : *nom1-BE3.zip* ou *nom1-nom2-BE3.zip* (pour les étourdis, pensez à remplacer *nom1* et *nom2* par vos propres noms :-) )
+  - L'archive devra nécessairement porter le nom suivant : *nom1-BE3.zip* ou *nom1-nom2-BE3.zip* (pour les étourdis, pensez à remplacer *nom1* et *nom2* par vos propres noms :-) )
 
 **Critères d'évaluation du travail**
 
 Voici une liste (non exhaustive) de critères qui permettront à vos encadrants d'évaluer vos requêtes :
 
- - **Qualité du rapport** : apparence visuelle globale, orthographe, structure du rapport claire et cohérente. Qualité des représentations graphique(légendes, label axes...)    
- - **Qualité de l'API** : choix des noms et arguments des méthodes, pas de requêtes SQL hors de la classe,  affichages textuel ou graphique forcément en dehors des méthodes-requêtes.   
-  - **Qualité du code** : est-ce qu'il fonctionne sans erreur, le code est-il suffisamment commenté et aéré ? Tests multiples avec des paramètres inattendus ou erronés. Interception des erreurs par des exceptions.   
- - **Qualité des requêtes** : originalité et justification de l'intérêt, difficulté technique, valorisation dans le rapport.
\ No newline at end of file
+- **Qualité du rapport** : apparence visuelle globale, orthographe, structure du rapport claire et cohérente. Qualité des représentations graphique (légendes, label sur les axes...).    
+
+- **Qualité de l'API** : choix des noms et arguments des méthodes, pas de requêtes SQL hors de la classe, affichages textuel et graphique forcément en dehors des méthodes-requêtes.   
+
+- **Qualité du code** : est-ce qu'il fonctionne sans erreur, le code est-il suffisamment commenté et aéré ? Tests multiples avec des paramètres inattendus ou erronés. Interception des erreurs potentielles par des exceptions.   
+
+- **Qualité des requêtes** : originalité et justification de l'intérêt, difficulté technique, valorisation dans le rapport.
+ 
\ No newline at end of file
diff --git a/seance3_4h/seance3_4h.md b/seance3_4h/seance3_4h.md
index 662bdea364c7c838bf8dafa6d4e59e637e80d38d..44f49e76b9b3ab2fd5700d900f4f83486bb0eeef 100644
--- a/seance3_4h/seance3_4h.md
+++ b/seance3_4h/seance3_4h.md
@@ -4,18 +4,18 @@
 
 # BE #3 : Exceptions et Base de données SQL
 
-L'objectif principal de ce BE concerne l'utilisation **des exceptions** pour améliorer la robustesse d'un code. Pour expérimenter ce concept clé, nous nous servirons du prétexte de la manipulation de bases de données à l'aide de requêtes _SQL_ (*Structured Query Language*), écrites en _Python_. Ce BE est décomposé en trois parties:
+L'objectif principal de ce BE concerne l'utilisation **des exceptions** pour améliorer la robustesse d'un code. Pour expérimenter ce concept clé, nous nous servirons du prétexte de la manipulation de bases de données à l'aide de requêtes _SQL_ (*Structured Query Language*), écrites en _Python_. Ce BE est décomposé en trois parties :
 
   1. **La première partie** (durée: 45 min.) présente quelques commandes élémentaires pour interroger une base _SQL_ à partir de _Python_;
   1. **La seconde partie** (durée: 75 min.) permet de découvrir comment manipuler une base de données _SQL_ en _Python_ orienté objet.    
-  1. **La troisième partie** (durée: 120 min. et +) vous engage dans un travail plus personnalisé, pour mettre à profit vos connaissances sur la gestion des exceptions, la librairie graphique *matplotlib* et bien sûr le langage d'interrogation de bases _SQL_.
+  1. **La troisième partie** (durée: 120 min. et +) vous engage dans un travail plus personnalisé, pour mettre à profit vos connaissances sur la gestion des exceptions, la librairie graphique *matplotlib* et le langage d'interrogation de bases _SQL_.
 
 Ce BE fera l'objet d'un compte-rendu (CR), seul ou en binôme. Avant de commencer, veuillez prendre connaissance des consignes concernant le rendu du travail (à respecter scrupuleusement) qui se trouvent dans le fichier [consignes_BE#3.md](./consignes_BE#3.md) (dans le même répertoire que cet énoncé). Les critères de notations y sont donnés.
 
 --- 
 ## 1. Mini-tutoriel sur la base Hotellerie.db (45 min.)
 
-Le système de gestion de base de données qui sera utilisé durant ce BE est _SQLite_. Ce système très simple fonctionne en stockant une base de données dans un fichier d'extension _.sqlite_. La base de tests que nous allons utiliser dans cette partie (_hotellerie.db_) est disponible au même endroit que cet énoncé. Son schéma est le suivant :
+Le système de gestion de base de données qui sera utilisé durant ce BE est _SQLite_. Ce système très simple stocke une base de données dans un fichier d'extension _.sqlite_. La base de tests que nous allons utiliser dans cette partie (_hotellerie.db_) est disponible au même endroit que cet énoncé. Son schéma est le suivant :
 
 <center><img src="figures/schema_bdd_hotellerie.png" style="width:70%"/></center>
 
@@ -27,14 +27,14 @@ La base est composée de 5 tables, ces tables étant composées d'un nombre vari
 
 ### 1.1 DB browser for SQLite (15 min.)
 
-Toutes les opérations sur une base de données de ce type peuvent être effectuées en _Python_ via les classes et les méthodes  présentes au sein du module _sqlite3_. Pour manipuler de manière interactive le contenu de la base (créer, supprimer ou modifier des tables et des enregistrements, effectuer des requêtes _SQL_...), il existe des outils adaptés. L'outil retenu dans le cadre de ce BE s'appelle ``DB Browser for SQLite``. C'est un logiciel libre qui existe pour toutes les plate-formes : Windows, MacOs, nombreuses distributions Linux et Unix...
+Toutes les opérations sur une base de données de ce type peuvent être effectuées en _Python_ via les classes et les méthodes présentes au sein du module _sqlite3_. Pour manipuler de manière interactive le contenu de la base (créer, supprimer ou modifier des tables et des enregistrements, effectuer des requêtes _SQL_...), il existe des outils adaptés. L'outil retenu dans le cadre de ce BE s'appelle ``DB Browser for SQLite``. C'est un logiciel libre qui existe pour toutes les plate-formes : _Windows_, _MacOs_, nombreuses distributions _Linux_ et _Unix_...
 
  - Téléchargez et installez [DB Browser for SQLite](https://sqlitebrowser.org/) en suivant les instructions d'installation adaptées à votre système d'exploitation.    
- - Avec ce logiciel, ouvrez la base *hotellerie.db* et naviguez dans les tables (onglet ``Structure de la Base de Données``) et les enregistrements (onglet ``Parcourir les données``) pour prendre connaissance de la base (telle qu'elle est schématisée ci-dessus).
+ - Avec ce logiciel, ouvrez la base *hotellerie.db* et naviguez dans les tables (onglet `Structure de la Base de Données`) et les enregistrements (onglet `Parcourir les données`) pour prendre connaissance de la base (telle qu'elle est schématisée ci-dessus).
 
 <center><img src="figures/DBBrowser.png" style="width:75%"/></center>
 
- - Dans l'onglet ``Exécuter le SQL``, lancez la requête suivante   
+ - Dans l'onglet `Exécuter le SQL`, lancez la requête suivante   
 ```SQL
 SELECT nom, ville
 FROM hotel;
@@ -45,9 +45,10 @@ La réponse apparaît sous forme de 12 lignes. Ça vous rappelle des choses ? Si
     - et tant d'autres...
 
 
+
 ### 1.2 Quelques requêtes en _Python_ (15 min.)
 
-**Attention** Avant de lancer un requête sur la bdd avec _Python_, il est fortement conseillé de fermer ``DB Browser for SQLite``, sinon vous pourriez soit avoir un plantage de votre programme, soit détruire la bdd (auquel cas il vous suffirait de la télécharger à nouveau).
+**Attention** Avant de lancer un requête sur la bdd avec _Python_, il est fortement conseillé de fermer `DB Browser for SQLite`, sinon vous pourriez soit avoir un plantage de votre programme, soit détruire la bdd (auquel cas il vous suffirait de la télécharger à nouveau).
 
 Nous allons à présent chercher à reproduire la requête ci-dessus en utilisant _Python_ et le package  _sqlite3_.  C'est une librairie objet dont la [documentation](https://docs.python.org/3/library/sqlite3.html#module-sqlite3) fournit une description des classes et des méthodes disponibles. Suivez le guide...
 
@@ -82,8 +83,8 @@ if __name__ == '__main__':
 
 _Remarques_ 
 
- - La commande ```conn.commit()``` n'est pas nécessaire ici puisque le script est une requête en lecture ; elle ne modifie donc pas la bdd.     
- - Notez que la méthode ```fetchone()``` retire le résultat de la liste des résultats. Pour preuve: ce résultat n'est pas présent suite à l’affichage du ```fetchall()```.
+ - La commande `conn.commit()` n'est pas nécessaire ici puisque le script est une requête en lecture ; elle ne modifie donc pas la bdd.     
+ - Notez que la méthode `fetchone()` retire le résultat de la liste des résultats. Pour preuve: ce résultat n'est pas présent suite à l’affichage du `fetchall()`.
 
 Copiez et exécutez ce programme ; le résultat se présente sous forme d'un tuple, ou sous forme d'une liste de tuples. Ainsi la commande suivante imprime le nom du premier hôtel qui apparaît dans la liste des résultats de la requête :
 ```python
@@ -111,7 +112,7 @@ Les quelques lignes de code que nous venons d'étudier peuvent être à l'origin
  - le nom des tables ou des champs dans la requête sont erronés;    
  - ...
 
-Voyons maintenant comment intercepter les exceptions lancées dans ces cas de figure par les méthodes de la librairie ```sqlite3```. Pour cela, veuillez d'abord copier et exécuter le programme suivant :
+Voyons maintenant comment intercepter les exceptions lancées dans ces cas de figure par les méthodes de la librairie `sqlite3`. Pour cela, veuillez d'abord copier et exécuter le programme suivant :
 
 ```python
 import sqlite3
@@ -122,8 +123,8 @@ if __name__ == '__main__':
 		curseur.execute("SELECT nom, ville FROM hotel;")
 		print(curseur.fetchall())
 	except Exception as err:                                # interception d'une exception quelconque
-		print('type exception: ', type(err).__name__)
-		print('err: ', str(err))
+		print('err:', str(err))
+		print('type exception:', type(err).__name__)
 	finally:                                                # fermeture de la base dans tous les cas
 		conn.close()
 ```
@@ -133,7 +134,7 @@ A priori, ce programme ne lance pas d'exception. Modifiez-le pour faire apparaî
  - Changez le nom de la bdd dans le programme, p. ex. _impossible.db_. Comment interprétez-vous le message d'erreur en observant le contenu de votre répertoire de travail ?
  - Revenez au nom correct du fichier : _hotellerie.db_. Testez alors le changement de nom des tables, puis des champs. 
 
-On constate que, dans chaque situation, l'exception `OperationalError` est lancée, avec des messages d'information différents qui précisent le type d'erreur. Remplacez alors le code ```except Exception as err:``` par le code ```except sqlite3.OperationalError as err:```, et vérifiez que cela fonctionne de la même manière que précédemment.
+On constate que, dans chaque situation, l'exception `OperationalError` est lancée, avec des messages d'information différents qui précisent le type d'erreur. Remplacez alors le code `except Exception as err:` par le code `except sqlite3.OperationalError as err:`, et vérifiez que cela fonctionne de la même manière que précédemment.
 
 La liste des exceptions lancées par l'usage de commandes `sqlite3` est disponible en suivant [ce lien](https://docs.python.org/3/library/sqlite3.html#exceptions). Prenez le temps de lire la description des différentes exceptions. Toutes les exceptions de ce module héritent d'une classe appelée __sqlite3.Error__ (elle-même héritant de la classe de base de gestion des exceptions de _Python_ : __Exception__).
 
@@ -175,10 +176,9 @@ __Améliorations à implémenter__ :
 Veillez à ce que ces _appels erronés_ renvoient une liste vide tout simplement.
 
 
-
 ### 2.2 Requête en écriture (45 min.)
 
-Créer une requête permettant d'ajouter un nouveau client et de renvoyer son identifiant (c'est à dire son _numclient_). Si le client existe déjà (même nom ET même prénom), la méthode renverra son _numclient_ (on supposera, pour des raisons de simplification, qu'il n'y a pas clients homonymes). Pour cette requête,  renseignez-vous sur la commande ``INSERT INTO``. _Attention_ la clé primaire sera renseignée automatiquement, pas besoin de la stipuler. Notez également que l'attribut _curseur.lastrowid_ permet de récupérer le _numclient_ du nouveau client. 
+Créer une requête permettant d'ajouter un nouveau client et de renvoyer son identifiant (c'est à dire son _numclient_). Si le client existe déjà (même nom ET même prénom), la méthode renverra son _numclient_ (on supposera, pour des raisons de simplification, qu'il n'y a pas clients homonymes). Pour cette requête,  renseignez-vous sur la commande `INSERT INTO`. _Attention_ la clé primaire sera renseignée automatiquement, pas besoin de la stipuler. Notez également que l'attribut _curseur.lastrowid_ permet de récupérer le _numclient_ du nouveau client. 
 
 Vérifier que le nouveau client a bien été sauvegardé dans le fichier *Hotellerie.db* :
 
@@ -191,7 +191,6 @@ _Remarques_ :
  - En cas de destruction de la base `Hotellerie.db` (les requêtes en écriture sont toujours plus dangereuses que les requêtes en lecture !), pensez à la télécharger à nouveau !
 
 
-
 ---
 ## 3. Requêtes libres (120 min. et +)
 
@@ -199,15 +198,16 @@ Dans cette dernière partie, nous vous invitons à imaginer et implémenter **DE
 
 Les résultats de vos requêtes devront faire l'objet d'une représentation graphique (graphe, histogramme, camembert...) en utilisant la librairie _Matplotlib_ (cf les remarques ci-dessous). 
 
-Vous pouvez "justifier" la robustesse de vos requêtes en écrivant, dans votre programme principal, plusieurs appels à vos requêtes avec des paramètres farfelus, erronés... Bonus à ceux qui développerons une exception propre !
+Vous pouvez _justifier_ la robustesse de vos requêtes en écrivant, dans votre programme principal, plusieurs appels à vos requêtes avec des paramètres farfelus, erronés... Bonus à ceux qui développerons une exception propre !
 
 ### Liens vers des Bdds `sqlite` 
 
 Voici quelques exemples de sites proposant des bdd _SQLite_ gratuites :
 
+  - Une base de données de films est étéchargeable en suivant [ce lien](https://1drv.ms/u/s!Ap1xZ3X70U50gvdIaHBrQ5uvSD-WSg?e=ncEblG). Elle est composée de 4 tables (acteur, réalisateur, film, distribution).
   - Le site [SQLite tutorial](https://www.sqlitetutorial.net/sqlite-sample-database/) propose un base de données appelée _chinook_ (_digital media store_), composée de 11 tables.
   - Dans le même genre, une base de données très célèbre : [Northwind](https://cs.ulb.ac.be/public/_media/teaching/infoh303/northwind_sqlite.db.zip) (8 tables).
-  - Si vous êtes fan des _Pokémon_, vous pouvez décompresser la base [veekun's Pokédex](http://veekun.com/static/pokedex/downloads/veekun-pokedex.sqlite.gz) (172 tables).
+  - Si vous êtes fan des _Pokémon_, vous pouvez décompresser la base [veekun's Pokédex](http://veekun.com/static/pokedex/downloads/veekun-pokedex.sqlite.gz) (172 tables !).
   - Si vous êtes fan de musique, vous pouvez décompresser et utiliser la base [musicBrainz](https://matthieu-moy.fr/cours/infocpp-S3/TPL/musicBrainz.zip) (4 tables).
   - Une petite base concernant la [peinture](https://carnot.cpge.info/wp-content/uploads/2020/02/peinture.db).
   - Beaucoup plus complexe : [murder-mystery](https://forge.univ-lyon1.fr/diu-eil/bloc4/-/raw/master/3_bases_de_donnees_introduction/TP/base-sql-murder-mystery.db) (9 tables). Lire le [site original](https://github.com/NUKnightLab/sql-mysteries).
@@ -219,7 +219,7 @@ Au cas où vous opteriez pour une bdd originale, n'oubliez pas d'inclure cette b
 
 ### Quelques conseils
 
-Les deux requêtes attendues doivent être relativement sophistiquées (pas de simples ```select XX from YY```).
+Les deux requêtes attendues doivent être relativement sophistiquées (pas de simples `select XX from YY`).
 
  - Si vous optez pour la bdd `Hotellerie.db`, n'hésitez pas à visiter un site de réservation d'hôtels pour trouver des idées de requêtes intéressantes. _Attention_ : le nom d'un hôtel n'est pas une clé primaire ! Plusieurs hôtels portent le même nom. Par contre, il n'existe pas 2 hôtels de même nom dans la même ville. Pensez-y !   
  - Si vous optez pour une autre base, développez une seconde classe dans un second fichier indépendant (sur le modèle de la classe **HotelDB**).
@@ -227,5 +227,6 @@ Les deux requêtes attendues doivent être relativement sophistiquées (pas de s
 
 **Remarques** : 
 
-- Vous programmerez les représentations graphiques dans le programme principal (et non pas dans la méthode qui traite la requête). En effet, quand on fait une requête sur une base de données, l'affichage graphique ne doit pas être obligatoire. C'est pour cela qu'on sépare la requête de l'affichage de son résultat (qu'il soit au format texte ou au format graphique).     
-- Usage de _Matplotlib_ : À titre d'exemples, vous trouverez, à côté de cet énoncé, un fichier nommé [ex_matplotlib.py](./ex_matplotlib.py). L'exécution de ce script génère 4 figures dans le sous-répertoire *figures*. Inspirez-vous largement de ce programme pour vos propres figures. *Conseil*: Évitez de vous lancer dans des requêtes avec des données géographiques, genre ```trouver tous les hôtels à moins de 5 kilomètres``` car l'usage de cartes géographiques dépasse les attentes de ce qui est demandé ici.
+- Vous programmerez les représentations graphiques dans le programme principal (et non pas dans la méthode qui traite la requête). En effet, quand on fait une requête sur une base de données, l'affichage graphique ne doit pas être obligatoire. C'est pour cela qu'on sépare la requête de l'affichage de son résultat (qu'il soit au format texte ou au format graphique).
+
+- Usage de _Matplotlib_ : À titre d'exemples, vous trouverez, à côté de cet énoncé, un fichier nommé [ex_matplotlib.py](./ex_matplotlib.py). L'exécution de ce script génère 4 figures dans le sous-répertoire *figures*. Inspirez-vous largement de ce programme pour vos propres figures. *Conseil*: Évitez de vous lancer dans des requêtes avec des données géographiques, genre `trouver tous les hôtels à moins de 5 kilomètres` car l'usage de cartes géographiques dépasse les attentes de ce qui est demandé ici.