Livret d'épargne

Un livret d'Ă©pargne permet de placer de l'argent et d'obtenir des intĂ©rĂȘts.

Un livret se caractérise par :

  • son plafond, qui ne doit pas ĂȘtre dĂ©passĂ© par les sommes dĂ©posĂ©es;
  • son taux d'intĂ©rĂȘt, qui permet de calculer chaque mois les intĂ©rĂȘts qui se rajoutent au solde.

Dans cet exercice, on souhaite créer une classe Livret, décrite ci-dessous :

classDiagram
    class Livret {
    -float depot
    +float taux
    +float plafond 
    -float interets
    informe_solde()
    depose()
    retire()
    applique_interets()
    }

L'attribut interets permet de stocker le cumul des intĂ©rĂȘts gĂ©nĂ©rĂ©s par le livret.

On initialise une instance de cette classe en renseignant le dĂ©pĂŽt initial, le taux d'intĂ©rĂȘt et le montant du plafond.

Seuls des dĂ©pĂŽts et retraits Ă  l’euro prĂšs, pas de centimes, sont autorisĂ©s.

🐍 Console Python
>>> livret_1 = Livret(500., 0.01, 20000.)

Cette classe possÚde les méthodes décrites ci-dessous :

La méthode informe_solde

La mĂ©thodeinforme_solde renvoie le solde du livret, qui est la somme du montant dĂ©posĂ© et des intĂ©rĂȘts.

Exemple : si on a dĂ©posĂ© \(500\) euros, le solde sera de \(500\) euros. Si cela gĂ©nĂšre \(7,5\) euros d'intĂ©rĂȘts, le solde sera alors de \(507,5\) euros.

🐍 Console Python
>>> livret_1 = Livret(500., 0.015, 20000.)
>>> livret_1.informe_solde()
500.0
>>> livret_1.applique_interets()
>>> livret_1.informe_solde()
507.5
La méthode depose

La méthodedepose prend en paramÚtre le montant du dépot, modifie l'attribut depot si cela n'entraine pas le dépassement du plafond, et renvoie True si l'opération est effectuée et False sinon.

Exemple : si on a déposé \(5000\) euros, il est possible de déposer \(1000\) euros. Mais avec un plafond fixé à \(20000\), on ne pourra pas déposer \(16000\) euros.

🐍 Console Python
>>> livret_1 = Livret(5000., 0.02, 20000.)
>>> livret_1.depose(1000.)
True
>>> livret_1.informe_solde()
6000.0
>>> livret_1.depose(16000)
False
La méthode retire

La méthoderetire prend en paramÚtre le montant du retrait souhaité, modifie les attributs depot et interets si cela n'entraine pas un solde négatif, et renvoie True si l'opération est effectuée et False sinon.

L'argent est prĂ©levĂ© d'abord sur les intĂ©rĂȘts, puis sur l'argent dĂ©posĂ©.

Exemples :

  • Si on a dĂ©posĂ© \(5000\) euros au dĂ©part, il est possible de retirer \(1000\) euros, mais pas \(7000\) car le solde deviendrait nĂ©gatif.
  • Si un dĂ©pĂŽt de \(1000\) euros a gĂ©nĂ©rĂ© \(100\) euros d'intĂ©rĂȘts et que l'on souhaite retirer \(400\) euros, alors il restera \(700\) euros dans le depĂŽt et rien dans les intĂ©rĂȘts.
🐍 Console Python
>>> livret_1 = Livret(5000., 0.02, 20000.)
>>> livret_1.applique_interets()
>>> livret_1.informe_solde()
5100.0
>>> livret_1.retire(1000.)
True
>>> livret_1.informe_solde()
4100.0
>>> livret_1.retire(7000.)
False
La méthode applique_interets

La mĂ©thode applique_interets calcule les intĂ©rĂȘts du livret et les additionne aux intĂ©rĂȘts dĂ©jĂ  calculĂ©s. (Les intĂ©rĂȘts ne sont pas pris en compte pour le plafond, qui ne concerne que les sommes dĂ©posĂ©es.)

Les intĂ©rĂȘts sont calculĂ©s sur le solde (dĂ©pĂŽt et intĂ©rĂȘts dĂ©jĂ  perçus) et arrondis au deuxiĂšme chiffre aprĂšs la virgule.

round ?

La fonction intégrée round permet d'arrondir un nombre donné. La fonction prend en paramÚtres un nombre à virgule ainsi qu'un nombre de décimales et renvoie la valeur arrondie à ce nombre de décimales prÚs.

🐍 Console Python
>>> round(65.1745, 2)
65.17
>>> round(65.1795, 1)
65.2

Exemple : si on a dĂ©posĂ© \(5000\) euros au dĂ©part, un taux de \(0.015\), (soit \(1,5\%\)), ajouterait \(75\) euros d'intĂ©rĂȘts. Une deuxiĂšme application du taux gĂ©nĂšrerait \(76,125\) euros d'intĂ©rĂȘts, arrondis Ă  \(76,12\), pour un gain total de \(151,12\) euros.

