Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
  • vS5_2020-2021
2 results

Target

Select target project
  • rvuillem/INF-TC2
  • teixeira/INF-TC2
  • mdemeill/INF-TC2
  • epelous/INF-TC2
  • rgayet/INF-TC2
  • gparamuc/INF-TC2
  • pdewilde/INF-TC2
  • bnegre/INF-TC2
  • elichiya/INF-TC2
  • amacgreg/INF-TC2
  • yjaid/INF-TC2
  • lcholley/INF-TC2
  • hwei/INF-TC2
  • lmelodef/INF-TC2
  • mnauche/INF-TC2
  • nbernier/INF-TC2
  • gbouvier/INF-TC2
  • lalbin/INF-TC2
  • jdelaffo/INF-TC2
  • ndjaoud/INF-TC2
20 results
Select Git revision
  • master
1 result
Show changes
Commits on Source (55)
Showing
with 388 additions and 184 deletions
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# fichier mac
.DS_Store
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
File added
File added
File added
**Sommaire**
[[TOC]]
# Informatique à l'ECL
*Remarque* Les liens vers les espaces Moodle sont ceux de 2020-2021. Je vous laisse rechercher les liens de ces mêmes cours pour l'année en cours !
---
## Enseignement de l'Informatique en 2A
### S7 - UE Approfondissement (App)
- [App 1-FH](https://pedagogie2.ec-lyon.fr/enrol/index.php?id=1105) - Multimédia : Concepts et technologies, [M. Ardabilian](mailto:mohsen.ardabilian@ec-lyon.fr), [E. Dellandréa](mailto:emmanuel.dellandrea@ec-lyon.fr)
- [App 2-FH](https://pedagogie2.ec-lyon.fr/enrol/index.php?id=1106) - Stratégies de résolution de problèmes, [A. Saidi](mailto:alexandre.saidi@ec-lyon.fr)
- [App 3-EG](https://pedagogie2.ec-lyon.fr/course/view.php?id=1107) - Applications concurrentes, mobiles et réparties en Java, [A. Saidi](mailto:alexandre.saidi@ec-lyon.fr), [S. Derrode](mailto:stephane.derrode@ec-lyon.fr)
- [App 4-EG](https://pedagogie2.ec-lyon.fr/enrol/index.php?id=1108) - Analyse de données et reconnaissance des formes, [L. Chen](liming.chen@ec-lyon.fr), [E. Dellandréa](mailto:emmanuel.dellandrea@ec-lyon.fr)
[*Détails des enseignements*](https://www.ec-lyon.fr/formation/ingenieure-generaliste/programme-formation/tronc-commun/offre-formation-tronc-commun?module=654102)
### S8 - UE Électifs (ELC)
- [ELC A11](https://pedagogie2.ec-lyon.fr/course/view.php?id=1137) - Programmation des interfaces graphiques en C++, [E. Dellandréa](mailto:emmanuel.dellandrea@ec-lyon.fr), [S. Derrode](mailto:stephane.derrode@ec-lyon.fr)
- [ELC B2](https://pedagogie2.ec-lyon.fr/enrol/index.php?id=1140) - Algorithme collaboratifs et applications, [P. Michel](philippe.michel@ec-lyon.fr), [A. Saidi](mailto:alexandre.saidi@ec-lyon.fr)
- [ELC C4](https://pedagogie2.ec-lyon.fr/enrol/index.php?id=1152) - Capteurs et traitement d'images, [L. Chen](liming.chen@ec-lyon.fr)
- [ELC D3](https://pedagogie2.ec-lyon.fr/enrol/index.php?id=1160) - Applications Web, [D. Muller](mailto:daniel.muller@ec-lyon.fr), [R. Chalon](rene.chalon@ec-lyon.fr)
- [ELC E1](https://pedagogie2.ec-lyon.fr/enrol/index.php?id=1170) - Algorithme et raisonnement, [A. Saidi](mailto:alexandre.saidi@ec-lyon.fr), [E. Dellandréa](mailto:emmanuel.dellandrea@ec-lyon.fr)
[*Détails des enseignements*](https://www.ec-lyon.fr/formation/ingenieure-generaliste/programme-formation/parcours-electif/offre-formation-parcours?module=654204)
---
## Césure 2A / 3A - Centrale Digital Lab
Une année de césure professionnalisante et en immersion dans le numérique
- 3 semaines de cours en *IA*, *Machine Learning*, *Big Data*, *Web*, *Data visualisation*
- 3 POC (*Proof-Of-Concept*) de 7 semaines, animés par des entreprises et en mode agile (formateurs CGI / Sopra)
- 1 stage en entreprise de 5 mois (à l'étranger)
Plus d'information?
- Teaser video : [youtube - Centrale Digital Lab](https://www.youtube.com/watch?v=dK0R9EFA4I8)
- Responsable du programme [René Chalon](mailto:rene.chalon@ec-lyon.fr)
- Plus d'information auprès de [Fatima Chouikhi](mailto:fatima.chouikhi@ec-lyon.fr)
- Site de l'ECL : [Centrale Digital Lab](https://www.ec-lyon.fr/formation/ingenieur-generaliste/construire-son-projet-professionnel/lyon-centrale-digital-lab)
---
## Enseignement de l'Informatique en 3A
### S9 – Modules Ouverts Disciplinaires (MOD)
- [MOD 2.1](https://pedagogie3.ec-lyon.fr/course/view.php?id=1210) - Défis informatique du Big Data, [S. Derrode](mailto:stephane.derrode@ec-lyon.fr)
- [MOD 3.2](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1203) - Apprentissage profond & Intelligence Artificielle, [L. Chen](liming.chen@ec-lyon.fr), A. Bosio, [E. Dellandréa](mailto:emmanuel.dellandrea@ec-lyon.fr)
- [MOD 4.4](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1241) - Recherche opérationnelle, [M. Zine](abdel-malek.zine@ec-lyon.fr), N. Bousquet, [A. Saidi](mailto:alexandre.saidi@ec-lyon.fr)
- [MOD 4.6](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1249) - Systèmes de bases de données, [L. Chen](liming.chen@ec-lyon.fr)
- [MOD 5.3](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1252) - Traitement et analyse des données visuelles et sonores, [M. Ardabilian](mailto:mohsen.ardabilian@ec-lyon.fr), [E. Dellandréa](mailto:emmanuel.dellandrea@ec-lyon.fr)
- [MOD 7.1](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1250) - Systèmes d'information en entreprise, [R. Vuillemot](mailto:romain.vuillemot@ec-lyon.fr)
- [MOD 7.2](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1218) - Introduction à la data science, [A. Saidi](mailto:alexandre.saidi@ec-lyon.fr)
- [MOD 8.4](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1243) - Représentation et manipulation de données structurées, [D. Muller](mailto:daniel.muller@ec-lyon.fr)
- [MOD 9.5](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1244) - Réseaux informatiques, [R. Chalon](rene.chalon@ec-lyon.fr)
[*Détails des enseignements*](https://www.ec-lyon.fr/formation/ingenieure-generaliste/programme-formation/parcours-electif/offre-formation-parcours?module=654017)
### S9 – Modules Ouverts Sectoriels (MOS)
- [MOS 4.3](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1423) - Informatique d'entreprise, [M. Ardabilian](mailto:mohsen.ardabilian@ec-lyon.fr), [D. Muller](mailto:daniel.muller@ec-lyon.fr)
- [MOS 2.2](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1424) - Informatique graphique, [M. Ardabilian](mailto:mohsen.ardabilian@ec-lyon.fr), N. Bonneel
- [MOS 4.4](https://pedagogie3.ec-lyon.fr/course/view.php?id=1430) - Nouvelles technologies de l'information et de la communication, [M. Ardabilian](mailto:mohsen.ardabilian@ec-lyon.fr), [D. Muller](mailto:daniel.muller@ec-lyon.fr)
- [MOS 5.5](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1440) - Visualisation interactive de données, [R. Vuillemot](mailto:romain.vuillemot@ec-lyon.fr)
[*Détails des enseignements*](https://www.ec-lyon.fr/formation/ingenieure-generaliste/programme-formation/parcours-electif/offre-formation-parcours?module=654023)
### S9 – Modules Spécifiques Option (MSO)
- [MSO 3.1](https://pedagogie3.ec-lyon.fr/course/view.php?id=1369) - Technologies informatiques du Big Data, [S. Derrode](mailto:stephane.derrode@ec-lyon.fr)
- [MSO 3.2](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1370) - Les systèmes d'information par la pratique, [R. Vuillemot](mailto:romain.vuillemot@ec-lyon.fr)
- [MSO 3.3](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1371) - Internet des objets, [R. Chalon](rene.chalon@ec-lyon.fr), [D. Muller](mailto:daniel.muller@ec-lyon.fr)
- [MSO 3.4](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1372) - Apprentissage automatique, [L. Chen](liming.chen@ec-lyon.fr), [E. Dellandréa](mailto:emmanuel.dellandrea@ec-lyon.fr)
- [MSO 3.5](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1373) - Vision par ordinateur, [M. Ardabilian](mailto:mohsen.ardabilian@ec-lyon.fr), [L. Chen](liming.chen@ec-lyon.fr)
- [MSO 3.6](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1374) - Calcul et modélisation géométrique pour l'info. graphique, [M. Ardabilian](mailto:mohsen.ardabilian@ec-lyon.fr)
- [MSO 3.7](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1375) - Apprentissage bayésien et exploration de textes, [A. Saidi](mailto:alexandre.saidi@ec-lyon.fr), [S. Derrode](mailto:stephane.derrode@ec-lyon.fr)
- [MSO 3.8](https://pedagogie3.ec-lyon.fr/enrol/index.php?id=1376) - Projet Informatique, toute l'équipe pédagogique
[*Détails des enseignements*](https://www.ec-lyon.fr/formation/ingenieure-generaliste/programme-formation/parcours-electif/offre-formation-parcours?module=654039)
File added
Chers étudiants,
*A compléter* ce _repo_ contient l'ensemble des sujets de BE pour l'enseignement `INF-TC2` de l'École centrale de Lyon. Pour consulter le sujet, il vous suffit de cliquer sur le fichier markdown (d'extension _.md_) dans le répertoire correspondant à la séance.
\ No newline at end of file
**Remarques**
- Pour rappel (vu en cours), les BE #3 et #5 seront évalués par votre encadrant. Les consignes pour le rendu sont précisées dans les répertoires respectifs.
- Les slides du cours sont disponibles sur [Moodle](https://pedagogie1.ec-lyon.fr/course/view.php?id=1024).
- Dans le répertoire _tuto-git-gitlab_, vous trouverez les scénarios des 2 tutos joués en direct dans le cours #4. C'est le moment de vous exercer...
Stéphane Derrode et Thibault Rafaillac
\ No newline at end of file
from Bibliotheque import Bibliotheque
from Lecteur import Lecteur
if __name__ == '__main__':
# Création d'une bibliothèque
MS = Bibliotheque('Michel Serre')
print("MS = ", MS) # Affichage attendu : "MS = Nom de la biblio : Michel Serre"
print("b1 = ", Bibliotheque(1)) # Affichage attendu : "b1 = Nom de la biblio : 1"
print('\n==>test bibliothèque vide')
# Recherches
print(MS.chercher_lecteur_numero(1)) # Affichage attendu : None
print(MS.chercher_livre_numero(1)) # Affichage attendu : None
print(MS.chercher_lecteur_nom('Levgueni Dimitri')) # Affichage attendu : None
print(MS.chercher_livre_titre('Les Hauts de Hurlevent')) # Affichage attendu : None
# Affichage
MS.affiche_livres() # Affichage attendu : (rien)
MS.affiche_lecteurs() # Affichage attendu : (rien)
MS.affiche_emprunts() # Affichage attendu : (rien)
print('\n==>test bibliothèque non vide mais sans emprunt')
MS.ajout_lecteur(Lecteur('Mzai Ahmed', 'Boulevard de la Paix', 1))
MS.ajout_lecteur(Lecteur('Xu John', 'Rue de la Gare', 2))
MS.ajout_livre('Le Père Goriot', 'Honoré de Balzac', -1, 101)
MS.ajout_livre("Léon l'Africain", 'Amin Maalouf', 2, 102)
MS.affiche_livres() # Affichage attendu : le premier livre doit afficher 0 exemplaire (et non -1!)
MS.affiche_lecteurs() # Affichage attendu : les 2 lecteurs
MS.affiche_emprunts() # Affichage attendu : (rien)
print(MS.chercher_lecteur_numero(1)) # Affichage attendu : le lecteur Mzai Ahmed
print(MS.chercher_livre_numero(1)) # Affichage attendu : None
print(MS.chercher_livre_numero(102)) # Affichage attendu : le livre Léon L'Africain
print(MS.chercher_lecteur_nom('Xu John')) # Affichage attendu : le lecteur Xu John
print(MS.chercher_livre_titre('Samarcande')) # Affichage attendu : None
print('\n==>test bibliothèque non vide et avec emprunt')
MS.emprunt_livre(8, 101) # Affichage attendu : Emprunt impossible : lecteur inexistant (car 0 livre dispo)
MS.emprunt_livre(1, 1001) # Affichage attendu : Emprunt impossible : livre inexistant (car 0 livre dispo)
MS.emprunt_livre(1, 101) # Affichage attendu : Emprunt impossible (car 0 livre dispo)
MS.emprunt_livre(1, 102) # Affichage attendu : (rien) (car l'emprunt est OK)
MS.affiche_emprunts() # Affichage attendu : Emprunt - Numero lecteur : 1, Numero livre: 102, Date : 2021-xx-yy
MS.retour_livre(33, 102) # Affichage attendu : Aucun emprunt ne correspond a ces informations : 33 102
MS.retour_livre(1, 102) # Affichage attendu : (rien) (le livre emprunté a bien été rendu)
MS.affiche_emprunts() # Affichage attendu : (rien) (car il n'y a aucun livre emprunté)
print(MS.retrait_livre(28)) # Affichage attendu : False
print(MS.retrait_livre(101)) # Affichage attendu : False (car il n'y a aucun exemplaire de ce livre)
MS.emprunt_livre(1, 102)
print(MS.retrait_livre(102)) # Affichage attendu : False car le livre est emprunté
MS.retour_livre(1, 102)
print(MS.retrait_livre(102)) # Affichage attendu : True
print(MS.retrait_lecteur(28)) # Affichage attendu : False
MS.ajout_livre("Léon l'Africain", 'Amin Maalouf', 2, 102)
MS.emprunt_livre(1, 102)
print(MS.retrait_lecteur(1)) # Affichage attendu : False (car emprunt en cours)
MS.retour_livre(1, 102)
print(MS.retrait_lecteur(1)) # Affichage attendu : True
seance1_4h/figures/AllClasses.png

29.7 KiB | W: 0px | H: 0px

seance1_4h/figures/AllClasses.png

15.7 KiB | W: 0px | H: 0px

seance1_4h/figures/AllClasses.png
seance1_4h/figures/AllClasses.png
seance1_4h/figures/AllClasses.png
seance1_4h/figures/AllClasses.png
  • 2-up
  • Swipe
  • Onion skin
seance1_4h/figures/Emprunt.png

30.4 KiB | W: 0px | H: 0px

seance1_4h/figures/Emprunt.png

12.1 KiB | W: 0px | H: 0px

seance1_4h/figures/Emprunt.png
seance1_4h/figures/Emprunt.png
seance1_4h/figures/Emprunt.png
seance1_4h/figures/Emprunt.png
  • 2-up
  • Swipe
  • Onion skin
seance1_4h/figures/LivreLecteur.png

64.6 KiB | W: 0px | H: 0px

seance1_4h/figures/LivreLecteur.png

32 KiB | W: 0px | H: 0px

seance1_4h/figures/LivreLecteur.png
seance1_4h/figures/LivreLecteur.png
seance1_4h/figures/LivreLecteur.png
seance1_4h/figures/LivreLecteur.png
  • 2-up
  • Swipe
  • Onion skin
<mxfile host="Electron" modified="2020-08-24T05:34:03.311Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.6.2 Chrome/83.0.4103.122 Electron/9.2.0 Safari/537.36" etag="JyznIXuSCOPoCPcxa0e5" version="13.6.2" type="device"><diagram name="Page-1" id="c4acf3e9-155e-7222-9cf6-157b1a14988f">7V19c5s2GP80vut2Z4537D9jJ223pVuu3dpm//SwkW21gDyQE7uffhIIg5BwnRiwc1XuerUeg4T0+/G86cUDaxpt3yT+evUOBSAcmHqwHVjXA9M0DN0l/1HJLpeMPCZYJjDIRXop+AC/A3ZnId3AAKRMloswQiGGa144R3EM5piT+UmCHvnLFigMOMHaXwJB8GHuh6L0EwzwivXC9Er5WwCXq6Jlwx3n38z8+bdlgjYxay9GMci/ifyiGtbHdOUH6LEism4G1jRBCOefou0UhHRY+RF73fDt/pETEONjbvhrsn1zf319Zf728Pbz/VWY/HkfDk2bPRzeFWMBAjI0rAjCGXq8KQWTrKuA1qiTEkrwCi1R7Ie3CK2J0CDCrwDjHYPY32BERFk1pPgAEgzJqBPRCkchuwFsIf5Ma9Q8hxXvWQP08/W2WtgVhTi4osCTYgD9CFEAqPA1DIt6U5ygb3s8bSIRh4yNYoo2yZz13/F062Pw7+6Ph9lvNykcfv5iXA8Ni7HST5YAH3EhHcVKEwySNwBFACc7ckECQh/DB56APuPxcn9dCSj5wDB9Cr7OBeGrwH02uN7rT8vVv5/m5upd4mzu8Mehlw6N0UFwS/ROR1gCp1GFU3N+ACjp7+dqoXIXLZa3ZaXivpRAgtmTmC7PjEzVVmlBb/i6idbs+pHAEvM0logkkaNyURwprM+DH274pmqsufVnoPbi+iFcxuTznIwVSIigeL+v2BcRDIKcVCCF3/1ZVh+FYY1gjLOuOJOBcy0d94OUpi2BLfe8zPazVjgjyo0ru2uoa2NDZ9XtuJqOHnlW+R3tTeUStFikhAJ1aPbPcAJahoCWrmm//hSA6dpIN3m8hhcPmDE+iwou1Klxgjq1jlCnov6sKdh2jW4/+rRGEkY/09I57lmGw1eR94jdVfWzaxVZpsVX5Np8RXmPhYpa0yHmi9Mh4/Z0iGe57gvT+dbLstCtgUUs9Mj2vIvHxxPwEeGRBSwVnEQ9WnrEmqOPq2rc0Mpygx4vI+YnBcyV8ImUKlo8q/0OJJCMFaVRdsNRqv2Qxq5qdmlwWmjYH6r2xzIn4zAtvaqkYwrZiRbA1j1ec1ij51kA2+ErGtXq6doAFC5ZRaFctgHYv2ItGADHsZzT6FA4n47menrlz+Rr6FDjjAUAL9yCtwcgMQqea7SEoNEBYodyAxXAbkmfwSYRMEsfYRT6mau9QDEuAoWjcMM0PJjMVzAMbv0d2lBEiEs//1aUJiuUwO+kWr80PLUESnnFB3onAz4jArgrYDZqonf+lrvw1k8xE8xRGPrrFM723YiIdoPxBGGMInbRghieKQpRko2BtVgszPl8bxYr3wTuzHXcQ8ZHyrDsEUA1Md7IL9OxOd3s2Mx4VGyMJ7ExpvtD9r2nNI+XZCCe1Jrhypqza9rGDwknYh+DCQ0e0y5ILMYNA5MAoccUx6uMxgmMlwKlCR5YAJOFk1XkmaigeQgWuJHk6dqfk7Zus2uy9C6TvGdjREWI3LsIM69rRVQaiLPYGvu4UaVNyFBPqddElJs5JWWjLGf6bk2i8SmKSV98mDEPEKo/Akp3CScP6oI6UUVK7nhqncDAY1OE0gd2GnBfk44q6DuF3jHPC73bAL0fEEWfAoV9h9h7o/NiL4a1Q6rsNxFIUA58EZ8o1NtD3dDt88IuZpsEjEOYYccnLYxnAbwPNRiif2cZ7qEhoG6JqFsShEMa7tyhFGKIaP1Jfq0kcjkLuNZxzuSoI2ztBnU+z8Zhk0UkrzRN+0W91q0jf2ZtLuZ8cuhJwPsl1+mvyGAo4FsH3j2zPhdzRTnwyxJ4vFuDX5RJ74wC49NTCCdRwGiK3P3FAs5X4JV67VuP2Y0zB+2G6MfdwocECEirhON5E46Oy/IrB1KAjvs05jQnHI9pTZ5wHNdWKfSQcDSa/FUMcQL+2jwk2bJtlYM4Wo1ZDZx9Su7xqWQ8TY01JR9jFF1tshkUhX+H+EsSkP3iL2YgsyzU7GYLonXow4RuC1Gea0fwS3KQ/cKvkpBnwV2WhewXeFm+QqUh24JXkoeUwdtVHtJoSkqoRGQP2J9Zp0t2nKhUZD/QS3KR/UIvroNSyci+SSDJRvZLgqZsZPb+Vx17pQa6ieklucl+GSCbY96rAY4BShN0yINiDeHZeNCU31PzEt2B7vbn/h3a/FHB/CZaJxvJC65mJs47M2Hr7K5DS6Fbm5k4pjXDlTVn1Nprd2ZCvp9BIHGZlvoSsqX9ynIJzDyoEU5aEN2rChP9lyr82TSrAr8j8GVLonsFX3RaKPgB0TdfALNkGfhUotBvGX3Zoug+0VerY7vDVrr0uZustPSB1erYsyFvnFmpN60yKPOShVenMhId0kC2SLpPGjRtd6rSgHp3igQdkkC2YLpPEsiO8yhIQH26Anzl33WBvmytdEfov4839/dvR1ej63+MWfTnAv4ef5WkpwSMTzrMxRtZA/4wF9ceXPJpLi/tlBZnVN9Sb2pujS3HHtRC6tJcmz8vyvYcbVz96+z0Lik/xczT5ZzdcvCF+umObpGOhhg/Xs7JLd3Cd/EHt0i7L4sJ2zQHpmvy5sAwfnRI4+Uc7nXsMbgvwWxYI0/jDxd1bJ1X9M+zIZZpa3sFs7chxO7rVll1zT51bEPEaPfCbUjxFiobQkdDjFIv3Ia0Bt/F2xC5phPwmsBZCBFegf82akPeM6e9A5gQ5uR5bOA3BKUtzYRbozGvv3XGwerctN7eqWBFEFwExcUhqJXm9vvxetykJ/8FCYmHpE4FO5QpOagkTpkEfzIFT/rpEFmytIbxTzgV1g64kkluKbgtTIVJH7gpB6qmwrpG3pWseur1tW46KMb/ShyI/SxYodSnFQVf/6xWb3fAj9G51X7j1q0VSOi/giL8Vh499wWaTr1VrDiNFbIJ9H5pUfxS3xG8QJFEfSiOdM4Ryex6zxyRb/+amoOrYsl/wZJUrf1vnwCSmfWeCSAPFnMC5P5FtrzigEehXIvu+CGZe++ZH/KNYRk/SjtCKSL3LqQHXClanJhokGwX7JkW8pWZMlpkJ0O9ElwKRYwuiCHZP9gzMeTrNnmHgmKv3IkuEpDd+ZOkWP7wdZ6pLn9Y3Lr5Hw==</diagram></mxfile>
\ No newline at end of file
seance1_4h/figures/LivreLecteurBiblio.png

72.4 KiB | W: 0px | H: 0px

seance1_4h/figures/LivreLecteurBiblio.png

34.3 KiB | W: 0px | H: 0px

seance1_4h/figures/LivreLecteurBiblio.png
seance1_4h/figures/LivreLecteurBiblio.png
seance1_4h/figures/LivreLecteurBiblio.png
seance1_4h/figures/LivreLecteurBiblio.png
  • 2-up
  • Swipe
  • Onion skin
seance1_4h/figures/LivreLecteurBiblio1.png

12 KiB

# <center>TD1 : Bibliothèque</center> **Sommaire**
[[_TOC_]]
_Remarque introductive_ : Les sujets de BE sont rédigés dans le format _Markdown_. # BE #1 : Bibliothèque
> _Markdown est un langage de balisage léger créé en 2004 par John Gruber avec l'aide d'Aaron Swartz. Son but est d'offrir une syntaxe facile à lire et à écrire. Un document balisé par Markdown peut être lu en l'état sans donner l'impression d'avoir été balisé ou formaté par des instructions particulières. Il peut être converti en HTML, en PDF ou en d'autres formats._
Si cela vous intéresse, vous trouverez des informations et un tutoriel en suivant ce lien : [Wikipédia markdown](https://fr.wikipedia.org/wiki/Markdown). Noter que savoir utiliser le format Markdown n'est pas nécessaire pour cet enseignement mais pourrait être d'un intérêt certain durant votre scolarité. Ici, il permet de faciliter les copier-coller de code que vous rencontrerez dans les sujets ; les formats propriétaires Word ou Pdf introduisent des caractères spéciaux ou cachés qui brouillent l'interpréteur Python, et génèrent bien souvent des incompréhensions pour les programmeurs débutants.
Pour améliorer la lisibilité, nous avons fait appel à quelques commandes html complémentaires.
--- ---
## Objectif du sujet
# Objectif du sujet Dans cet énoncé, nous abordons deux concepts fondamentaux de la programmation orientée objet (POO), __l'encapsulation__ et la __composition__, qui ont été vus lors du premier cours. Nous nous exercerons également aux [diagrammes de classe](https://fr.wikipedia.org/wiki/Diagramme_de_classes) du langage graphique [UML](https://fr.wikipedia.org/wiki/UML_(informatique)). Pour vos propres diagrammes, vous pouvez utiliser [diagrams](https://app.diagrams.net).
Dans cet énoncé, nous abordons deux concepts de base de la programmation orientée objet, __l'encapsulation__ et la __composition__, qui ont été abordées lors du premier cours. Nous nous exercerons également aux diagrammes de classe du langage graphique UML. Pour vos propres diagrammes, vous pouvez utiliser https://app.diagrams.net pour dessiner en ligne (et sauvegarder localement vos diagrammes sur votre machine).
Dans ce BE, il s'agit de concevoir et de réaliser un programme _simple_ de gestion d'une bibliothèque, intégrant des lecteurs, des livres et des emprunts. Dans ce BE, il s'agit de concevoir et de réaliser un programme _simple_ de gestion d'une bibliothèque, intégrant des lecteurs, des livres et des emprunts.
_Remarque_ : Cet énoncé part d'un problème simple et connu qui permet d'en faire la conception et la réalisation dans le temps qui nous est imparti par les contraintes scolaires. Les choix de conception et de réalisation sont donc orientés par ces contraintes et par les objectifs pédagogiques, à savoir : apprendre la programmation orientée objet en Python. Il est clair que le même problème dans un cadre professionnel serait traité d’une autre manière et une solution basée sur des bases de données émergerait naturellement, solution que nous écartons a priori car en dehors du périmètre de ce cours. _Remarque_ : Cet énoncé part d'un problème simple et connu qui permet d'en faire la conception et la réalisation dans le temps qui nous est imparti. Les choix de conception et de réalisation sont donc orientés par ces contraintes et par les objectifs pédagogiques, à savoir : apprendre la POO en _Python_. Il est clair que le même problème dans un cadre professionnel serait traité d’une autre manière et une solution basée sur des bases de données émergerait naturellement, solution que nous écartons a priori car en dehors du périmètre de ce cours.
---
# Cahier des charges ## Cahier des charges
Le cahier des charges de notre application est décrit ci-dessous. Il est volontairement donné de manière informelle. Le cahier des charges de notre application est décrit ci-dessous. Il est volontairement donné de manière informelle.
On doit pouvoir gérer le fond documentaire d'une bibliothèque identifiée par son nom. On doit pouvoir gérer le fond documentaire d'une bibliothèque identifiée par son nom.
1. Pour simplifier, on considérera que tous les ouvrages sont des livres caractérisés par : 1. Notre application doit être capable de gérer des lecteurs. Chacun d’eux est caractérisé par :
- Son nom complet,
- Son adresse,
- Un numéro (entier positif attribué de manière unique par les bibliothécaires).
1. Pour simplifier, on considérera que tous les ouvrages sont des livres, caractérisés par :
- Le nom de l’auteur, - Le nom de l’auteur,
- Le titre de l’ouvrage, - Le titre de l’ouvrage,
- Un numéro de livre (attribué de manière unique par les bibliothécaires), - Un numéro de livre (attribué de manière unique par les bibliothécaires),
- Le nombre d’exemplaires achetés. - Le nombre d’exemplaires disponibles.
1. Notre application doit être capable de gérer également des lecteurs. Chacun d’eux est caractérisé par : 1. On doit pouvoir ajouter un lecteur à une bibliothèque à tout moment et rechercher un lecteur (par son numéro de lecteur). On doit également pouvoir ajouter des ouvrages (acquisition de livres), et rechercher un ouvrage (par son numéro de livre).
1. Tout lecteur peut emprunter des livres dans une ou plusieurs bibliothèques. Un lecteur peut emprunter plusieurs livres différents simultanément ou à des dates différentes et un même livre peut être emprunté par plusieurs lecteurs (s’il existe plusieurs exemplaires). Au moment de l’emprunt, il faut donc vérifier qu’un exemplaire de l'ouvrage est bien disponible et qu'il n'a pas été emprunté par le même lecteur. De manière symétrique, il faut également gérer le retour des livres.
- Son nom,
- Son prénom,
- Son adresse,
- Un numéro (entier positif attribué de manière unique par les bibliothécaires).
1. On doit pouvoir ajouter un lecteur à tout moment et bien sûr rechercher un lecteur (par son numéro de lecteur).
On doit également pouvoir ajouter des ouvrages (achat de livres), et rechercher un ouvrage (par numéro).
1. Tout lecteur peut emprunter des livres dans la bibliothèque. Un lecteur pour emprunter plusieurs livres différents simultanément ou à des dates différentes et un même livre peut être emprunté par plusieurs lecteurs (s’il existe plusieurs exemplaires). Au moment de l’emprunt, il faut donc vérifier qu’un exemplaire de l'ouvrage est bien disponible et qu'il n'a pas été emprunté par le même lecteur. De manière symétrique, il faut également gérer le retour des livres.
1. On désire également pouvoir éditer des états détaillés : 1. On désire également pouvoir éditer des états détaillés :
- Liste de tous les lecteurs - Liste de tous les lecteurs d'une bibliothèque
- Liste de tous les livres - Liste de tous les livres d'une bibliothèque
- Liste de tous les emprunts - Liste de tous les emprunts d'une bibliothèque
1. Da manière facultative, on souhaite pouvoir retirer un lecteur s'il n'a plus d'emprunt en cours, et retirer un exemplaire non emprunté d'un livre (désherbage ou vol). Un livre qui n'aurait plus d’exemplaire ne doit plus apparaître dans la liste des livres à disposition de la bibliothèque. 1. Da manière facultative, on souhaite pouvoir retirer un lecteur (s'il n'a plus d'emprunt en cours), et retirer un exemplaire non emprunté d'un livre (désherbage ou vol). Un livre qui n'aurait plus d’exemplaire ne doit plus apparaître dans la liste des livres à disposition de la bibliothèque.
Cet énoncé a pour objectif de vous accompagner pour répondre au cahier des charges, __suivez le guide...__ Cet énoncé a pour objectif de vous accompagner pour répondre au cahier des charges, __suivez le guide...__
_Remarque_ : Dans chaque titre de chapitre, vous verrez figurer un temps entre parenthèses : celui-ci correspond au temps approximatif à passer pour répondre aux questions du chapitre. Si vous prenez trop retard par rapport à ces _milestones_, demandez de l'aide à votre encadrant! _Remarque_ : Dans chaque titre de section, vous verrez figurer une durée entre parenthèses : celui-ci correspond au temps approximatif à passer pour répondre aux questions du chapitre. Si vous prenez trop de retard par rapport à ces _milestones_, demandez de l'aide à votre encadrant !
_Remarque_ : Même si ce n'est pas pas obligatoire, il vous est demandé de développer chaque classe dans un fichier python séparé (tous les fichiers seront enregistrés dans le même répertoire). _Remarque_ : Même si ce n'est pas pas obligatoire, il vous est demandé de développer chaque classe dans un fichier _Python_ séparé (pensez à enregistrer tous les fichiers dans le même répertoire).
--- ---
## Classe Lecteur et classe Livre (75 minutes)
# Classe Lecteur et classe Livre (75 minutes)
**Point 1. du cahier des charges** **Point 1. du cahier des charges**
1. Dessinez la boîte UML de la classe __Lecteur__, en respectant le cahier des charges ci-dessus et les conventions syntaxiques présentées en cours. 1. Dessinez la boîte UML de la classe __Lecteur__, en respectant le cahier des charges ci-dessus et les conventions syntaxiques présentées en cours.
* Quels attributs devront être publiques, lesquels devront être privés ? Pour rappel : selon les principes de l'encapsulation, un attribut devra être privé si on veut/peut exercer un contrôle dessus. * Quels attributs devront être publiques, lesquels devront être privés ? Pour rappel : selon les principes de l'encapsulation, un attribut devra être privé si on veut/peut exercer un contrôle dessus.
* Prévoyez une méthode qui affiche l'état d'un lecteur (pour rappel: l'état d'un objet est l'ensemble des valeurs de ses attributs à un instant donné). * Prévoyez une méthode qui affiche l'état d'un lecteur. Pour rappel : l'état d'un objet est l'ensemble des valeurs de ses attributs à un instant donné.
1. Dans un fichier appelé _Lecteur.py_, implémentez votre classe progressivement, et développez simultanément le programme principal qui permet de vérifier le comportement attendu de votre classe (vu en cours: un programme principal commence par la commande `if __name__ == '__main__')`. Pour être plus précis: 1. Dans un fichier appelé _Lecteur.py_, implémentez votre classe progressivement, et développez simultanément le programme principal qui permet de vérifier le comportement attendu de votre classe (vu en cours : un programme principal commence par la commande `if __name__ == '__main__':`.
Pour être plus précis:
* Écrivez en premier lieu le constructeur de votre classe et créez un ou deux lecteurs dans votre programme principal. L'exécution du programme ne produit aucun résultat visible mais elle permet de vérifier que le programme est syntaxiquement correct. Ne passez pas à la méthode suivante tant que l'exécution produit des erreurs. * Écrivez en premier lieu le constructeur de votre classe et créez deux lecteurs dans votre programme principal. L'exécution du programme ne produit aucun résultat visible mais elle permet de vérifier que le programme est syntaxiquement correct. Ne passez pas à la méthode suivante tant que l'exécution produit des erreurs.
* Passez ensuite au codage de la méthode d'affichage (méthode dont le nom est `__str__`). Testez cette méthode en modifiant votre programme principal pour qu'il affiche les deux lecteurs précédemment créés. L'exécution du programme vous donne-t-elle satisfaction ? * Passez ensuite au codage de la méthode d'affichage (méthode dont le nom est `__str__`). Testez cette méthode en modifiant votre programme principal pour qu'il affiche les deux lecteurs précédemment créés. L'exécution du programme vous donne-t-elle satisfaction ?
1. Continuez ainsi pour les méthodes que vous avez prévues. Il est fort probable que nous soyons amenés à revenir sur cette classe par la suite, pour la compléter avec de nouvelles méthodes. 1. Continuez de la même manière pour toutes les méthodes que vous avez prévues. Il est fort probable que nous soyons amenés à revenir sur les fonctionnalités de cette classe par la suite, pour la compléter avec de nouvelles méthodes et attributs.
Un programme principal typique aura l'allure suivante : Un programme principal typique aura l'allure suivante :
```python ```python
if __name__ == '__main__': if __name__ == '__main__':
# Des lecteurs # Des lecteurs
L1 = Lecteur('Mzai', 'Ahmed', 'rue de la Paix',1) L1 = Lecteur('Mzai Ahmed', 'Boulevard de la Paix', 1)
L2 = Lecteur('Dupond', 'John', 'rue de la Gare',2) L2 = Lecteur('Xu John', 'Rue de la Gare', 2)
L3 = Lecteur('Levgueni', 'Dimitri','rue La Fayette',3) L3 = Lecteur('Levgueni Dimitri', 'Impasse La Fayette', 3)
L4 = Lecteur('Rodriguez','Alfonso','rue du Stade', 4) L4 = Lecteur('Rodriguez Alfonso', 'Rue du Stade', 4)
print('L1 -->', L1) print('Lecteur 1 -->', L1)
print('L2 -->', L2) print('Lecteur 2 -->', L2)
print('L3 -->', L3) print('Lecteur 3 -->', L3)
print('L4 -->', L4) print('Lecteur 4 -->', L4)
``` ```
**Point 2. du cahier des charges** **Point 2. du cahier des charges**
...@@ -100,65 +93,68 @@ Un programme principal typique aura l'allure suivante: ...@@ -100,65 +93,68 @@ Un programme principal typique aura l'allure suivante:
# Des livres # Des livres
B1 = Livre('Le Père Goriot', 'Honoré de Balzac', 2, 101) B1 = Livre('Le Père Goriot', 'Honoré de Balzac', 2, 101)
B2 = Livre('Les Hauts de Hurlevent','Émilie Bronte', 2,102) B2 = Livre("Léon l'Africain", 'Amin Maalouf', 2, 102)
B3 = Livre('Le Petit Prince', 'Antoine de Saint-Éxupery', 2, 103) B3 = Livre('Le Petit Prince', 'Antoine de Saint-Éxupery', 2, 103)
B4 = Livre("L'Étranger", 'Albert Camus', 2, 104) B4 = Livre("L'Étranger", 'Albert Camus', 2, 104)
print('B1 -->', B1) print('Livre 1 -->', B1)
print('B2 -->', B2) print('Livre 2 -->', B2)
print('B3 -->', B3) print('Livre 3 -->', B3)
print('B4 -->', B4) print('Livre 4 -->', B4)
``` ```
---
# Classe Bibliothèque (75 minutes) ---
## Classe Bibliothèque (75 minutes)
**Points 3. et 5. du cahier des charges** **Points 3. et 5. (partiel) du cahier des charges**
1. Un bibliothèque gère une collection de livres et un répertoire de lecteurs (et des emprunts, mais nous verrons cela plus tard). Quels liens entre les classes __Bibliotheque__, __Livre__ et __Lecteur__ vous semblent les plus adaptés pour exprimer ces relations ? Dessinez alors le schéma UML entre ces 3 classes sur une feuille de papier. N'oubliez pas d'ajouter les cardinalité de part et d'autre des liens. 1. Un bibliothèque gère une collection de livres et un répertoire de lecteurs (et des emprunts, mais nous verrons cela plus tard). Quels types de lien entre les classes __Bibliotheque__ et __Livre__ d'une part, et entre les classes __Bibliotheque__ et __Lecteur__ d'autre part, vous semblent les plus adaptés pour exprimer ces relations ? *Tip* Si un livre appartient à une bibliothèque, un lecteur peut s'inscrire dans plusieurs bibliothèques (vous voyez la différence ?) ! Dessinez alors le schéma UML entre ces 3 classes. N'oubliez pas d'ajouter les cardinalités de part et d'autre des liens.
Dessinez ensuite le détail de la boîte UML de la classe __Bibliothèque__, de manière à répondre au point 3. du cahier des charges. Dessinez ensuite le détail de la boîte UML de la classe __Bibliothèque__, de manière à répondre au point 3. du cahier des charges.
1. Dans un nouveau fichier appelé _Bibliotheque.py_, commencez par coder le constructeur de la classe __Bibliotheque__, en choisissant la structure de données adéquate pour gérer les lecteurs et les livres. Créez un programme principal, dans lequel vous créerez une bibliothèque (de nom _Michel Serre_ ?). Codez ensuite la méthode `__str__` qui affiche simplement le nom de la bibliothèque. Testez dans votre programme principal. 1. Dans un nouveau fichier appelé _Bibliotheque.py_, commencez par coder le constructeur de la classe __Bibliotheque__, en choisissant la structure de données adéquate pour gérer les lecteurs et les livres. Créez un programme principal, dans lequel vous créerez une bibliothèque (de nom _Michel Serre_ ?). Codez ensuite la méthode `__str__` qui affiche simplement le nom de la bibliothèque. Testez dans votre programme principal.
1. On se concentre sur les lecteurs. Codez successivement l'implémentation des méthodes permettant 1. On se concentre sur les lecteurs. Codez successivement l'implémentation des méthodes permettant
* d'ajouter un lecteur (on fera l'hypothèse qu'on n'essaye pas d'ajouter un lecteur déjà présent), * d'ajouter un lecteur (on fera l'hypothèse que le numéro du lecteur est unique, sans vérification),
* d'afficher la liste des lecteurs de la bibliothèque, * d'afficher la liste des lecteurs de la bibliothèque,
* de chercher un lecteur par son numéro, * de chercher un lecteur par son numéro,
* de chercher un lecteur par son nom, * de chercher un lecteur par son nom,
N'oubliez pas de tester chacune des méthodes avant de passer à la suivante ! N'hésitez pas à compléter la classe __Lecteur__ s'il vous manque des méthodes... N'oubliez pas de tester chacune des méthodes avant de passer à la suivante ! N'hésitez pas à compléter la classe __Lecteur__ s'il vous manque des méthodes...
1. Faites de même avec les livres. On ne vérifiera pas si le livre déjà présent dans la collection avant de l'ajouter. 1. Faites de même avec les livres. On ne vérifiera pas si le livre est déjà présent dans la collection avant de l'ajouter.
# Les emprunts (90 minutes) ---
## Les emprunts (90 minutes)
**Points 4. et 5. du cahier des charges** **Points 4. et 5. (partiel) du cahier des charges**
Un emprunt serra modélisé par un objet qui associe un lecteur (connu par son identifiant) avec un livre (connu par son identifiant) à une date donnée. Un emprunt sera modélisé par un objet qui associe un lecteur (connu par son identifiant) avec un livre (lui aussi connu par son identifiant) à une date donnée.
1. Dessinez la boite UML de la classe __Emprunt__. Celle-ci doit permettre de créer un nouvel emprunt, et d'afficher son état. Prévoyez des getter pour les attributs privés. Comment modéliser en UML les relations de la classe __Emprunt__ avec les classes __Lecteur__ et __Livre__? 1. Dessinez la boite UML de la classe __Emprunt__. Celle-ci doit permettre de créer un nouvel emprunt, et d'afficher son état. Prévoyez des _getter_ (_i.e._ une méthode qui renvoie la valeur d'un attribut privé). Comment modéliser en UML les relations de la classe __Emprunt__ avec les classes __Lecteur__ et __Livre__ ?
1. Implémentez votre classe dans un fichier appelé _Emprunt.py_. Complétez, en parallèle de l'implémentation des méthodes, un programme principal qui pourra finalement avoir l'allure suivante: 1. Implémentez votre classe dans un fichier appelé _Emprunt.py_. Complétez, en parallèle de l'implémentation des méthodes, un programme principal qui pourra finalement avoir l'allure suivante:
```python ```python
if __name__ == '__main__': if __name__ == '__main__':
# Creation d'une Emprunt ...
E1 = Emprunt(1, 2)
print('E1 --> ', E1) # Création d'un emprunt entre un lecteur et un livre
print("Num lecteur de l'emprunt E1: ", E1.get_numero_lecteur()) E1 = Emprunt(1, 100)
print('Emprunt --> ', E1)
print("Num lecteur de l'emprunt : ", E1.get_numero_lecteur())
``` ```
Résultat: Résultat:
```console ```console
E1 --> Emprunt - Numero lecteur : 1, Numero livre: 2, Date : 2020-08-23 E1 --> Emprunt - Numero lecteur : 1, Numero livre: 100, Date : 2020-08-23
Num lecteur de l'emprunt E1: 1 Num lecteur de l'emprunt E1: 1
``` ```
_Remarque_ : Pour la date, on pourra utiliser l’instruction `date.isoformat(date.today())`, en ayant pris soin d'importer la librairie, à l'aide de la commande `from datetime import date` (à positionner tout en haut de la classe). _Remarque_ : Pour la date, on pourra utiliser l’instruction `date.isoformat(date.today())`, en ayant pris soin d'importer la librairie : `from datetime import date` (à positionner tout en haut de la classe).
1. À ce stade du développement, les emprunts sont indépendants de la bibliothèque. Compléter votre schéma UML précédent pour modéliser le fait que c'est la bibliothèque qui gère tous les emprunts. Quel nouvel attribut de la classe __Bibliotheque__ prévoyez-vous pour stocker la collection des emprunts ? 1. À ce stade du développement, les emprunts sont indépendants de la bibliothèque. Compléter votre schéma UML précédent pour modéliser le fait que c'est la bibliothèque qui gère tous les emprunts. Quel nouvel attribut de la classe __Bibliotheque__ prévoyez-vous pour stocker la collection des emprunts ?
...@@ -171,9 +167,8 @@ Un emprunt serra modélisé par un objet qui associe un lecteur (connu par son i ...@@ -171,9 +167,8 @@ Un emprunt serra modélisé par un objet qui associe un lecteur (connu par son i
_Tip_ : Pensez à _Tip_ : Pensez à
1. modifier la classe __Lecteur__ de manière à lui ajouter un compteur de livres empruntés (à sa création, un lecteur n'a pas d'emprunt). Prévoyez une méthode publique appelée `incremente_nb_emprunts()`. 1. modifier la classe __Lecteur__ de manière à lui ajouter un compteur de livres empruntés (à sa création, un lecteur n'a pas d'emprunt). Prévoyez une méthode publique appelée `incremente_nb_emprunts()`.
1. modifier la classe __Livre__ de manière à lui ajouter un compteur qui tient à jour le nombre d'exemplaires disponibles (à sa création, un livre à autant d'exemplaires disponibles qu'il a de nombre d'exemplaires). Prévoyez une méthode publique appelée `decremente__dispo()` qui décrémentera le nombre d'exemplaires disponibles et renverra `True` s'il reste au moins un exemplaire, sinon `False`. 1. modifier la classe __Livre__ de manière à lui ajouter un compteur qui tient à jour le nombre d'exemplaires disponibles (à sa création, un livre à autant d'exemplaires disponibles qu'il a de nombre d'exemplaires). Prévoyez une méthode publique appelée `decremente_dispo()` qui décrémentera le nombre d'exemplaires disponibles et renverra `True` s'il reste au moins un exemplaire, sinon `False`.
1. modifier les méthodes `__str__` des 2 classes pour y inclure l'affichage de leur nouvel attribut.
Pensez à modifier les méthodes `__str__` des 2 classes pour y inclure l'affichage de leur nouvel attribut.
Vous ajouterez également une méthode `affiche_emprunts()` pour visualiser la liste des emprunts et testerez vos nouvelles méthodes avant de passer à la suite. Pour tester votre méthode, ajouter ces quelques lignes à votre programme principal : Vous ajouterez également une méthode `affiche_emprunts()` pour visualiser la liste des emprunts et testerez vos nouvelles méthodes avant de passer à la suite. Pour tester votre méthode, ajouter ces quelques lignes à votre programme principal :
...@@ -208,9 +203,9 @@ Un emprunt serra modélisé par un objet qui associe un lecteur (connu par son i ...@@ -208,9 +203,9 @@ Un emprunt serra modélisé par un objet qui associe un lecteur (connu par son i
Emprunt - Numero lecteur : 2, Numero livre: 101, Date : 2020-08-23 Emprunt - Numero lecteur : 2, Numero livre: 101, Date : 2020-08-23
``` ```
1. Pour simuler le rendu d'un livre par un lecteur à la bibliothèque, implémentez une méthode _retour\_livre(self, numero_lecteur, numero_livre)_. Pour cela, on pourra faire appel à une __méthode privée__ appelée _\_\_chercher_emprunt(self, numero_lecteur, numero_livre)_ qui renverra l'instance de l'emprunt s'il fait partie de la liste des emprunts, ou _None_ dans le cas contraire. La méthode _retour\_livre_ affichera un message d'erreur si l'emprunt n'existe pas. Dans le cas contraire, détruisez l'emprunt et pensez à mettre à jour le nombre d’exemplaires du livre ainsi que le nombre d’emprunts du lecteur. 1. Pour simuler le rendu d'un livre par un lecteur à la bibliothèque, implémentez une méthode _retour\_livre(self, numero_lecteur, numero_livre)_. Pour coder cette méthode, on pourra faire appel à une __méthode privée__ appelée _\_\_chercher_emprunt(self, numero_lecteur, numero_livre)_ qui renverra l'instance de l'emprunt s'il fait partie de la liste des emprunts, ou _None_ dans le cas contraire. La méthode _retour\_livre_ affichera un message d'erreur si l'emprunt n'existe pas. Dans le cas contraire, détruisez l'emprunt et pensez à mettre à jour le nombre d’exemplaires du livre ainsi que le nombre d’emprunts du lecteur.
Tester le retour dans votre programme principal grâce au code suivant : Testez le retour dans votre programme principal grâce au code suivant :
``` python ``` python
if __name__ == '__main__': if __name__ == '__main__':
...@@ -232,102 +227,24 @@ Un emprunt serra modélisé par un objet qui associe un lecteur (connu par son i ...@@ -232,102 +227,24 @@ Un emprunt serra modélisé par un objet qui associe un lecteur (connu par son i
``` ```
# Questions ouvertes supplémentaires ---
## Crash-test
**Point 6. (facultatif) du cahier des charges** À ce stade, votre programme doit être fonctionnel, mais êtes-vous bien certains que l'ensemble de vos classes sont robustes ? Nous vous proposons de le vérifier à l'aide de ce [crash-test](crash_test_biblio.py), à télécharger à côté de vos fichiers.
1. Implémentez une méthode permettant de supprimer un livre (si tous les exemplaires sont rendus). Si, en lançant ce programme, vous obtenez des erreurs d'exécution, chercher à corriger vos méthodes. Les réponses attendues à chaque ligne de code sont données sous forme de commentaire dans le fichier. A vous de vérifier que tout est OK !
```python _Remarque_ : Pour établir la robustesse de ses programmes, on utilise la programmation par tests et les [tests unitaires](https://fr.wikipedia.org/wiki/Test_unitaire)...
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
```
Les commandes
```python ---
if __name__ == '__main__': ## Questions ouvertes supplémentaires
...
# Suppression de quelques livres **Point 6. (facultatif) du cahier des charges**
print('\n--- 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')
```
donnent
```console 1. Implémentez une méthode permettant de supprimer un livre (si tous les exemplaires sont rendus).
--- Suppression de quelques livres :
Retrait du livre impossible
Retrait du livre effectue
```
1. Implémentez une méthode permettant de supprimer un lecteur (si il n'est redevable d'aucun emprunt). 1. Implémentez une méthode permettant de supprimer un lecteur (si il n'est redevable d'aucun emprunt).
```python
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
```
Les commandes
```python
if __name__ == '__main__':
...
# Suppression de quelques lecteurs
print('\n--- 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')
```
donnent
``` console
--- Suppression de quelques lecteurs :
Retrait du lecteur impossible
Retrait du lecteur effectue
```
1. Un livre qui n'aurait plus d’exemplaire ne doit plus apparaître dans la liste des livres à disposition de la bibliothèque. 1. Un livre qui n'aurait plus d’exemplaire ne doit plus apparaître dans la liste des livres à disposition de la bibliothèque.
1. Comment implémenter un mécanisme de vérification de l'unicité de l'identifiant d'un lecteur et de celui d'un livre ? 1. Comment implémenter un mécanisme de vérification de l'unicité de l'identifiant d'un lecteur et de celui d'un livre ?
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="348px" height="181px" viewBox="-0.5 -0.5 348 181" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2020-09-02T07:51:36.488Z&quot; agent=&quot;5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36&quot; etag=&quot;fuW20ZwMJLSmCLgNqiah&quot; version=&quot;13.6.6&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;QcHEdDH7hetbROZjSo9L&quot; name=&quot;Page-1&quot;&gt;7Vptb5swEP41+biJd8LHkDabJrWa1kprP1rBCdYMjsBpyH79TLAD2CGFDPKyVZEifDZn5567x75zRuY0yr4kYBU+kADikaEF2ci8GxmGO3bYdy7YFgLLtQrBMkFBIdJLwRP6DblQ49I1CmBaG0gJwRSt6sI5iWM4pzUZSBKyqQ9bEFyfdQWWUBE8zQFWpT9RQMNCOjbcUv4VomUoZtYdr+iJgBjMf0kagoBsKiLzfmROE0Jo8RRlU4hz2wm7FO/NGnr3C0tgTNu8ED4uXp2H1ewh3fjPmanRb9rsE9fyBvCa/2C+WLoVFoBxMMkNyVpzDNIUzUemH9IIM4HOHtV1cKUwqJmWr+oLJBGkyZYN2JQGtbmRwoothSyBGFD0VgcEcFyXe3X7Gb4TxFZiaNwFDY3r2QqItLqKlKyTOeRvVQ0oKbKNdxRRkCwhVRSxh8rPLkU7fDpgZfz7WJlO3cTeiVDJevbrOxNU5vtQJWQdBzBXojFgNiGi8GkF5nnvhjFpHbcFwnhKMElYOyYxG+SnNCG/oBCODPN+4viOs+8RbHUU9jeYUJgdBV5Y1JOcX1i44hjWAcdwtWYfqFm9q4mtTtHAjRaANNzZXL+xuGiyfufAkBWdmcPsD9R6oDNF0cCouQpqmQIb4xFah6fOUBzLA0wGMFrG+Y7FYIRM7ueshNgRbMI7IhQE+TQHWbLOowsS0xmIEM4t9YwidnQ0tEe4Yd8/SATifsjQbjpSvEOGxlBkOFYA2v7XAJmmtP9bFwZIOEjnw1vKQpsePdO1sKhyVvB3H9bD5uQ5lykmq7SvnWAtS4LZPJFgZUXnJlhdzcPC2w3gfMghZ+shsC0psPWxfeHAVrMy/IFciwTi8pTcIkm7PkqGGaIvHND8+bXyfJdVG1vRiJm1XvjKdo3Xak/50q4l3mpEvKDUFhFRUGaLgdeymdgNDtp5M5EU6XIOPPRm0iY1xhit0ibe6ObKTaTRpmjh267p3fXDMIZcnzvAMLp2wIHkzb4/iuk13RWhr1dCXz8a+qcHsTDllcTmvowkoJXreW1j03C8z3Zd1ZkrILrTp080InwlwKmVC+9E4GQPkBUNDZuaYt/AaeHa3UMNx/1tTQ+Rfe591/twkTNQf4lzZxeRDwiqqqGv8NQyUHLDpdQB00VDTvRt9TB31nTRUEs0yQ0XWYeETt7z3UtDp9ZoVGLeJ0RpCFZwR8RkHZx0NfsX5ldY3HEnvjcb6lbXki4yxi0zphNudVmz/K9LwaflH4bM+z8=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><path d="M 7 30 L 320.63 30" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 325.88 30 L 318.88 33.5 L 320.63 30 L 318.88 26.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 167 10 L 167 163.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 167 168.88 L 163.5 161.88 L 167 163.63 L 170.5 161.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="197" y="80" width="40" height="70" fill="none" stroke="#ea6b66" pointer-events="all"/><path d="M 197 80 L 197 30" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 197 80 L 167 80" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><rect x="307" y="30" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 40px; margin-left: 308px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">x</div></div></div></foreignObject><text x="327" y="44" fill="#000000" font-family="Times New Roman" font-size="12px" text-anchor="middle">x</text></switch></g><rect x="137" y="160" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 170px; margin-left: 138px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">y</div></div></div></foreignObject><text x="157" y="174" fill="#000000" font-family="Times New Roman" font-size="12px" text-anchor="middle">y</text></switch></g><path d="M 247 145.88 L 247 84.12" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 247 148.88 L 245 144.88 L 247 145.88 L 249 144.88 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 247 81.12 L 249 85.12 L 247 84.12 L 245 85.12 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><rect x="237" y="105" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 115px; margin-left: 238px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">h</div></div></div></foreignObject><text x="257" y="119" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">h</text></switch></g><rect x="197" y="160" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 170px; margin-left: 198px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">l</div></div></div></foreignObject><text x="217" y="174" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">l</text></switch></g><path d="M 201.12 160 L 232.88 160" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 198.12 160 L 202.12 158 L 201.12 160 L 202.12 162 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 235.88 160 L 231.88 162 L 232.88 160 L 231.88 158 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="77" cy="90" rx="50" ry="30" fill="none" stroke="#b5739d" pointer-events="all"/><path d="M 77 90 L 76.5 30" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 167 89 L 77 89" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 76.5 115.88 L 76.5 94.12" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 76.5 118.88 L 74.5 114.88 L 76.5 115.88 L 78.5 114.88 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 76.5 91.12 L 78.5 95.12 L 76.5 94.12 L 74.5 95.12 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 72.88 89.5 L 31.12 89.5" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 75.88 89.5 L 71.88 91.5 L 72.88 89.5 L 71.88 87.5 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 28.12 89.5 L 32.12 87.5 L 31.12 89.5 L 32.12 91.5 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><rect x="37" y="70" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 80px; margin-left: 38px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">rx</div></div></div></foreignObject><text x="57" y="84" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">rx</text></switch></g><rect x="67" y="90" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 100px; margin-left: 68px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ry</div></div></div></foreignObject><text x="87" y="104" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">ry</text></switch></g><path d="M 232 17.5 C 212 17.5 207 35 223 38.5 C 207 46.2 225 63 238 56 C 247 70 277 70 287 56 C 307 56 307 42 294.5 35 C 307 21 287 7 269.5 14 C 257 3.5 237 3.5 232 17.5 Z" fill="none" stroke="#67ab9f" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://desk.draw.io/support/solutions/articles/16000042487" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="348px" height="178px" viewBox="-0.5 -0.5 348 178" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-02-03T10:00:13.339Z&quot; agent=&quot;5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36&quot; etag=&quot;zTwWWkFEss1UvUfIIp7S&quot; version=&quot;14.2.9&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;QcHEdDH7hetbROZjSo9L&quot; name=&quot;Page-1&quot;&gt;7Vtdc5s6EP01fuwdQAaHx9j56HQmnbbp3Js8MkY2agVyhRLj/vorjMSHBAm4YOM0kxkPWmCRz9k90i7OBCzC5JZ6m+CO+BBPLMNPJuBqYlnAAvwzNewygy0Na4r8zGQWhnv0GwqjIaxPyIdx5UJGCGZoUzUuSRTBJavYPErJtnrZiuDqUzfeGmqG+6WHdet/yGdBZr2wZoX9I0TrQD7ZdNzsTOjJi8U3iQPPJ9uSCVxPwIISwrKjMFlAnGInccnuu2k4m0+Mwoi1uSH4vHp07jY3d/F2/j0BBvtk3HwQXp49/CS+sJgs20kEYORfpkDy0RJ7cYyWEzAPWIi5weSH+jyEU+hXoBWzuoUkhIzu+AXbAlBbgBSUsJQ2CrHH0HOVEE/wus7d5U/4QhCfiWWIELQM4WcnKTKqLmLyRJdQ3FUGUHFkW684Yh5dQ6Y54gelr12Y9vx04Mp6+1wBpwqxeyBVqp98fkeiCrxOFSVPkQ9TJwYnZhsgBu833jI9u+VKWuVthTBeEEwoH0ck4hfNY0bJTyiNEwtcXzpzx8nPSLV6kfZnSBlMXiReIuoqwS8RLgXGtCYwZkZzDFRQ7wrxtFM2CNB8Lw72mJtnlhdN6HdODNXRkTXMfmetBznTHA3M2kxjLdFo4zrCqvRUFUpwWaNkHkbrKF2xOI2Q2+epKiG+BbsUJ0Lk++ljalWyqqMrErEbL0Q4Reo7CvnW0TI+wy3//EZCL+pHDO2mLcUrYmgNJYYXGkG7v5ogAJT1f3pigmSAdN68xTy12Yt7uhaIanuF+f6Pn+HPFDUXkA8rjccusNOpQjM4UGBVR8cWWFOvw4LzTeD0krpg6yGxp0pimxf2iRNbr8rwO3MtCojTS3KLIm18kgwTxB4EoenxY+n4KikPdnIQcbQexMz2g8fymeKm/Uje1ch4JqktMiKTzBYXjmUxsRsCtPNiojgy1Rp46MWkTWmMMdrETbrRLZSbRKNN02Juz4B71Y/CWGp/rkZhTKMmgNTFvj+J6bXclalvllLffDH1D09iCeVIcjNvI0lq1X5e29y0HPcfu+rqyB0Q0+kzJhoZHglxeufCPZA4NQJUR0PTppfYZ7BbGHt46OmYv63pIbOPve667yFyBOkveO4cIuoGQXc19Cs8vQ1Ez7iVOmC5aKmFvq1v5o5aLlp6i4aecZN1SOrUNX92POqS2yDcfiX/Jr/s4Mfi/gHfrmGrF+dt6yEv3mQ/M1mhJMW7VZXjzq6M2SxHV4OyBvDWHTBXB9cZqMapBbdbF6XVdlZZeWrDsdxdaCZ9NNteNbZb9xLUN02qo/4WrFoUe33LnneiDL7slntRxbChG7UffYGUS9leHEvV7XuwjCZY+u12nCZYRhME5sHb3OnrrgYOhF5bHH9ZIOjsHaoGJw+Ds2yZ5C9YsvDq0GdtsxKVG6/jW4ls8w2JkN6NoVr4vZFy7c8KCvV1laVXFD2Va3xY/N4947n4pwFw/T8=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><path d="M 7 27 L 320.63 27" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 325.88 27 L 318.88 30.5 L 320.63 27 L 318.88 23.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 167 7 L 167 160.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 167 165.88 L 163.5 158.88 L 167 160.63 L 170.5 158.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="197" y="77" width="40" height="70" fill="none" stroke="#ea6b66" pointer-events="all"/><path d="M 197 77 L 197 27" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 197 77 L 167 77" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><rect x="307" y="27" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 37px; margin-left: 308px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">x</div></div></div></foreignObject><text x="327" y="41" fill="#000000" font-family="Times New Roman" font-size="12px" text-anchor="middle">x</text></switch></g><rect x="137" y="157" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 167px; margin-left: 138px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">y</div></div></div></foreignObject><text x="157" y="171" fill="#000000" font-family="Times New Roman" font-size="12px" text-anchor="middle">y</text></switch></g><path d="M 247 142.88 L 247 81.12" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 247 145.88 L 245 141.88 L 247 142.88 L 249 141.88 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 247 78.12 L 249 82.12 L 247 81.12 L 245 82.12 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><rect x="237" y="102" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 112px; margin-left: 238px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">h</div></div></div></foreignObject><text x="257" y="116" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">h</text></switch></g><rect x="197" y="157" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 167px; margin-left: 198px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">l</div></div></div></foreignObject><text x="217" y="171" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">l</text></switch></g><path d="M 201.12 157 L 232.88 157" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 198.12 157 L 202.12 155 L 201.12 157 L 202.12 159 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 235.88 157 L 231.88 159 L 232.88 157 L 231.88 155 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="77" cy="87" rx="50" ry="30" fill="none" stroke="#b5739d" pointer-events="all"/><path d="M 77 87 L 76.5 27" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 167 86 L 77 86" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 76.5 112.88 L 76.5 91.12" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 76.5 115.88 L 74.5 111.88 L 76.5 112.88 L 78.5 111.88 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 76.5 88.12 L 78.5 92.12 L 76.5 91.12 L 74.5 92.12 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 72.88 86.5 L 31.12 86.5" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 75.88 86.5 L 71.88 88.5 L 72.88 86.5 L 71.88 84.5 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 28.12 86.5 L 32.12 84.5 L 31.12 86.5 L 32.12 88.5 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><rect x="37" y="67" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 77px; margin-left: 38px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">rx</div></div></div></foreignObject><text x="57" y="81" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">rx</text></switch></g><rect x="67" y="87" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 97px; margin-left: 68px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ry</div></div></div></foreignObject><text x="87" y="101" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">ry</text></switch></g><ellipse cx="267" cy="37" rx="30" ry="30" fill="none" stroke="#97d077" pointer-events="all"/><path d="M 167 37 L 267 37" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 167 37 L 267 37" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 167 36.5 L 267 36.5" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 267 27 L 267 36.5" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 267 62.88 L 267 40.62" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 267 65.88 L 265 61.88 L 267 62.88 L 269 61.88 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><path d="M 267 37.62 L 269 41.62 L 267 40.62 L 265 41.62 Z" fill="#b3b3b3" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><rect x="257" y="37" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 47px; margin-left: 258px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: #B3B3B3; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">r</div></div></div></foreignObject><text x="277" y="51" fill="#B3B3B3" font-family="Times New Roman" font-size="12px" text-anchor="middle">r</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
\ No newline at end of file \ No newline at end of file
seance2_4h/figures/spyder-tests-dark.png

45.4 KiB

seance2_4h/figures/spyder-tests.png

40.3 KiB

seance2_4h/figures/spyder-unittest.png

4.52 KiB

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="701px" height="168px" viewBox="-0.5 -0.5 701 168" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2020-09-02T12:41:38.977Z&quot; agent=&quot;5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36&quot; etag=&quot;ruTGXMro8CwttfHMEE6F&quot; version=&quot;13.6.6&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;ZFG0j7v5SNXi1jvCDSdx&quot; name=&quot;Page-1&quot;&gt;7Zptb9owEMc/TV5SkYQE9pKHPkkwdWVapb2Z3MRJrJoYOaZAP/0uiU0Ah422S9NJlhDE53Nyvt/Z5B+w3PFic83RMpmxEFPL6YYby51YjtMf+PCeG7alwXPc0hBzEpYmuzLMyQuWxq60rkiIswNHwRgVZHloDFia4kAc2BDnbH3oFjF6eNUlirFmmAeI6tYHEoqktA6cfmW/wSRO1JVt/0vZs0DKWc4kS1DI1nsm99Jyx5wxUR4tNmNM89ypvJTjrk707gLjOBXnDHBiPhOb7Y8vs5+j+c2v+2A4CzqeU57mGdGVnPE9pBGlMSSgDFtsVS6yNVlQlEJrFLFUzGWPDW1ESZzCcQDBYA6GZ8wFgTQOZYdgS7AGCaHhFG3ZKg85Eyh4Uq1Rwjh5gdMiKs8J3VzIinD8A495PhLMXbBynIHPncqDfWSaoc2B4xRlQhoCRilaZuRxN40F4jFJR0wItpBOiAcyBtvLg8KQcSQYHzPKYKKTlBUJUbm5IpQedynw+eliirJMHqsxU5KqALInLIJEBcxWaYhD2VpiThYYsjtfooCksTRHexe0HDeKIicIiuxx9oT3ekL/0ffyNOqFI2spZ4Y3eyZZSNeYwYX5FlzUspY1LRe1q9rraons6j7ZXx5+Ty5NuSzj3amryoUDWbyvKWRfK2TLGZURD+ED5kqgMI9LGuYrtGRJbpGOUpU5xZE4WeRZyWda+Ex6leVeJiI3MRgb0aIsEhKGOC14CyRQWY0FcUZSUSTKG8EL8jnuXniWB4GPoW1XbXjl7lyMWQpzQaQgi6HU1zgv9xrmf94O/l4JEr3jn0de+b0H/O232+kLXw8f7nvrYNgJEbv62rFPcN8a7k1yVyM+gnt9yK4GvgNNarA3ib0/aHm56/crOfXEUG+Sut3ttb3avZpt/ggzJeXtVoFZ3azbb2K8AFoUV1C/58wnHVsD7+rg3RrIFD1iescyIgjLz89L3yP47fF1z7x/GzS0qvW93Bo71rCrMTZL+d2oP3AHr4+5r8G+pBT0vBGcRnCeEpyu/ekUp39KeRjF+ZodrH92KXwWxXnqSYNRnI1yb19xDmq1B5frPWSrx5qHpob7O7m3Ljl16VFg3xrsTWJvX3P6XaM5G+TbtubUd3OjOZtC3bbm9PXHhpZ7ZfSm0Zsn9KbnvVVvuk3tV3bd15HRm6/cvXY7wf+jN23zE2cr4FsXnL7+WPzi4sKA/tegP1Jh1odsft1qEO/ZSrKxb+6au08jNZphbTe3aUOz+rdm0bf3l1f38jc=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><clipPath id="mx-clip-4-31-212-26-0"><rect x="4" y="31" width="212" height="26"/></clipPath><clipPath id="mx-clip-4-57-212-26-0"><rect x="4" y="57" width="212" height="26"/></clipPath><clipPath id="mx-clip-4-83-212-26-0"><rect x="4" y="83" width="212" height="26"/></clipPath><clipPath id="mx-clip-4-109-212-26-0"><rect x="4" y="109" width="212" height="26"/></clipPath><clipPath id="mx-clip-4-143-212-26-0"><rect x="4" y="143" width="212" height="26"/></clipPath><clipPath id="mx-clip-244-31-212-26-0"><rect x="244" y="31" width="212" height="26"/></clipPath><clipPath id="mx-clip-244-57-212-26-0"><rect x="244" y="57" width="212" height="26"/></clipPath><clipPath id="mx-clip-244-83-212-26-0"><rect x="244" y="83" width="212" height="26"/></clipPath><clipPath id="mx-clip-244-109-212-26-0"><rect x="244" y="109" width="212" height="26"/></clipPath><clipPath id="mx-clip-244-143-212-26-0"><rect x="244" y="143" width="212" height="26"/></clipPath><clipPath id="mx-clip-484-31-212-26-0"><rect x="484" y="31" width="212" height="26"/></clipPath><clipPath id="mx-clip-484-57-212-26-0"><rect x="484" y="57" width="212" height="26"/></clipPath><clipPath id="mx-clip-484-83-212-26-0"><rect x="484" y="83" width="212" height="26"/></clipPath><clipPath id="mx-clip-484-117-212-26-0"><rect x="484" y="117" width="212" height="26"/></clipPath></defs><g><path d="M 0 26 L 0 0 L 220 0 L 220 26" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 26 L 0 164 L 220 164 L 220 26" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 26 L 220 26" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><g fill="#000000" font-family="Helvetica" font-weight="bold" pointer-events="none" text-anchor="middle" font-size="12px"><text x="109.5" y="17.5">Rectangle</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-4-31-212-26-0)" font-size="12px"><text x="5.5" y="43.5">+ x: entier</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-4-57-212-26-0)" font-size="12px"><text x="5.5" y="69.5">+ y: entier</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-4-83-212-26-0)" font-size="12px"><text x="5.5" y="95.5">- l: entier</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-4-109-212-26-0)" font-size="12px"><text x="5.5" y="121.5">- h: entier</text></g><path d="M 0 134 L 220 134" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-4-143-212-26-0)" font-size="12px"/><path d="M 240 26 L 240 0 L 460 0 L 460 26" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 26 L 240 164 L 460 164 L 460 26" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 26 L 460 26" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><g fill="#000000" font-family="Helvetica" font-weight="bold" pointer-events="none" text-anchor="middle" font-size="12px"><text x="349.5" y="17.5">Ellipse</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-244-31-212-26-0)" font-size="12px"><text x="245.5" y="43.5">+ x: entier</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-244-57-212-26-0)" font-size="12px"><text x="245.5" y="69.5">+ y: entier</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-244-83-212-26-0)" font-size="12px"><text x="245.5" y="95.5">- rx: double</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-244-109-212-26-0)" font-size="12px"><text x="245.5" y="121.5">- ry: double</text></g><path d="M 240 134 L 460 134" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-244-143-212-26-0)" font-size="12px"/><path d="M 480 26 L 480 0 L 700 0 L 700 26" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><path d="M 480 26 L 480 138 L 700 138 L 700 26" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><path d="M 480 26 L 700 26" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><g fill="#000000" font-family="Helvetica" font-weight="bold" pointer-events="none" text-anchor="middle" font-size="12px"><text x="589.5" y="17.5">?</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-484-31-212-26-0)" font-size="12px"><text x="485.5" y="43.5">+ x: entier</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-484-57-212-26-0)" font-size="12px"><text x="485.5" y="69.5">+ y: entier</text></g><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-484-83-212-26-0)" font-size="12px"><text x="485.5" y="95.5">...</text></g><path d="M 480 108 L 700 108" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g fill="#000000" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-484-117-212-26-0)" font-size="12px"/></g></svg>
\ No newline at end of file