"""
Exercice 1 :

1. En programmation orientée objet e méthode __init__ se nomme un constructeur .

2. Les attributs de cette classe sont :
    - self.nom
    - self.prenom
    - self.notes
    
3. L'attributs self.notes est un dictionnaire

4.5.
"""

class Bulletin :
    def __init__( self, nom, prenom ):
        self.nom = nom
        self.prenom = prenom
        self.notes = { "maths" : [], "nsi" : []}
    
    def ajoute_note( self, matiere, note ):
        assert type(note) == int and 0 <= note <= 20
        self.notes [ matiere ].append ( note )
    
    def moyenne( self , matiere ):
        if len(self.notes [ matiere ]) > 0:
            return sum(self.notes[matiere]) / len(self.notes[matiere])
        else :
            return None 
        
    

eleve = Bulletin ( "Lesaint", "Cyprien")

eleve.ajoute_note ( "maths", 9)
eleve.ajoute_note ( "maths", 14)
eleve.ajoute_note ( "nsi", 17)

"""
Exercice 2:

1.
"""

class pile:
    def __init__(self):
        self.taille = 0
        self.vals = []
        
    def empiler(self, elt):
        self.vals.append(elt)
        self.taille = self.taille + 1
        
    def depiler(self):
        if self.taille > 0 :
            self.taille = self.taille - 1
            return self.vals.pop()
        else :
            print ( " La pile est trop petite ")
            
    def pile_vide(self):
        if self.taille == 0:
            return True 
        else :
            return False 

    def __str__(self):
        return str(self.vals)

"""
1.a. Après l'éxécution des deux premières ligne du script la pile p contient les éléments [7, 4, 3, 8, 1, 2] dans cet ordre.

b. La valeur affichée par print(x) est 8.

2. De manière générale la valeur renvoyée par la fonction bar est la valeur la plus grand de la pile.

3. Oui la pile passée en arguments est modifié, l'élément qui est renvoyé est retiré de la pile car dans la fonction bar la méthode depiler est utilisée.


Exercice 3:

1.
"""

class File :
    
    def __init__(self ) :
        self.valeurs =[]
        
    def enfiler(self, v):
        self.valeurs.append(v)
        
    def defiler(self):
        if self.valeurs != []:
            return self.valeurs.pop(0)      
    
    def est_vide(self):
        return len(self.valeurs) == 0
    
    def longueur(self):
        return len(self.valeurs)
    
    def __str__(self):
        return str(self.valeurs)
    
    
#2. X