🐍 Console Python
>>> livret_1 = Livret(5000., 0.015, 20000.)
>>> livret_1.applique_interets()
>>> livret_1.informe_solde()
5075.0
>>> livret_1.applique_interets()
>>> livret_1.informe_solde()
5151.12
Comparaison de nombres flottants

Lorsqu'on Ă©crit a = x ou x est un nombre rĂ©el, la valeur de a enregistrĂ©e en machine est une valeur approchĂ©e de x (quelques fois la valeur exacte). Cette valeur approchĂ©e a la forme d'un nombre flottant (le type float en Python). En consĂ©quence, alors que des calculs et des comparaisons peuvent ĂȘtre effectuĂ©s de maniĂšre exacte sur des rĂ©els, ils ne le sont que de maniĂšre approchĂ©e sur leur reprĂ©sentation en machine. On peut donc obtenir par exemple, avec a = x et b = y, l'expression a == b Ă©valuĂ©e Ă  True alors que x et y sont diffĂ©rents.

C'est pourquoi les tests ne vérifient pas l'égalité des résultats et des valeurs attendues mais leur proximité.

Ainsi, on peut vérifier que \(\sqrt{2} \approx 1,414214\) en faisantassert abs(1.414214 - sqrt(2)) < 1e-6. Ce test vérifie que les deux valeurs sont proches à \(10^{-6}\) prÚs.

Compléter la classe ci-dessous :

