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
.128013bqO,9vià3o_;}jlpwT!f( g0]6-)2As1+8eW%né4è[Em5tCLRPhkN:c.a=ryDFSu/7{d050@0J0U0)0h0p0F0w0%0p0)0F0F0*010U0h0q010406050F0:0S0S0)0+0,040/0k0p0:180k0M0w020)0S0q0m0w0X0J1i0+0c0:0J0F050;1f1h1j1l1d0q04051Q1J1T0;1Q1d0@0h0g101214160Z0h0x0Z0p1+0Z0U1b050{0b0p0J1$1315011*1,1.1,0U1@1_1=0U0+1R0U0Z101o0F0q0)0M160D011{1(010u0}0J0M1w0J1=2e2g2l1}2o1_2r0S2t040a0w0Y0+0k0q0k0F0h1r1t0_2c0+0+0J0%2O1J2v0M1R0;2a2!2729281?0@2x161.0M2q2L1=1Z1#111|2.0h2:0M0k2@1=0q2T1R2Y2!351e2f1t2_2m2~0+1i0p1b0w0G2X391c382w3b1}3d3f3h0D3k2g3m2Y2-013r0)3g040w0j3v2Z1d3y3p163B3D0w0O3H3x393z3N3h0T3R3J3T3L3A0k3e3C3h0A3Y3n3a1%3q3%3s3E0=3,3K3/3M3;3)3E0I3^3!3`3$3(3O0f403o423V040G0y473.2`433=0G3j1K3l3Z484g4a0G3u4l3w4n4f3c3|3D0G3G4t3I3-3U4y1b0G3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4$414(4U0G464,4M3:4U0D4d4=4w4@3=0D4k354S4Z4)0D4s514Y49544B574%4N4~4J5c4-5e3}0D4Q5h4?3{4^4W5n4|5p4~4#5s4T4~4+5x534^4;5B594U0j4`5F4.3=0j504m585L3}0j565P5d4}5S5b5V5i5X3D0j5g5!5o4h5S5m5*5t5,5%5r5/5y5S5w5@5C5M5A5{5G5M5E5 5R3D0O5J635j655O4u5Q691b0O5U6c5W5u3}0O5Z6i5#6k655)6o5+4a0O5.6t5:6v5?6y5^655`6C5|6l5~6G606l626K641b0T676O6e040T6b4D6j5;6Q6h6Y6p6!6V6n6%6u4)0T6s6,6z6.6x6;6D6Q6B6^6H3D0T6F6|6L6~6J716P6V6N756U0A6S795$1b0A6X4L6=4U0A6$7i6_040A6+7n6}7f6:7s727f6@7w760A6{7A7a707E7e7p747H6q7f787L6)0=7c7P4a0=7h527x040=7m7X760=7r7$6U0=7v7*7I0=7z7.7M7Z7D7=7Q7G7_7U7K7|4)0=7O7 4U0I7S833=0I7W6d7I0I7#8b7?0I7)8f6)0I7-8j4a0I7;8n4)0I7^8r847{8v887K1U331J2@2%0@292,3#0%2 2D0^1!1R320J343l3R058K0_8S5+0!1b3p8U6Z0r3h8%6(0M0%1b0K0)0x1s8+5+1a040$3Y0w8}0w8j8!040_0u8@5:8)3E953z0u0S1b0l0l2|2N9e993#8_0v9j420b8_0F0J0p944K8j8_0e3R8 6Z0M8#1s0U2q0:9n4g8_0C8{4R8~9O9A6(0F2j04021F0k0U0m0V1s0F270:2V0J0:0+9V0:9X0m8|9P8}8j9p1b9r9t9I2m0k1b0(9|3q9D0M9F0M9H4K9Q5+9~040*9z8na3a5a7519=9?6Z9^049`9u376Zaba09v9B9_0:1!2g0Uaeas1bada8908.040#1s0J3Y069O901b93a116978 av6(9b9d0l2T329iaX8^1b9ma)5:anapaT019K9Majak8j9S1b9-9/0E0u2o0%0Z8;1`0@2g0 122c0M0F1o0Ja}9Y9;9=aQ042T0U9+0MaC9R0)1baq8T6Za{9U9W9Y8:8=2P1`a;2M1b0?a;a/9sbt3w8jata;9C048Ka49GbE0h1b0nbE9Tbf9:4RaO8~bjaSa-3zaVa;aZ049e9$0+a(ar6(9lbI9qbKa;a?bh9Pa`b!by9Z1s0g0J0+2M1s0w2q0wb?2|0xb#c1aP6Z91blbnbp5+bJ9{b,3#bOcu42b:9ea$b@0lb a+0CaN7_918$cx4gb.cL3caI0s0+0|bocO1}8_a@4mcl6(91b+b_5+cNc(5:cz9f0M9hcDcV16b{c=01csbL2Z9w1b9Lckb)bvc49.9Y9!bb9%9)9+cj9Na_amb}ctc+3zcwdh4Z1b8Q0S0hc9cq5:abaF35a95:0!aIaK2:d0al6(c`a;djbu8,1b0M0b0l0r8;9#drdiaEdR3#do1b86b(dD8ZaR0Jc{8Y968*c^0M0u1b1H0U0l0g0h0_cE04a,dk9odfd(c}04c 4{b-3ha_c^0F0@a|c5b#b#2T0M0g0kdp0wcR1Gcf0h101`27cTcd9$0wd?2Q0v2:2c1x3%9F0w0)9(0:1tdObB0C9ye33#e8e59=0.3C9rem2~cU5K2meO3Eakecebc5dCdw3zcn0`cpaGde9_b~c^dHbMaw04dLdNdPbbdU42dtdu3le*dVbW04dYc!d#92d%a;c*dI6ud.921s2:0le{eIdQc^c@d|4gdFfpc~cY4uakf442bwb#1Befeh1`1_0w2~0S0b2T0w2QfnbbfN1`0%epcS2|dba^bicm1bco0+eWf39@d~dG9 bPdKdMfP1Ib%f9dxd$d 8(d+fr3cfheqbb2K0+9F0l0@aiff5:fqg83zftf}cW1beLdvafbR9EbUfue1fw7daUePc2e7e9bxd40me$gx0-0N9F3e2|1`2Meo0weq2|gJcSg1eBb50:baah0w0veGfSb3gFfR101j0)2V0P2T0F0CaueX1}eZfyfDegeiekgGen0%02030j0f0md:0wfH0%130e0weR0~g_eV4e3zg:e#e%gxfXcZdddJ04fPe 4gdtho2mgdgbcvf-d,dm2TdodqdcfZc#1b0r1*1_hra2hme}hJ160k970hf=gias972~aBe/c#dzaLd_gp1cfyf@e+1b0hd(fz4phFhMe?hwge3MaggmhT6(f1hN3Ah`a6h$e)fybjf$f(3wh/2mdy1bg^i4d1hlhnhYaadTij6zh;bBf,04g-hu49axaza4e)i6e-f%h ic04h89raNh*3#c$fcc^fee^8,fh0)0o0k1q0Je|ipgnd{itfsf+gnghf)e_2~0:c8eEd_e2g.gre!bigueahhhga~iSiU0weG0wfP0w0ih20)0w2obCgIgK0Mis6Tg/gvfy0Wg|g~0m1j0x1g2q0UesjqfHj2j4iRiTgDhceNjghfi`jD9/iyf!04h-h htiOikirf.04d:d=d@aMiYi:hjh)ia1}jLc|aDjOhx04dndp0+h hqim3UdKiTi-g7fxhkfa9siGgnh%dZh)gjiih|jNf2i9f*e;dgi!9}h@kbhKj+hBfYk1jHhG2ph bQk3kehOkdjMinaoay0gaAj.hQhSi)h}hV9XiCh!dBj~ifhD6uio8?j:hvacknkNi8j$h}kskVkMkviwhXkii5e_kpktdSj(h^i0k!kxixkPf0ilk4kui+j@jGdEi$k.e@kYk`f:e}kBk7j%0Hk62ZjZ16dW4biHigfac%kq01iNl23Ufh1f0q320h2CiW1sg5jUk.gak+3#j#d)3z9xkSgkbTi2gnjWjei=i5i^gw9/gz9/0/0:lr0+ltfG1`kg0+j1e}g!0?bSahbYeMfAjB9=g=fFh7eSg_jafV1teyl,dpa40w2f0 2Ql+gla60ni(lN01he9=g^emj5cflW8Q140hcch1d%0u2Ubm0Nly68jfgs9OlT9Yhij_kL5:0%0G1b030w0d1t2f0+8K9+jsfUer0)j8g!27j?c9h2fSm7j^3Ik(hl8QfT0_k=k_k,la98cmkHmumCc2k)h=m.kQm:lcc_k lkl1lEdlj*hzj,k}faklhIk?h:hLiXm|f0kAkzj=k$kC8Zm?nk042g0@lHk*lnkQjdnwiulIahj.1b0tm~gjl,h{lkcXkKm bQm*0Jm,nml7kWkRnd3ckTnMk2m{nndsk^n$j;nfkOl0kXn4nA1fk#lgmDh+jIh.n!ngn)cvnjnW1}iDdAm@nz9J1bh%d!mEmG04mIccj6mMmO0+gR0UjxmZgMer0Fb7gMmXl%h3m#nZjHi7kG1biFo4h(j`f^n_lHnPnRnqhRozaJh#kJa8m mFmHomj2lqls0S0Njroml$fNojl|owk~k9f`nUnyn/nel$nDnVnhnenvo:kck-lkbQn;k;nSm%oEn^j|oCe0o8oRobmIjtl)oWlYoYfIjjg h1m3o#n7khjXkjm)2Tm+jpiqo/gjp0kyo0kro@n}nAo`bNn.pykwpAk%lha.n1lBk@o}pQnefml5o?0BnG6Zle7Wm(faoypB01iDief?pNn^ljpT2mlmo{2y9cb;a#0Ja%c;lza+b|o,i/j p%5:fBc5a b1b30xb5oqb9bSbc1_mBp3n@n5nIa60Flve~p*j/o^2m8_0QbZi_lSe(gn0zn9kuo`m qupEi#q3h?pSo5nXn61Cn8hCm_hEhmhHoCnNnYqtn qv1}hPnloMo3i3qUq6n*qo0:qqf;pwjP0)lr2qntiYbP0b9_27d_iZp=hKpG6Z9KcGq/p4n5qHpHpDnTkZr8o.jPpzm-pqiI42e,bmiBp*q8gx0W0k8K0S9X1!beqCq(pC0Hh rw9/0w0B1urFn2pIe_iS2|r4jPq=q@pWlLn?m iKo-c)f|lkc-b?b^nKq1c^lDe0lMqlqV5+rKd5c7c9cb1tcecg0McirPm^rq4grse.rGn0qMn-qOp^16c-cBr.r6c?cF3,0;8W8R8Bsr0;8E1J0U8Gsw2*2#0)1^st8E1Psg01hz0l0u0)0!iV0Z0j1b1B1D1F1H0wh%1U3m1Q1nq?cfsV3C1pg*m29r0:0@0k0BbS0%0+0P9F0Fh6fH1f0o0`m2c92Cjq0@00lt0q0p0N2CbTl%gW8 j60Z2T0u1)230q0F0$0;0;0u0+0(0r0h0!19nQ0h0)0(3%0x0;tttv0;0WhRg4b20)0L0V0j0L0E0R0MtMtO0E0f2D1.9$gXcTmt1J0)3E0v3pbDsq04cRcT1Jt-0CfN9EmZ0 1i0}0p9#cft^1_0 0k0bs~0Um4fGj6t+8 t-bAkOt-au1X8D0`0|0~04.