class Train: def __init__(self): "Constructeur" self.premier = None self.nb_wagons = 0 def est_vide(self): """renvoie True si ce train est vide (ne comporte aucun wagon), False sinon """ return self.nb_wagons == 0 def donne_nb_wagons(self): "Renvoie le nombre de wagons de ce train" return self.nb_wagons def transporte_du(self, contenu): """Détermine si ce train transporte du {contenu} (une chaine de caractères). Renvoie True si c'est le cas, False sinon """ wagon = self.premier while wagon is not None: if wagon.contenu == contenu: return True wagon = wagon.suivant return False def ajoute_wagon(self, nouveau): """Ajoute un wagon à la fin de ce train. L'argument est le wagon à ajouter """ if self.est_vide(): self.premier = nouveau else: wagon = self.premier while wagon.suivant is not None: wagon = wagon.suivant wagon.suivant = nouveau self.nb_wagons = self.nb_wagons + 1 def supprime_wagon_de(self, contenu): """Supprime le premier wagon de {contenu} Renvoie False si ce train ne contient pas de {contenu}, True si la suppression est effectuée """ if self.est_vide(): # train vide return False if self.premier.contenu == contenu: # contenu dans le premier wagon self.premier = self.premier.suivant elif self.premier.suivant is None: # contenu pas dans le premier et seul wagon return False else: # au moins 2 wagons et pas de contenu dans le premier precedent = self.premier wagon = precedent.suivant while wagon.contenu != contenu: precedent = wagon wagon = wagon.suivant if wagon is None: # pas de "contenu" dans le train return False precedent.suivant = wagon.suivant # MAJ du nombre de wagons et résultat de la fonction self.nb_wagons = self.nb_wagons - 1 return True def __repr__(self): "Affichage dans la console" contenus_wagons = [''] wagon = self.premier while wagon is not None: contenus_wagons.append(str(wagon)) wagon = wagon.suivant return "Locomotive" + " - ".join(contenus_wagons) def __str__(self): "Conversion en string" return self.__repr__() # Tests train = Train() w1 = Wagon("blé") train.ajoute_wagon(w1) w2 = Wagon("riz") train.ajoute_wagon(w2) train.ajoute_wagon(Wagon("sable")) assert str(train) == 'Locomotive - Wagon de blé - Wagon de riz - Wagon de sable' assert not train.est_vide() assert train.donne_nb_wagons() == 3 assert train.transporte_du('blé') assert not train.transporte_du('matériel') assert train.supprime_wagon_de('riz') assert str(train) == 'Locomotive - Wagon de blé - Wagon de sable' assert not train.supprime_wagon_de('riz')