Skip to content
Snippets Groups Projects
Commit 9308a8ea authored by Dellandrea Emmanuel's avatar Dellandrea Emmanuel
Browse files

Ajout correction

parent 92e6a66e
Branches
No related tags found
No related merge requests found
Showing
with 869 additions and 0 deletions
class Forme:
def __init__(self, x, y):
self.__x = x
self.__y = y
def get_pos(self):
return self.__x, self.__y
def set_pos(self, x, y):
self.__x = x
self.__y = y
def translation(self, dx, dy):
self.__x += dx
self.__y += dy
class Rectangle(Forme):
def __init__(self, x, y, l, h):
Forme.__init__(self, x, y)
self.__l = l
self.__h = h
def __str__(self):
return f"Rectangle d'origine {self.get_pos()} et de dimensions {self.__l}x{self.__h}"
def get_dim(self):
return self.__l, self.__h
def set_dim(self, l, h):
self.__l = l
self.__h = h
def contient_point(self, x, y):
X, Y = self.get_pos()
return X <= x <= X + self.__l and \
Y <= y <= Y + self.__h
def redimension_par_points(self, x0, y0, x1, y1):
self.set_pos(min(x0, x1), min(y0, y1))
self.__l = abs(x0 - x1)
self.__h = abs(y0 - y1)
class Ellipse(Forme):
def __init__(self, x, y, rx, ry):
Forme.__init__(self, x, y)
self.__rx = rx
self.__ry = ry
def __str__(self):
return f"Ellipse de centre {self.get_pos()} et de rayons {self.__rx}x{self.__ry}"
def get_dim(self):
return self.__rx, self.__ry
def set_dim(self, rx, ry):
self.__rx = rx
self.__ry = ry
def contient_point(self, x, y):
X, Y = self.get_pos()
return ((x - X) / self.__rx) ** 2 + ((y - Y) / self.__ry) ** 2 <= 1
def redimension_par_points(self, x0, y0, x1, y1):
self.set_pos((x0 + x1) // 2, (y0 + y1) // 2)
self.__rx = abs(x0 - x1) / 2
self.__ry = abs(y0 - y1) / 2
class Cercle(Ellipse):
def __init__(self, x, y, r):
Ellipse.__init__(self, x, y, r, r)
def __str__(self):
return f"Cercle de centre {self.get_pos()} et de rayon {self.get_dim()}"
def get_dim(self):
return Ellipse.get_dim(self)[0]
def set_dim(self, r):
Ellipse.set_dim(self, r, r)
def redimension_par_points(self, x0, y0, x1, y1):
r = min(abs(x0 - x1), abs(y0 - y1)) / 2
self.set_dim(r)
self.set_pos(round(x0 + r if x1 > x0 else x0 - r),
round(y0 + r if y1 > y0 else y0 - r))
class Forme:
def __init__(self, x, y):
self.__x = x
self.__y = y
self.__dessins = []
def get_pos(self):
return self.__x, self.__y
def set_pos(self, x, y):
self.__x = x
self.__y = y
def translation(self, dx, dy):
self.__x += dx
self.__y += dy
def add_dessin(self,d):
self.__dessins.append(d)
def del_dessin(self,d):
self.__dessins.remove(d)
def print_dessins(self):
print("Liste des dessins de la forme : ")
for d in self.__dessins:
print(d.get_nom())
class Rectangle(Forme):
def __init__(self, x, y, l, h):
Forme.__init__(self, x, y)
self.__l = l
self.__h = h
def __str__(self):
return f"Rectangle d'origine {self.get_pos()} et de dimensions {self.__l}x{self.__h}"
def get_dim(self):
return self.__l, self.__h
def set_dim(self, l, h):
self.__l = l
self.__h = h
def contient_point(self, x, y):
X, Y = self.get_pos()
return X <= x <= X + self.__l and \
Y <= y <= Y + self.__h
def redimension_par_points(self, x0, y0, x1, y1):
self.set_pos(min(x0, x1), min(y0, y1))
self.__l = abs(x0 - x1)
self.__h = abs(y0 - y1)
class Ellipse(Forme):
def __init__(self, x, y, rx, ry):
Forme.__init__(self, x, y)
self.__rx = rx
self.__ry = ry
def __str__(self):
return f"Ellipse de centre {self.get_pos()} et de rayons {self.__rx}x{self.__ry}"
def get_dim(self):
return self.__rx, self.__ry
def set_dim(self, rx, ry):
self.__rx = rx
self.__ry = ry
def contient_point(self, x, y):
X, Y = self.get_pos()
return ((x - X) / self.__rx) ** 2 + ((y - Y) / self.__ry) ** 2 <= 1
def redimension_par_points(self, x0, y0, x1, y1):
self.set_pos((x0 + x1) // 2, (y0 + y1) // 2)
self.__rx = abs(x0 - x1) / 2
self.__ry = abs(y0 - y1) / 2
class Cercle(Ellipse):
def __init__(self, x, y, r):
Ellipse.__init__(self, x, y, r, r)
def __str__(self):
return f"Cercle de centre {self.get_pos()} et de rayon {self.get_dim()}"
def get_dim(self):
return Ellipse.get_dim(self)[0]
def set_dim(self, r):
Ellipse.set_dim(self, r, r)
def redimension_par_points(self, x0, y0, x1, y1):
r = min(abs(x0 - x1), abs(y0 - y1)) / 2
self.set_dim(r)
self.set_pos(round(x0 + r if x1 > x0 else x0 - r),
round(y0 + r if y1 > y0 else y0 - r))
class Dessin:
def __init__(self,n):
self.__nom = n
self.__formes = []
def get_nom(self):
return self.__nom
def add_forme(self,f):
self.__formes.append(f)
f.add_dessin(self)
def del_forme(self,position):
f = self.__formes.pop(position)
f.del_dessin(self)
def print_formes(self):
print('--- Dessin ---')
for f in self.__formes:
print(f)
def __str__(self):
s = '--- Dessin (avec print) ---'
for f in self.__formes:
s += '\n' + str(f)
return s
\ No newline at end of file
from formes import *
def test_Rectangle():
r = Rectangle(10, 20, 100, 50)
str(r)
assert r.contient_point(50, 50)
assert not r.contient_point(0, 0)
r.redimension_par_points(100, 200, 1100, 700)
assert r.contient_point(500, 500)
assert not r.contient_point(50, 50)
def test_Ellipse():
e = Ellipse(60, 45, 50, 25)
str(e)
assert e.contient_point(50, 50)
assert not e.contient_point(11, 21)
e.redimension_par_points(100, 200, 1100, 700)
assert e.contient_point(500, 500)
assert not e.contient_point(101, 201)
def test_Cercle():
c = Cercle(10, 20, 30)
str(c)
assert c.contient_point(0, 0)
assert not c.contient_point(-19, -9)
c.redimension_par_points(100, 200, 1100, 700)
assert c.contient_point(500, 500)
assert not c.contient_point(599, 500)
if __name__ == '__main__':
test_Rectangle()
test_Ellipse()
test_Cercle()
from formes_avec_dessin import *
def test_Rectangle():
r = Rectangle(10, 20, 100, 50)
str(r)
assert r.contient_point(50, 50)
assert not r.contient_point(0, 0)
r.redimension_par_points(100, 200, 1100, 700)
assert r.contient_point(500, 500)
assert not r.contient_point(50, 50)
def test_Ellipse():
e = Ellipse(60, 45, 50, 25)
str(e)
assert e.contient_point(50, 50)
assert not e.contient_point(11, 21)
e.redimension_par_points(100, 200, 1100, 700)
assert e.contient_point(500, 500)
assert not e.contient_point(101, 201)
def test_Cercle():
c = Cercle(10, 20, 30)
str(c)
assert c.contient_point(0, 0)
assert not c.contient_point(-19, -9)
c.redimension_par_points(100, 200, 1100, 700)
assert c.contient_point(500, 500)
assert not c.contient_point(599, 500)
def test_Dessin():
# Partie pour aller plus loin : Creation et manipulation d'objets Dessin
r = Rectangle(10, 20, 100, 50)
e = Ellipse(60, 45, 50, 25)
c = Cercle(10, 20, 30)
print("Création d'un dessin A composé des trois formes")
d1 = Dessin("A")
d1.add_forme(r)
d1.add_forme(e)
d1.add_forme(c)
d1.print_formes()
print("Création d'un dessin B composé de l'ellipse et du cercle")
d2 = Dessin("B")
d2.add_forme(e)
d2.add_forme(c)
d2.print_formes()
print("Affichage des dessins auxquels les formes sont associées")
r.print_dessins()
e.print_dessins()
c.print_dessins()
print("Suppression de l'ellipse dans le dessin A")
d1.del_forme(1)
print(d1)
print("Affichage des dessins auxquels les formes sont associées")
r.print_dessins()
e.print_dessins()
c.print_dessins()
if __name__ == '__main__':
test_Rectangle()
test_Ellipse()
test_Cercle()
test_Dessin()
TD1/correction/diagramme_classes_formes.png

250 KiB

TD1/correction/diagramme_classes_formes_avec_dessin.png

176 KiB

# -*- coding: utf-8 -*-
"""
@author: dellandrea
"""
from lecteur import *
from livre import *
from emprunt import *
# ***** classe Bibliotheque *****
class Bibliotheque:
def __init__(self,nom):
self.__nom = nom
self.__lecteurs = []
self.__livres = []
self.__emprunts = []
def get_nom(self):
return self.__nom
def ajout_lecteur(self,nom,prenom,adresse,numero):
self.__lecteurs.append(Lecteur(nom,prenom,adresse,numero))
def retrait_lecteur(self,numero):
# On cherche le lecteur
lecteur = self.chercher_lecteur_numero(numero)
if lecteur == None:
return False
# On verifie qu'il n'a pas d'emprunt en cours
for e in self.__emprunts:
if e.get_numero_lecteur()==numero:
return False
# On peut ici retirer le lecteur de la liste
self.__lecteurs.remove(lecteur)
return True
def ajout_livre(self,auteur,titre,numero,nb_total):
self.__livres.append(Livre(auteur,titre,numero,nb_total))
def retrait_livre(self,numero):
# On cherche le livre
livre = self.chercher_livre_numero(numero)
if livre == None:
return False
# On verifie que le livre n'est pas en cours d'emprunt
for e in self.__emprunts:
if e.get_numero_livre()==numero:
return False
# On peut ici retirer le livre de la liste
self.__livres.remove(livre)
return True
def chercher_lecteur_numero(self,numero):
for l in self.__lecteurs:
if l.get_numero() == numero:
return l
return None
def chercher_lecteur_nom(self,nom,prenom):
for l in self.__lecteurs:
if l.get_nom() == nom and l.get_prenom() == prenom:
return l
return None
def chercher_livre_numero(self,numero):
for l in self.__livres:
if l.get_numero() == numero:
return l
return None
def chercher_livre_titre(self,titre):
for l in self.__livres:
if l.get_titre() == titre:
return l
return None
def chercher_emprunt(self, numero_lecteur, numero_livre):
for e in self.__emprunts:
if e.get_numero_lecteur() == numero_lecteur and e.get_numero_livre() == numero_livre:
return e
return None
def emprunt_livre(self, numero_lecteur, numero_livre):
# On verifie que le numero de livre est valide
livre = self.chercher_livre_numero(numero_livre)
if livre == None:
print('Emprunt impossible : livre inexistant')
return None
# On verifie qu'il reste des exemplaires disponibles pour ce livre
if livre.get_nb_dispo() == 0:
print('Emprunt impossible : plus d\'exemplaires disponibles')
return None
# On verifie que le numero de lecteur est valide
lecteur = self.chercher_lecteur_numero(numero_lecteur)
if lecteur == None:
print('Emprunt impossible : lecteur inexistant')
return None
# On verifie que ce lecteur n'a pas deja emprunte ce livre
e = self.chercher_emprunt(numero_lecteur, numero_livre)
if e != None:
print('Emprunt impossible : deja en cours')
return None
# Les conditions sont reunies pour pouvoir faire cet emprunt
self.__emprunts.append(Emprunt(numero_lecteur, numero_livre))
livre.set_nb_dispo(livre.get_nb_dispo()-1)
lecteur.set_nb_emprunts(lecteur.get_nb_emprunts()+1)
return self.__emprunts[-1]
def retour_livre(self, numero_lecteur, numero_livre):
# On recherche l'emprunt identifie par le numero de livre et de lecteur
e = self.chercher_emprunt(numero_lecteur, numero_livre)
if e != None: # l'emprunt existe, on le retire de la liste et on met a jour nb_emprunt pour le lecteur et nb_dispo pour le livre
self.__emprunts.remove(e)
lecteur = self.chercher_lecteur_numero(numero_lecteur)
if lecteur != None : lecteur.set_nb_emprunts(lecteur.get_nb_emprunts()-1)
livre = self.chercher_livre_numero(numero_livre)
if livre != None: livre.set_nb_dispo(livre.get_nb_dispo()+1)
print('Retour effectue')
return True
else:
print('Aucun emprunt ne correspond a ces informations')
return False
def affiche_lecteurs(self):
for l in self.__lecteurs:
print(l)
def affiche_livres(self):
for l in self.__livres:
print(l)
def affiche_emprunts(self):
for e in self.__emprunts:
print(e)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:27:13 2022
@author: dellandrea
"""
from datetime import date
from lecteur import *
from livre import *
# ***** classe Emprunt *****
class Emprunt:
def __init__(self,numero_lecteur,numero_livre):
self.__numero_lecteur = numero_lecteur
self.__numero_livre = numero_livre
self.__date = date.isoformat(date.today())
def get_numero_lecteur(self):
return self.__numero_lecteur
def get_numero_livre(self):
return self.__numero_livre
def get_date(self):
return self.__date
def __str__(self):
return 'Emprunt - Numero lecteur : {}, Numero livre: {}, Date : {}'.format(self.__numero_lecteur,self.__numero_livre,self.__date)
\ No newline at end of file
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:25:52 2022
@author: dellandrea
"""
from personne import *
# ***** classe Lecteur *****
class Lecteur(Personne):
def __init__(self,nom,prenom,adresse,numero):
Personne.__init__(self,nom,prenom,adresse)
self.__numero = numero
self.__nb_emprunts = 0
def set_numero(self,numero):
self.__numero = numero
def get_numero(self):
return self.__numero
def set_nb_emprunts(self,nb_emprunts):
self.__nb_emprunts = nb_emprunts
def get_nb_emprunts(self):
return self.__nb_emprunts
def __str__(self): #Permet d'afficher les proprietes de l'objet avec la fonction print
return 'Lecteur - Nom : {}, Prenom : {}, Adresse : {}, Numero : {}, Nb emprunts : {}'.format(self.get_nom(),self.get_prenom(),self.get_adresse(),self.__numero,self.__nb_emprunts)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:26:54 2022
@author: dellandrea
"""
# ***** classe Livre *****
class Livre:
def __init__(self,titre,auteur,numero,nb_total):
self.__titre = titre
self.__auteur = auteur
self.__numero = numero
self.__nb_total = nb_total
self.__nb_dispo = nb_total
def set_auteur(self,auteur):
self.__auteur = auteur
def get_auteur(self):
return self.__auteur
def set_titre(self,titre):
self.__titre = titre
def get_titre(self):
return self.__titre
def set_numero(self,numero):
self.__numero = numero
def get_numero(self):
return self.__numero
def set_nb_total(self,nb_total):
self.__nb_total = nb_total
def get_nb_total(self):
return self.__nb_total
def set_nb_dispo(self,nb_dispo):
self.__nb_dispo = nb_dispo
def get_nb_dispo(self):
return self.__nb_dispo
def __str__(self):
return 'Livre - Auteur : {}, Titre : {}, Numero : {}, Nb total : {}, Nb dispo : {}'.format(self.__auteur,self.__titre,self.__numero,self.__nb_total,self.__nb_dispo)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:21:05 2022
@author: dellandrea
"""
# ***** classe Personne *****
class Personne:
def __init__(self,nom,prenom,adresse):
self.__nom = nom
self.__prenom = prenom
self.__adresse = adresse
def __str__(self):
return f"Classe Personne - Nom : {self.__nom}, Prenom : {self.__prenom}, Adresse : {self.__adresse}"
def set_nom(self,nom):
self.__nom = nom
def get_nom(self):
return self.__nom
def set_prenom(self,prenom):
self.__prenom = prenom
def get_prenom(self):
return self.__prenom
def set_adresse(self,adresse):
self.__adresse = adresse
def get_adresse(self):
return self.__adresse
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
@author: dellandrea
"""
from bibliotheque import *
# Creation d'une bibliotheque
b = Bibliotheque('Bibliotheque ECL')
# Ajout de lecteurs
b.ajout_lecteur('Duval','Pierre','rue de la Paix',1)
b.ajout_lecteur('Dupond','Laurent','rue de la Gare',2)
b.ajout_lecteur('Martin','Marie','rue La Fayette',3)
b.ajout_lecteur('Dubois','Sophie','rue du Stade',4)
# Ajout de livres
b.ajout_livre('Le Pere Goriot','Honore de Balzac',101,2)
b.ajout_livre('Les Hauts de Hurlevent','Emilie Bronte',102,2)
b.ajout_livre('Le Petit Prince','Antoine de Saint Exupery',103,2)
b.ajout_livre('L\'Etranger','Albert Camus',104,2)
# Affichage des lecteurs et des livres
print('\n--- Liste des lecteurs :')
print('-------------------------------')
b.affiche_lecteurs()
print('\n--- Liste des livres :')
print('-------------------------------')
b.affiche_livres()
# Recherches de lecteurs par numero
print('\n--- Recherche de lecteurs :')
print('-------------------------------')
lect = b.chercher_lecteur_numero(1)
if lect != None:
print(lect)
else:
print('Lecteur non trouve')
lect = b.chercher_lecteur_numero(6)
if lect != None:
print(lect)
else:
print('Lecteur non trouve')
# Recherches de lecteurs par nom
lect = b.chercher_lecteur_nom('Martin','Marie')
if lect != None:
print(lect)
else:
print('Lecteur non trouve')
lect = b.chercher_lecteur_nom('Le Grand','Paul')
if lect != None:
print(lect)
else:
print('Lecteur non trouve')
# Recherches de livres par numero
print('\n--- Recherche de livres :')
print('-------------------------------')
livre = b.chercher_livre_numero(101)
if livre != None:
print('Livre trouve :',livre)
else:
print('Livre non trouve')
livre = b.chercher_livre_numero(106)
if livre != None:
print('Livre trouve :',livre)
else:
print('Livre non trouve')
# Recherches de livres par titre
livre = b.chercher_livre_titre('Les Hauts de Hurlevent')
if livre != None:
print('Livre trouve :',livre)
else:
print('Livre non trouve')
livre = b.chercher_livre_titre('Madame Bovarie')
if livre != None:
print('Livre trouve :',livre)
else:
print('Livre non trouve')
# Quelques emprunts
print('\n--- Quelques emprunts :')
print('-------------------------------')
b.emprunt_livre(1,101)
b.emprunt_livre(1,104)
b.emprunt_livre(2,101)
b.emprunt_livre(2,105)
b.emprunt_livre(3,101)
b.emprunt_livre(3,104)
b.emprunt_livre(4,102)
b.emprunt_livre(4,103)
# Affichage des emprunts, des lecteurs et des livres
print('\n--- Liste des emprunts :')
print('-------------------------------')
b.affiche_emprunts()
print('\n--- Liste des lecteurs :')
print('-------------------------------')
b.affiche_lecteurs()
print('\n--- Liste des livres :')
print('-------------------------------')
b.affiche_livres()
# Quelques retours de livres
print('\n--- Quelques retours de livres :')
print('-------------------------------')
b.retour_livre(1,101)
b.retour_livre(1,102)
b.retour_livre(3,104)
b.retour_livre(10,108)
# Affichage des emprunts, des lecteurs et des livres
print('\n--- Liste des emprunts :')
print('-------------------------------')
b.affiche_emprunts()
print('\n--- Liste des lecteurs :')
print('-------------------------------')
b.affiche_lecteurs()
print('\n--- Liste des livres :')
print('-------------------------------')
b.affiche_livres()
# Suppression de quelques livres
rep = b.retrait_livre(101)
if not rep:
print('Retrait du livre impossible')
else:
print('Retrait du livre effectue')
b.retour_livre(2,101)
rep = b.retrait_livre(101)
if not rep:
print('Retrait du livre impossible')
else:
print('Retrait du livre effectue')
# Suppression de quelques lecteurs
rep = b.retrait_lecteur(1)
if not rep:
print('Retrait du lecteur impossible')
else:
print('Retrait du lecteur effectue')
b.retour_livre(1,104)
rep = b.retrait_lecteur(1)
if not rep:
print('Retrait du lecteur impossible')
else:
print('Retrait du lecteur effectue')
# Affichage des emprunts, des lecteurs et des livres
print('\n--- Liste des emprunts :')
print('-------------------------------')
b.affiche_emprunts()
print('\n--- Liste des lecteurs :')
print('-------------------------------')
b.affiche_lecteurs()
print('\n--- Liste des livres :')
print('-------------------------------')
b.affiche_livres()
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:46:54 2022
@author: dellandrea
"""
from emprunt import *
e = Emprunt(3,5)
print(e)
print(e.get_numero_lecteur())
print(e.get_numero_livre())
print(e.get_date())
\ No newline at end of file
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:21:29 2022
@author: dellandrea
"""
from lecteur import *
l = Lecteur("Durand","Marie","Ecully",13)
print(l)
l.set_nom("Dupond")
print(l.get_nom())
l.set_prenom("Emilie")
print(l.get_prenom())
l.set_adresse("Lyon")
print(l.get_adresse())
l.set_numero(14)
print(l.get_numero())
l.set_nb_emprunts(2)
print(l.get_nb_emprunts())
print(l)
\ No newline at end of file
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:41:02 2022
@author: dellandrea
"""
from livre import *
l = Livre('Le Pere Goriot','Honore de Balzac',101,2)
print(l)
l.set_auteur("Emilie Bronte")
print(l.get_auteur())
l.set_titre("Les Hauts de Hurlevent")
print(l.get_titre())
l.set_numero(102)
print(l.get_numero())
l.set_nb_total(5)
print(l.get_nb_total())
l.set_nb_dispo(4)
print(l.get_nb_dispo())
print(l)
\ No newline at end of file
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 07:21:29 2022
@author: dellandrea
"""
from personne import *
p = Personne("Durand","Marie","Ecully")
print(p)
p.set_nom("Dupond")
print(p.get_nom())
p.set_prenom("Emilie")
print(p.get_prenom())
p.set_adresse("Lyon")
print(p.get_adresse())
print(p)
\ No newline at end of file
TD2/correction/diagramme_classes_biblio.png

401 KiB

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16lxy104
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment