Train en POO

On souhaite dans cet exercice créer une classe Train permettant de relier des objets de type Wagon.

Un objet de type Wagon possède deux attributs :

  • un contenu contenu de type str,
  • un lien vers le wagon suivant suivant de type Wagon.

On inclut aussi deux méthodes permettant d'afficher le wagon dans la console ou sous forme d'une chaine de caractère.

La classe Wagon (pour information)
🐍 Script Python
class Wagon:
    def __init__(self, contenu):
        "Constructeur"
        self.contenu = contenu
        self.suivant = None

    def __repr__(self):
        "Affichage dans la console"
        return f'Wagon de {self.contenu}'

    def __str__(self):
        "Conversion en string"
        return self.__repr__()

Cette classe est déjà "importée" dans la zone de saisie ci-dessous. Il est inutile de la recopier.

Un objet de la classe Train possède deux attributs :

  • premier contient son premier wagon (de type Wagon) ou None si le train est vide (il n'y a que la locomotive),
  • nb_wagons (de type int) contient le nombre de wagons attachés à la locomotive.

Lors de sa création, un objet de type Train sera toujours vide.

Les méthodes de la classe Train sont présentées ci-dessous (train est un objet de type Train) :

  • train.est_vide() renvoie True si train est vide (ne comporte aucun wagon), False sinon ;
  • train.donne_nb_wagons() renvoie le nombre de wagons de train ;
  • train.transporte_du(contenu) détermine si train transporte du contenu (une chaine de caractères). Renvoie True si c'est le cas, False sinon ;
  • train.ajoute_wagon(wagon) ajoute un wagon à la fin du train. On passe en argument le wagon à ajouter ;
  • train.supprime_wagon_de(contenu) prend en argument une chaine de caractères contenu et supprime le premier wagon de contenu du train. Si le train est vide ou ne comporte aucun wagon de contenu, la méthode renvoie False. S'il en contient un et que celui-ci est effectivement supprimé, la méthode renvoie True.

On inclut là-aussi aussi deux méthodes permettant d'afficher le train dans la console ou sous forme d'une chaine de caractères.

Exemples
  • Création d'un train vide :
🐍 Console Python
>>> train = Train()
  • Ajout de wagons :
🐍 Console Python
>>> w1 = Wagon('blé')
>>> train.ajoute_wagon(w1)
>>> w2 = Wagon('riz')
>>> train.ajoute_wagon(w2)
>>> train.ajoute_wagon(Wagon('sable'))
>>> train
'Locomotive - Wagon de blé - Wagon de riz - Wagon de sable'
  • Description du train :
🐍 Console Python
>>> train.est_vide()
False
>>> train.donne_nb_wagons()
3
>>> train.transporte_du('blé')
True
>>> train.transporte_du('matériel')
False
  • Suppression de wagon
🐍 Console Python
>>> train.supprime_wagon_de('riz')
True
>>> train
'Locomotive - Wagon de blé - Wagon de sable'
>>> train.supprime_wagon_de('riz')
False

On pourra parcourir tous les wagons du train en utilisant les instructions ci-dessous :

🐍 Script Python
wagon = self.premier
while wagon is not None:
    # actions à effectuer
    wagon = wagon.suivant

En plusieurs occasions il faudra prendre soin de traiter séparément le cas du premier wagon et celui des suivants.

Enfin, lors de la suppression d'un wagon, on se contentera de l'omettre en liant son wagon précédent à son suivant. La figure ci-dessous illustre ainsi l'instruction train.supprime_wagon_de('riz') avant et après la suppression.

Suppression

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3_8èufvy n7aS1me(P24C:jtwi]WD[hE)6Oo;bcdg/T0làqAp!.rFL-,}=+Nk%95R{é050P0r0z0n0B0U0b0k0O0U0n0b0b0+010z0B0Y010406050b0g0q0q0n0#0j040o0L0U0g180L0l0k020n0q0Y0M0k0=0r1i0#0W0g0r0b050R1f1h1j1l1d0Y041J1Q051T0R1T1V1Q1d0P0B0i101214160G0B0Q0G0U1-0G0z1b050{0N0U0r1(1315011,1.1:1.0z1_1{1@0z0N0L0P1l1^0#1R0z0G101o0b0Y0n0l160u011}1*010h0}0r0l1w0r1@2l2n2s1 2v1{2y0q2A040a0k0t0#0L0Y0L0b0B1r1t0_2j0#0#0r0O2V1J2C0l1R0R2h2+0z2f2e2g0P2E161:0l2x2S1@1#1%111~2^0B2`0l2b1$1@0Y2!1R2)2+3c1e2m1t302t350#1i0U1b0k0p2(3g1c3f2D3i1 3k3m3o0u3r2n3t2)2@013y0n3n040k0c3C2*1d3F3w163I3K0k0v3O3E3g3G3U3o0;3Y3Q3!3S3H0L3l3J3o0J3)3u3h1)3x3.3z3L0m3?3R3_3T3{3:3L0e3 3+413-3/3V0:473v493$040p0T4e3^314a3|0p3q1K3s3*4f4n4h0p3B4s3D4u4m3j433K0p3N4A3P3@3#4F1b0p3X4J3Z4v4E4b4O3(4R4C4M4V4i3=4Y4L3,4x3~4(404w4N4i464-484/4#0p4d4?4T3`4#0u4k4|4D4~3|0u4r3c4Z4*4:0u4z584)4g5b4I5e4.4U554Q5j4@5l440u4X5o4}424 4%5u535w554,5z4!554=5E5a4 4{5I5g4#0c515M4^3|0c574t5f5S440c5d5W5k545Z5i5$5p5(3K0c5n5+5v4o5Z5t5;5A5?5.5y5_5F5Z5D5~5J5T5H625N5T5L665Y3K0v5Q6a5q6c5V4B5X6g1b0v5#6j5%5B440v5*6p5,6r6c5:6v5=4h0v5^6A5`6C5}6F5 6c616J636s656N676s696R6b1b0;6e6V6l040;6i4K6q5{6X6o6)6w6+6$6u6.6B4:0;6z6?6G6^6E6{6K6X6I6 6O3K0;6M736S756Q786W6$6U7c6#0J6Z7g5-1b0J6(4S6|4#0J6-7p70040J6=7u747m6`7z797m6~7D7d0J727H7h777L7l7w7b7O6x7m7f7S6:0m7j7W4h0m7o597E040m7t7(7d0m7y7-6#0m7C7;7P0m7G7^7T7*7K7|7X7N807#7R834:0m7V864#0e7Z8a3|0e7%6k7P0e7,8i7}0e7:8m6:0e7@8q4h0e7{8u4:0e7 8y8b828C8f7R1S3a1J2~2.0P2=3G0O2b2K0^1$1R390r3b3s3Y058Q0_8Y5=0.1b3w8!6*0A3o8-6/0l0O1b0D0n0Q1s8;5=1a040x3)0k930k8q8*040_0h8}5`8/3L9b3G0h0q1b0d0d332U9k9f3,8 0s9p490N8 0b0r0U9a4R8q8 0)3Y956*0l8+1s0z2x0g9t4n8 0I914Y949U9G6/0b2q04010w1s0b2/0g2$0r0g0#01929V938q9v1b9x9z9O2t0L1b0!9{3x9J0l9L0l9N4R9W5=9}040+9F8ua2a4a6589;9=6*9@049_9A3e6*aa9 9B9H9^0g1$2n0zadar1baca7968@040-1s0r3)069U961b99a0169d95au6/9h9j0d2!399oaW8~1b9sa(5`amaoaS019Q9Saiaj8q9Y1b010X0h2v0O0G8`1|0P2n0 122j0l0b1o2A9:9;aP042!0z9-0laB9X0n1bap8Z6*a`9!8_8{2W1|a:2T1b0?a:a.9ybp3D8qasa:9I048Qa39Mby0B1b0*by9Z9/4YaN94bfaRa,3GaUa:aY049k9(0#a%aq6/9rbC9wbEa:a=bd9Va_bU9$0l0i0r0#2T1s0k2x0kb,330QbVa@be6*97bhbjbl5=bD9`b#3,bIcm49b)9ka#b-0db^a*0IaM80978,cp4nb%cD3jaH0S0#0|bkcG1 8 a?4taOceaQ0rbF2*8qcFb/5=cr9l0l9ncvcN16b;c+01ckcW8(5`b_9Ta^brb}9%9)9+9-cbcRc_6/c:a:coc!6G1b8W0q0Bc1ci5`aaaE3ca85`0.aHaJ2`b`cSd3b?cld73Gd6bq8=1b0l0N0d0A8`9%dedvaDdG3,db1b8dbXak6/97b!du3,cZdx6B0h1b1H0z0d0i0B0_cw04a+dT9udsc;9C1b9R4lb$3oa^c.0b0Pa{01012!b 0Ldc0kcJ1Gc70B101|2/cLc59(0kd%2X0s2`2j1x3.9L0k0n9*0g1tdDbv0I9E523Gd|d_9;0$3J9xe835cM5R2teA3Lajd d04Bajdj3Gcf0`chaFald/d59~bJdzdBeudFeX6/dgdh3seSdKbQ04dNdq8)cUd:8.8:c.0ldY981s2`0ddAdCdEb9d*d,dWa-eZc.c@ccb{c`a{1Be2e41{0k350q0N2!0k2Xe)b9ft1|0OebcK33eP3PeRbfcg0#eIe/9?fdd-4ndwbGav04f5fv1IbWe^dke`a:dVfQ8=f0ecb92R0#9L0d0Pahfb3Gc-fN2td4fe1bexdiaebL9KbOf`04d?eydUeBb{d{d}9!d 0E0@9L3l331|2Tea0kec33glcKf*enb30gb8ag0k0sesfyb1ghfx101j0n2$0f2!0b0IateJ1 eLeRfk0ie31|e6gie90O00d!0kfn0O130)0keD0~gVeHd@3,gOeNd dpbYfRfvdJ49dgg`4nf_f@1 fPcXfRdadc0#g?dPe_040A1,1{g}3j1bg_e+a99d0BfVf}ar9d35aAhjdkdmaKd*cQeQeRg@dQ1b0Bc;e:4ghhf7e!04gLf;4*afg1hoe,aDe.3DhG4whPa5hxh8hAfGeVfIhf1 dl1bgUh#fX3#hIbvh*16g|hth;hbhJc.h2c=h{1faya3h#h%bih)h`3,h,04g*9xaMh:iafZc.f#h3f%1b0n0y0L1q0rf6h?g2faf$cjfMhN499Dh@3Hdziqc0eqd*g4gMaTg7aOg9d~a|ipir0kes0kfv0k0Vg!0n0k2vbwgkgm0lhM6!gNgaeR0%001j0Q1g2x0zeei`fniXiZioiqgfg.49g:9;eOi5cT04hEiDg iAfOe#e~dZ9(d$d(aLiviKd1hAhWf^izixdfjgh03Td92!dbddi9g{dIjDhXfSiG0riIc^cdhC049yieg2hyfEjqjra1h|iuhRa9jFj!fc9^b@h~jwjehg04h5jCfgfFj9hc2wiDbKhijx01h f~i20iaziD0LhlhnfKhpiFhsj%eThvdojSh/d26Bh=8|jG9|j$k8dyjYklj}j fRk1k3jMh$g^h}ktj,jui1axk2i4kmh1kohVf~350giHf:hzjNiyj)dtj-kKhLe$fSe(f7k7kMaC040,hU2*jW16dL4iifhBhadSkXiM9ee~f01f0Y390B2Jit1sf.jmj}f?k`c/jtila)04f|kpkjf bNhZg2joi-k{fFiPgb010o0gl00#l21|fnj:0#iWf7gC0?bMagbSg5j4i/ajgQgSg)eEgVi)fB1teklHdca30k2m0 2XlGg0a50*lglo01j59VgUe8i!c7lv8W140Bc4gZcV0h2#bi0@l76fi.iN94j7kyig490O0p1b030k0K1t2m0#8Q9-i|fAed0ni%gC2/jJlCg#l)kRjUkTd8j/2!fz0_kIkccnkLk.aG1bdnm3kSfhkqj|lhjvabjclci0mIkZjhmC1Ch6j8jOj^hekJjykrfJk)e,k6k4hq0LkbmTkdmMhwm-j~9d2n0Pj`kkm:ldmUi,n7h{lHhQm{mZ0Zk-9efRnclll81bjT1cjVk/iEm$mEi_k4mJnimRkBjpkznzjZnejEmVm j{nAkEmZn9mYhHankGkx58dOmQhajbnIn5m@hDk(mKcekemOna9qnn9Fnrmcme0kc4i#mjml0#gt0zj1g!mogn0bb5gomun~gundmPj?jOfHn6ny8)aHidn*npkifYjahFf~8WnumGnFfOm?m ibmNh!a7n/md04mfi}lEk l10q0@i{o5lBftn{lUkhh9j(anj*kCm!j}bKlBnwnHmHnPmSnLnGnNk0nRoqo8k@okjQohd;90n.8qn:oBo5iXoFlxoHfogYefl#oKjAm(m9ojh{oo0rmFm`o(jfoVlabKkwo-n%hSo!orj.o%n+o)k!pkpemznVoRa/j+phpfj.fTk%oZ0(nhnrk;7%o9haobiDibh.fWo/eTiij}iknO4nc$ctb.lal9pD1 jdp*c,d=nonUma4nbsa|a~0Bb0b2fto2b7bMba27m)link0g0bl4f8m h_o#9P1b0FbTd~d*0Cq3mBprodmUpJfLkVe{pno*h4p6j;nBp=2t97m+ohnrnJnEm;hkn#n!jIpwqnm|aIm~nmo@p8mAnbmxq7fUhKqukq0nl02xn3ivbJ0N9^2/f9k!qmo?0IcyqTpyh{qmnrqbppjXq;k*q!lipvqkpVbgh(ocnrp@0%0L8Q0qm_1$bcqa1b0,iDp@0k0(0kfDpZknpCpsjHip33q/m#q5qXpGlmk?oQr6k_p-01pY8qc$b,p%rJp)rvjsqriJp:pN5`p@b~c0c2l{1tc6c80lcar5ihr7i7r9qqoSkWrJkuaX9ib*a!0ra$c*qR0sq@5e0R8$8X8Is70R8L1J0z8Nsc2:2,2a2c2.0n1`s98L1Prs1 jA0d0h0n0.is0G0c1b1B1D1F1H0kno1S3t1Q1nq6c7sE3J1pgIl!9x0g0P0L0(bM0O0#0f9L0bg(fn1f0y0`l!c12Ji`0P00l20Y0U0@2JbNlCgy95i#0G2!0h1+250Y0b0x0R0R0h0#0!0A0B0.19pc0B0n0!3.0Q0Rtcte0R0%hmf-p{0/0w0c0/0X0H0ltutw0X0:2K1:9(gzcLm21J0n3L0s3wbxs604cJcL1JtR0Ift9Kn~0 1i0}0U9%c7tZ1{0 0L0Ns*0zl$lzi#tP95tRbukltRat1Z8K0`0|0~04.