###(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
.128013:,ĂȘLkn9DS{vFsuO8;y7e62-0wr5_pag)R1iTĂš/Ă©=mhb.4x+*oPdt c(}3qlf050Z0u0!0E0J0+0n0#0$0+0E0n0n0O010!0J0D010406050n0o0P0P0E0A0s040j0X0+0o100X0g0#020E0P0D0r0#0H0u1a0A0*0o0u0n050M17191b1d150D041B1I051L0M1L1N1I150Z0J0l0^0`0|0~0Q0J0F0Q0+1#0Q0!13050:0R0+0u1W0{0}011!1$1(1$0!1.1:1,0!0R0X0Z1d1-0A1J0!0Q0^1g0n0D0E0g0~0w011=1Y010,0=0u0g1o0u1,2d2f2k1@2n1:2q0P2s040a0#0Y0A0X0D0X0n0J1j1l0.2b0A0A0u0$2N1B2u0g1J0M292Z0!2726280Z2w0~1(0g2p2K1,1T1V0_1?2-0J2/0g231U1,0D2S1J2X2Z34162e1l2^2l2}0A1a0+130#0I2W3814372v3a1@3c3e3g0w3j2f3l2X2,013q0E3f040#0)3u2Y153x3o0~3A3C0#0T3G3w383y3M3g0B3Q3I3S3K3z0X3d3B3g0v3X3m391X3p3$3r3D0t3+3J3.3L3:3(3D0q3@3Z3_3#3%3N0h3 3n413U040I0y463-2_423;0I3i1C3k3Y474f490I3t4k3v4m4e3b3{3C0I3F4s3H3,3T4x130I3P4B3R4n4w434G3W4J4u4E4N4a3*4Q4D3!4p3?4W3^4o4F4a3~4#404%4T0I454+4L3/4T0w4c4;4v4?3;0w4j344R4Y4(0w4r504X48534A564$4M4}4I5b4,5d3|0w4P5g4=3`4@4V5m4{5o4}4!5r4S4}4*5w524@4:5A584T0)4_5E4-3;0)4 4l575K3|0)555O5c4|5R5a3k1K321B2?2$0Z2*3y0$232C0-1U1J310u335Z4J055,0.5@5n010f133o3Q5P2l0z3g635V3L0$130e1U2S0!685h1@12040b3X0#6o0#641@60040.0,6h5~663D6x5s2m0P130C0C2{2M6G6B3y6k0%6L3!0R6k0n0u0+6w5_69016k0c3Q6q6Y0g130P1k0:0g0!0C0.2e0A6g6X6i0~6!6$6r3L130:0o0U6H6.0u6f6P416{4J6%6_3z130D0`0,1k0Z774f6k0G6m4Q6p7q7b5~6R136T6V7k2l0X130S7y3p136;0X6@347s6C7A040O6|6(6*6,2f6/6;1b7I4l7r6p6}017u047w6W366Y7M7C6^5~6)04700U7P7c7M7O7a7#7;7?730!750/6n7Z7K3y7%7)7D0~7-8a7d047f0E7h0g7j7|7,137{7J7}7e7g7i847Z7#886U7*5Z8m047.7+7c7;2{816f1A8l7_8n7^5~0P0,130y8D4l067q7#6t6v8d6z6q7/6C0g8R042{7h3d0u0C0n1g0.8d6N8d8x7x8(6M137n8u7r8Y136f0o0A0g8O6C8{8z3v7#8c8}4Y7F0u2J7X3v863!7M0V99876S8y8d9f8E7:138H820!8K508W7!6Y8Z0u9c2Y7#8$8d8*9i2J6T8^136O9g419b9T046#8L9y046+6.7T9Z907p85938,9K6A7Q9(7S6.9r9o139q9$9a9t8|9x7L7B9O9Q7H9{417M020+0!0r8o3k9n9Xa19=9ea59W4o8r8h8tao2l6k7o5085926Y9Yat1@9w8A8Fa79l2Yai4f9pag9m8q9^9*9`9.ay6o9:9597a94f0f6b040K0A1y918X9H136U9SaC6`13aw7YaUaVa-04aX989 3ya#130m3Ba:9Ea,7c9Ial6Y9Na;3z8+6f0J2S9Z9Va39s7v9ubd798p9@9)6-aI5}6C7ma@4tay9:0J9=aKau9U8`ak9vanbl9h6u9ja8a 9|049~br7caBbMaabLaF9%9A8J9,aZ7z130xb*7EaQbub.8b13020FaeaNaJ7#0P0J8S9Zbz3Ha_a`b89zbE8wbJbdaE9d9@b%0/9Daham04b-bR487RaRbvbFaDb@b_afb=01b~c0bpa?a+c4c9bna2b#a48Ca68,74b(cmaLb,b{9?aGb:9+aTaU9:a/0uc1cCa_aPbtcVbV5~7M0xcRcr0~bXcH3ycc9LcecMcgc$cXaAcabYcPcJbd8Gc{9Ccw7`cwcy045Ia^c49GbWd0c?bS8UcdcT7Gcqcjc.cw7;c)aSaxcDa{a}cwb1a%a)c!cWb75~6tcZc#dF9/dy0/96a~c+6CdBb30?dEb6dgdH9iba7cbcd13b8+0E0D7f0J1x8:cfd7cA04bkdjajcFd#5~byc}aP8=0+8@cOb+7Ncwc=dmc,b!e98)9zd6chaO8BbUcic d{bKd3d(b/dod c`8I0/0C0$180o1:egb|8Bc/7}0R940X0o8jbjcKe1e3dRc@130We7dieceQeod_ap7=0E719Z9#eP3!db5TeV3!7mesdhemcbebc_cTd;eBcSeabTeEet9BeweyeA3+0M5{5?5!f80M5%1B0!5)fd2(2!22242$0E1/fa5%1Hbw3y2S0P0C0,0E0f8:0Q0)131t1vd/0@c22Z1R1M040p1l0l0X2M0#170A0^0/0#0u0U750$0J0$1;1x000=0#0D0u1i0#0d2%1;0D0N0A0=1:710#2P1a0g11ez750#0+000E1}f^0Rf.5`5-bO9k1Bf73D2pf|0u0Q3$0@2P0`2w1;gb5|6d0l76f6gc0^1bfUgp6T0#fwfQ0n2f0@eA0#0lf@bDf#g60J1k0@0g0Nf$0|0;2S0n7.fJ1IfMf|fQf(eJ0#g62%0Jg90!fW0ng=162%1k0F8ff^gM2Wg`0gg|0#1x2f2+f*0g001zg=2egnbh2T812B6.g-0$gW2LfnfW2Ogkgmgjg30Ef|0N2nf 2Nhtgp3o0u0S8%g$fL2OfPg=3Bhs1i0=0J6TfT0.0@0P0N295-0@d+f,0+0N1z6%h1g|0Ehl1z6T969Dh*3D2J96g3hfg3f-fT0l3Bh|fWg=0Zg51igZg-d,6Uh%0@g_2Hh29(1ig6h|h;idh3h@fTgK6+1T2n75g#3l1I0igI0#2}f;fWfY1p1:0ch{hZg7g:1iibggergx5|i16qgge`gfgy0ZfP0l2pg=f:2S2b0g2L0Zf@0N0@5,19f=g~i,hF1Kiu040ei00$1bh,0!0Li$311U0Ng?g=2{1T1xj46=h{fR0s0P221:c:011b2M0Q1a810U13090%0x090G6$0.h~hjf`fT2}0Pf|ixjh1T0E0F0A1o2B0^0J0xhT8=0ofGi@1Hi$e*751a0J0Z1,gg3o0i0JjIjK0P9F6o3o0#gu6f0#0kj.0#0x0,0+0Xg6gj9kj_0Vj|j~g=7?k2k4j 8g8i2+j_j{j}j e`j_8-3:8:eN0u0%0Gj_7G6Tkpj_bg2Sku7qh!1(d/809B0nky6p0(iU5|f9i^0ehvhVhX2Pgs5?kAd.1ykDcNggj50#g,0Pig81h^img3g5iIg;iRgciTiO5?iQiohWglhTk:5|ksdEkZfVkSa|0/hfkJk@k|k%0:k)0A0@k+g4g.g8gaiMbP6@ggitfqkN0#kPk{griS8*kl8;8?l0gyhRi2g5h-0|i0lfh(0.f{lhiJ9Clo5$0/0;0?04.
graph TB
    a