# POO/UML
CLASSES
(https://docs.google.com/presentation/d/1d60uRZ-uLRREVtZXxEzmOrytvx-yksdhXx6IjVnGgmo/edit#slide=id.g15221e14806_0_291)
```type=python
class Point:
#constructeur
def __init__(self, x, y):
self.x=x
self.y=y
#instanciation de deux objets de type Point
point1=Point(10,6)
point2=Point(2,4)
print(point1) #affiche l'emplacement en mémoire vive
print(type(point1)) #référence à la classe Point
```
1/ À quelle adresse est stockée Point2 ?
Point2 est stocké en adresse mémoire vive (RAM)
2/ Qu'en concluez vous ?
Que les deux objets (Point1 et Point2) sont stockées à des adresses mémoires différentes
3/ Schématisez le stockage en mémoire de ces deux instances
| Adresse | Stockage |
| - | - |
| 0x000001FF177A9348 | Point1 |
| 0x000001FF177A9D88 | Point2 |
# TP1
## Définir et schématiser le fonctionnement des listes chaînées
**Question 1**
Une liste chaînée est une structure de données dynamique, on accède aux éléments en traversant la liste.
**Question 2**

Supprimer élément :

Ajouter élément :

**Question 3**
Deux classes : Element et ListeChainee
-> "Element" = deux attributs : "valeur" (élément courant) et "suivant" (élément suivant)
-> "ListeChainee" = premier élément liste, ou None si vide
| Element | ListeChainee |
| - | - |
| valeur : entier | sommet : element |
| suivant : element | |
En dessous des classes, ce sont les **attributs**
## Implémenter une liste chaînée
**Question 1**
```type=python
class Element:
#constructeur
def __init__(self, valeur, suivant=None):
self.valeur=valeur
self.suivant=suivant
class ListeChainee:
#constucteur
def __init__(self, sommet):
self.sommet=sommet
#est_vide : retourne Vrai si liste chaînée est vide
def est_vide(self):
if self.sommet is None:
return True
else:
return False
#insererElement : insere un nouvel élément en tête de liste
def insererElement(self, elmt):
elmt.suivant=self.sommet
self.sommet=elmt
#insererEntier : insère entier en tête de liste
def insererEntier(self, entier):
nouveau_sommet=Element(17)
self.insererElement(nouveau_sommet)
#tete : retourne la valeur de l’élément en tête de liste, si elle n’est pas vide
def afficheTete(self, sommet):
if self.sommet is False:
return False
else:
return self.sommet
#affiche_elements : qui affiche le contenu de la liste chaînée
#queue : retourne la liste privée de son premier élément si elle n’est pas vide
#elements : retourne un tableau contenant les valeurs des éléments de la liste
#programme principal:
#instanciation
elt=Element(7)
print(elt.valeur)#7
print(elt.suivant)#None
lst=ListeChainee(elt)
print(lst.sommet.valeur)
#est_vide
print(lst.est_vide())
#inserer
elt2=Element(3)
lst.insererElement(elt2)
print(lst.sommet.valeur)
#inserer_entier
ent2=17
lst.insererEntier(ent2)
print(lst.sommet.valeur)
#afficheTete
print(lst.afficheTete)
```
**Question 2**
Un type abstrait en POO
**Exercice pratique**
Diagramme des classes :
| Segment | ListeChainee |
| - | - |
| Extremité | sommet : element |
| suivant : element | |
## POO : Application du cours
**Exo 1**

a/
```type=python
#tuples : (x,y)
def deplacerTuples(point, dx,dy):
nx = point[0]+dx
ny = point[1]+dy
return nx, ny
#dictionnaire : {"abs" : x, "ord" : y}
def deplacerDico(point, dx, dy):
nx = point["abs"]+dx
ny = point["ord"]+dy
return {"abs": nx, "ord" : ny}
#programme principal
#test tuple
p_tuple = (5,2)
deltaX = 8
deltaY = 10
a = deplacerTuples(p_tuple,deltaX,deltaY)
print(a)
#test dico
p_dico = [
{"abs":5,"ord":2}
]
nX=8
nY=10
b = deplacerDico(p_dico,nX,nY)
print(b)
#ERREUR : nx = point[int("abs")]+dx
#ValueError: invalid literal for int() with base 10: 'abs'
```
**Exo 2**

```type=python
import random
couleurs = [None, 'trèfle', 'carreau', 'cœur', 'pique']
valeurs = [None, 'as', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'valet', 'dame', 'roi']
class Carte:
"""Représente une carte à jouer standard."""
def __init__(self,couleur,valeur):
self.couleur = couleur
self.valeur = valeur
def __str__(self):
return '%s de %s' % (Carte.noms_valeurs[self.valeur], Carte.noms_couleurs[self.couleur])
class Paquet:
"""contient les 52 cartes d'un paquet"""
def __init__(self):
self.cartes=[]
for couleur in range(4):#4 couleurs
for valeur in range(1,14):#4 valeurs
carte=Carte(couleur,valeur)#on attribue à la variable carte, la classe Carte
self.cartes.append(carte)
def __str__(self):
res=[]
for carte in self.cartes:
res.append(str(carte))
return '\n'.join(res)
def tirer(self):
randomC=couleur.random.randint
randomV=valeur.random.randint
carteRandom=Carte(randomC,randomV)
pint(carteRandom)
carte1 = Carte(2, 11)
print(carte1)
carte2=Carte(4,5)
print(carte2)
paquet=Paquet()
print(paquet)
```
**Exo 3** Théo CORDIER / Serge POKROVSKIY

```type=python
## A
T=[1,2,3,4,5,6,7,8,9,10]
class Tranche:
#constructeur
def __init__(self,premier_ele,dernier_ele,tranche):
self.premier_ele=premier_ele
self.dernier_ele=dernier_ele
for i in range(premier_ele,dernier_ele):
self.tranche=T[premier_ele:dernier_ele]
def len(self):
return len(self.tranche)
def getitem(self,item):
return self.tranche[item]
def setitem(self,item,nv_valeur):
self.tranche[item]=nv_valeur
print(T)
return T,self.tranche
#programme principal
s=Tranche(3,8,T)
print(s.tranche)
print(s.getitem(3))
print(s.setitem(3,10))
## B
T=[1,2,3,4,5,6,7,8,9,10]
class Tranche:
#constructeur
def __init__(self,premier_ele,dernier_ele,tranche):
self.premier_ele=premier_ele
self.dernier_ele=dernier_ele
for i in range(premier_ele,dernier_ele):
self.tranche=T[premier_ele:dernier_ele]
def __len__(self):
return len(self.tranche)
def __getitem__(self,item):
return self.tranche[item]
def __setitem__(self,item,nv_valeur):
self.tranche[item]=nv_valeur
print(T)
return T,self.tranche
s=Tranche(3,8,T)
print(s.tranche)
print(len(s))
print(s[3])
s[3]=10
print(s.tranche)
## C
T=[1,2,3,4,5,6,7,8,9,10]
class Tranche:
#constructeur
def __init__(self,premier_ele,dernier_ele,tranche):
if isinstance(t,T):
self.premier_ele=premier_ele
self.dernier_ele=dernier_ele
for i in range(premier_ele,dernier_ele):
self.tranche=T[premier_ele:dernier_ele]
else:
self.tranche2=tranche
return tranche2
def __len__(self):
return len(self.tranche)
def __getitem__(self,item):
return self.tranche[item]
def __setitem__(self,item,nv_valeur):
self.tranche[item]=nv_valeur
print(T)
return T,self.tranche
s=Tranche(3,8,T)
print(s.tranche)
print(len(s))
print(s[3])
s[3]=10
print(s.tranche)```
## TP2
