Cycle menstruel (1 IDE)

Fonctionnement de l'exercice

Cet exercice est découpé en plusieurs question. Vous avez accÚs à un seul IDE pour toutes les questions. Vous avez également demander l'avis d'un examinateur virtuel à l'aide du bouton "Appel au professeur". Il pourra soit vous dire de continuer l'exercice ou vous donner des indications sur votre code et éventuellement des aides.

Pour mettre à jour les aides de l'examinateur virtuel, il faut exécuter le code.

Le bouton Validation ne devrait ĂȘtre utilisĂ© qu'Ă  la fin de votre exercice, comme pour rendre votre travail.

Comprendre le cycle menstruel

Le cycle menstruel dĂ©signe l’ensemble des transformations physiologiques cycliques qui se rĂ©pĂštent en moyenne tous les 28 jours chez une femme, de la pubertĂ© Ă  la mĂ©nopause. Il est constituĂ© d’une succession de deux phases sĂ©parĂ©es par l’ovulation.

  • Avant l’ovulation, on dĂ©finit la phase folliculaire
  • AprĂšs l’ovulation, on dĂ©finit la phase lutĂ©ale.

Par convention, le cycle menstruel commence le premier jour des rĂšgles. L’ovulation se rĂ©alise toujours 14 jours avant le dĂ©but des menstruations.

Le schéma ci-dessous résume ce cycle:

image_dd14d5ec

Objectifs

Ce sujet propose ainsi de concevoir une application permettant de calculer et de prĂ©dire les diffĂ©rentes Ă©tapes du cycle menstruel Ă  partir des dates fournies prĂ©alablement. On suppose un cycle rĂ©gulier de 28 jours et on distingue les quatre phases suivantes, d’une façon simplifiĂ©e :

image_dd14d5ec

Dans ce sujet, une date se reprĂ©sente par le tuple d’entiers (jour, mois, annee), et l’on suppose toujours qu’elle est correctement formĂ©e et correspond Ă  une date valide du calendrier grĂ©gorien.

Par exemple, la date 7 septembre 2025 peut ĂȘtre reprĂ©sentĂ©e par le tuple (7, 9, 2025).

Question 1

Une annĂ©e est dite bissextile lorsqu’elle comporte 366 jours au lieu de 365. Une annĂ©e est bissextile si elle est divisible par 4 Ă  l’exception des annĂ©es divisibles par 100 sauf si ce sont des multiples de 400.

Par exemple :

  • \(2024\) est une annĂ©e bissextile car elle est divisible par \(4\) et pas par \(100\) ;
  • \(2100\) n’est pas une annĂ©e bissextile car elle est divisible par \(4\) et par \(100\) mais pas par \(400\) ;
  • \(2000\) est une annĂ©e bissextile car elle est divisible par \(4\), par \(100\) et par \(400\).

Écrire en Python une fonction nommĂ©e est_bissextile qui prend en paramĂštre un entier annee correspondant Ă  une annĂ©e et qui renvoie un boolĂ©en indiquant si elle est bissextile, en appliquant la rĂšgle donnĂ©e ci-dessus.

Avis de l'examinateur

Appuyer sur le bouton pour appeler le professeur virtuel

Question 2

Écrire en Python une fonction nommĂ©e determiner_phase qui prend en paramĂštre un entier jour (compris entre \(1\) et \(28\) inclus) qui correspond au jour d’un cycle et qui renvoie un entier correspondant au numĂ©ro de la phase associĂ©e.

À l’aide d’une assertion, on garantira que l’entier donnĂ© en argument est compris entre \(1\) et \(28\) inclus.

Avis de l'examinateur

Appuyer sur le bouton pour appeler le professeur virtuel

Question 3

La fonction ajouter_jours, dont le code est déjà fourni ci-dessous, prend en paramÚtres une date et un entier représentant un nombre de jours. Elle renvoie la nouvelle date obtenue aprÚs ajout de ces jours.

Cette fonction utilise la fonction jours_dans_mois dont le code est déjà fourni ci dessous, qui prend en paramÚtres deux entiers annee et mois. Elle renvoie le nombre de jour dans un mois dans une année donnée.

Fonction annexe

La fonction utilise la fonction est_bissextile définie à la question 1.

En cas d'erreurs sur les annĂ©es bissextiles, il faut peut-ĂȘtre retourner voir votre code pour cette fonction.

ComplĂ©ter la fonction test_ajouter_jours en ajoutant au moins trois autres tests pertinents. Pour chaque test ajoutĂ©, une brĂšve justification doit ĂȘtre donnĂ©e afin d’expliquer pourquoi ce cas est important Ă  vĂ©rifier.

Avis de l'examinateur

Appuyer sur le bouton pour appeler le professeur virtuel

Question 4

Dans le but d'ajouter l’ensemble des dates de dĂ©but de rĂšgles sur un agenda en ligne pour une annĂ©e donnĂ©e, on souhaite crĂ©er un fichier au format iCalendar. La structure d’un tel fichier pour un calendrier est la suivante :

BEGIN:VCALENDAR
VERSION:2.0
PRODID: le nom du calendrier
une suite d’évĂ©nements
END :VCALENDAR

Chaque Ă©vĂ©nement d’une journĂ©e est lui-mĂȘme dĂ©crit par une entrĂ©e de la forme suivante :

BEGIN :VEVENT
DTSTART: la date JJ/MM/AAAA écrite sous la forme AAAAMMJJ
SUMMARY : la description de l’évĂ©nement
END :VEVENT

On complĂšte les nombres strictement infĂ©rieurs Ă  10 par un 0 pour s’assurer que la valeur de DTSTART soit toujours de longueur 8. Ainsi, la date du 3 juillet 2026 s’écrit sous la forme DTSTART : 20260703.

La fonction calendrier_cycles,prĂ©sente dans le fichier fourni, prend en paramĂštre une date correspondant au premier jour des derniĂšres rĂšgles et renvoie la liste chronologique des dates de dĂ©but de rĂšgles qui se prĂ©sentent dans les \(100\) jours suivant cette date, date incluse, au format iCalendar sous la forme d’une chaĂźne de caractĂšres.

Fonctions annexes

La fonction utilise les fonctions jours_dans_mois et ajoute_jours définie à la question 3. La fonction test_calendrier_cycles permet de tester cette fonction.

Une version de ces fonctions est chargée en mémoire.

Observer que le calendrier renvoyĂ© par la fonction calendrier_cycles n’est pas dans un format valide.

Identifier le problÚme dans la fonction calendrier_cycles, proposer une démarche de résolution et la mettre en oeuvre.

Avis de l'examinateur

Appuyer sur le bouton pour appeler le professeur virtuel

###(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
.128013sHY3_8ÚufvIy 7nGaS1me(P4C2V:jtwi`]D[hE)6Oo;bcdUgM/T0lßàqABp!Q.rFL-,=+Nk%95Rxé050U0v0E0r0G0#0b0n0T0#0r0b0b0@010E0G0+010406050b0i0u0u0r0/0m040s0Q0#0i1h0Q0p050Y1o1q1s1u1m0+041D1K051N0Y1N1P1K1m0U0G0k191b1d1f0L0G0W0L0#1%0L0E1k05140S0#0v1Y1c1e011$1(1*1(0E1:1=1.0E0S0Q0U1u1/0/1L0E0L191x0b0+0r0p1f0A011@1!010j160v0p0r0u0v1.2f2h2m1_2p1=2s2u1k0a0n0x0/0Q0+0Q0b0G1A0p0n122d0/0/0v0T2P1D2x0p1L0Y2b2$0E29282a0U2z1f1*0p2r2M1.1V1X1a1^2:0G2=0p251W1.0+2V1L2!2$371n2g2Q2{2n300/1r0#1k0n0n0t2Z3b1l3a2y3d1_3f3h3j0n0A3n2h3p2!2/013u0r3i043k0e3z2#1m3C3s1f3F3H3k0y3L3B3b3D3R3w0}3V3N3X3P3E0Q3g3G3w0O3$3q3c1Z3t3+3v3I0n0o3:3O3?3Q3^3-3`0g3}3(3 3*3,3S0n0|453r473Z3I0t0!4d3=2|483_3l3m1E3o3%4e4m4g3l3y4r3A4t4l3e413S0t3K4z3M3;3Y4E3j0t3U4I3W4u4D494N3#4Q4B4L4U4h3/4X4K3)4w0t3|4%3~4v4M4h444-464/4!3l4c4?4S3@4_0A4j4|4C4~4o0A4q374Y4)4:3x4y584(4f5b0A4H5e4.4T554P5k4@5m423x4W5p4}404 4$5v535x554,5A4Z554=5F5a4 4{5J5g4_0e515N4^4o0e574s5f5T5s0e5d5X5l545!5j5%5q5)3S0e5o5,5w4n5!5u5=5B5@5/5z5`5G5!5E5 5K5U5I635O5U5M675Z3S0y5R6b5r6d5W4A5Y6h3j0y5$6k5(5C5s0y5+6q5-6s6d5;6w5?4w0y5_6B5{6D5~6G606d626K646t666O686t6a6S6c3j0}6f6W6m3I0}6j4J6r5|6Y6p6*6x6,6%6v6/6C5b0}6A6@6H6_6F6|6L6Y6J706P3S0}6N746T766R796X6%6V7d6$0n0O6!7h5.3j0O6)4R6}4_0O6.7r713I0O6?7w757o6{7B7a7o6 7F7e7j737J7i0O787N7n7y7c7R6y7o7g7V6;3{7l7Z4w0o7q597G3I0o7v7+7K0o7A7:7i0o7E7@7S3{7I7{7W7-7M7 7!0o7Q837(7U875b0o7Y8a4_0g7$8e4o0g7*6l7|0g7/8m800n0g7?8q7!0g7`8v4w0g7~8z5b0g828D8f868H8j898K5s0g8d8N3S0|8h8R3j0|8l6+4w0|8p8Z5b0|8u8%4_0|8y8+4o0|8C8/5s0|8G8?8S8J8`8W8M8}3I0|8Q904i8U940!8Y6:4g4i7v1M351D2_2)0U2-3D0T252v1L9h1O9f394Q059m12366:0T0t1k039D9E9F9E0n0-0i0v0b2P3l0n9G9Q9R4k3D0`1k120j3V8v0F3j9Z8Z0j1k9L0E0f0S0G1d0v0 1h1=9%6:1j040w9^6C1k2h2=0v9}5{9`0N0C3$3k3k8v9V040G9Y4Q0n8z9 0pa1a33D0Q1k0{am3)0u0G1k7Eah6+ao040@0@3Vax6:at1k7$8v9`a74Xa9aNaE5?ac2V0E0i0/1CagaJ1k9|9u8Zajala#6:azaqa)5?aG0495aD8vaz0,aCaX6+a/aI6+a5a=ay9#043+b09_aZar4fa%0va2a-5{a+b84ma/6e7$aPbe1kaBb5a.au04a}b6040Na8a9ab9*17bc39a~1kaL58aOby6+aR13aUaW37bl9U0T1k0:3G0bbC4s839A9C0n0P0i0n2r9m2V0nbG6g1_ac9Xbg2nb2ahbd3Y9)049+9-9/bW9=2qb?1_9`a!bD9ababX3AaYbvb.4AaNbz04aSbNbpa4b7b`4)cac41fbfcp47bics01azbocvbhbrbt5?a a`a*b22h0Ucm3Dc6c73oa?b2300EcNcq04a0bbcycuc8bq1ka;cC2ncAa_c%5{a|cycHbPcS1kb4cI9~cYakc!c+1_c$cRa{brbjc#bnc.d3aFcEc=1kbw4XbZ9B049R9Q9I9K9M0G1B3x9Pdkdt9T3)b;0vafc/3Db^cy0pb|120E0v3g2~dI0f0+0L1ccb2#cdcQcca$040D0QaUddcebxaabK9 9:0/cVc{6H1kdXdZd-an1k020W0E0Rd93AbQasbr7qd~470QcK0pcMd=cXd:0/cWe3d@0#d`d|2#e2cD1k0A89chd(addz3oej3ed/dYebe8ed0402efd{ecek047Icdcf3MbId%6:bLaTaVeE2na/7*eoeNbAaeeR3tevd;c@ayeeegeZ1feT7AeId$aOcickeQeyeF7/eVaQeXerd}aidWewe+czd8f3eT7Ee/aMeLe=bMe@e%db1k7?e{5{ac0vbBd!eJ1leLetb:1ke?bOes8vcxdg8vb!djdt9H9J9+dp2Q0edsfE9Qdv47dxe~dR6+dCd03Qb|ea0b0f0U2hfZ0u0Q9/d!dTfSc9c}a(dA3)9`0?f30p1kf(f*fV01a5fp83b^byf}0b0U1k01g80~2r0kf)1?1=0n300u0Sb,2SfY2Rf$0n0i2Qf{180U1B0p102R00gq1?a0101?guakgD0.fO4mg53waO0V9?9/ge1?f(0U0igf0T3G2rf#0/0n2LaU0n0W102Vg#1=18gC9L0n9.9:c2g.0.g801e:cieYe^eu04gsf3c-f6br9dbE04fpeM5?fC030n0j100k0/0GdIe:fj9U1kg ffc|b~g?c19?dQ9ycGcof;b9f/c hC4mf hnfbepfvh6el8dfrcifmbWfohJbIfcePfwe d4el7U0n06hodwe}f^f`f)0bh4b22~f39`0KcyeTd!f@h01_a/e.h9h}hsc:breHi2hN047Qcdi3fxh#047Uici94ih|ijh8bu0Ig0hQhLfdhZeifybr5Vg}ephShyf9bHhKeWcjiti95Q3$83fQcyfUhG3eb|0rd:dH0/0ffYf+dD9W0rdHilh~3Q1k0p0SiXewh:f}hI52dBgMb_iQ1_gL04g{0)iU1?i,i.aU180%gp2=gndH2RgvgDb)0E0n2V0pgchl0n1bggdY0kfmgff#dHgIi?3)i|eL0;0rj91?9+jg0v3410bW0p0Ejd2gg#gq0naT0+gf0wea0?0ngsjVg:0Ng`g8izf.eai(i43Yh.f|i`1ff?h-hEhyfsctbnj=jshyh)bJj(f2i)f4aAj=j)k2az0^j=j2iYdgh*47he0ni 0i9M0v2ujJ2Rb(eajekojWh/0n2N2R102g9:kmd,iEhcfk1k0F1$9@k2f_f1e$iea*d@d_0Rk5i/f!f$0fh3i;hBdac|cZiCi8kKj-i:j/f~deiqiFc|k6j+3)cAkTkNh!kP040=k`0/fZf#0pf%h/iZf}kLk%j*kOc|kYk-c?4sirf.lelcbmk4k*h2l6k71kk9k2h{fahWephrllj,lpj.lAk^kQd`imhUagj^01kgkz0b0r0W1?j60#00g:kv0i1W2hi%lwfrlLkLlkk|5?k_lue0hVe;dVlalrlnk@hDl?l_4mk8ijj%e|iHhYh@k!dUk0k{f-hA04idl+d.lCk,k#cnmbj=l{mhcOdeiLcib=f}iPmm4)b|dH9M0fiTdYiVj3l1f+a6m0kFcYd*kClEl`j0iWkclfaZf,hzi51kibk)l|eSbr7Yiil.el0!0Ai7bu0Nmcivifi1m-h4f5k2c6h`e0cFmim/3Iiw1km$mYmMe_m*m,mam.f30b2ki}2I0Q1;0h2ugnl4j719dO0plRkB2R1?eag|l$ci1^dImLmdlBmA1zdLmQmu47cPm{h$lbnBd elnMm:fg04500Af8h9nam(a:d!dfmZd1m^n%j:m5m9mVnTn3bum lLa/inman=n1nTm*nWm-n`6+ncg70)gG1?hv9;hxnvkDlLacnyd+mkmOmDmgm6ma0wmTn{7qm%n*01lvmRmjnZnUn~n9o0nS0e0O7Mcdn$n5c,n)oHc5n,mU3DotnHhH1koAc(n!kZovorn@n7n#oT5{o2i}0znonq2rjf0UlVo5jYjp0Tj7gBo5g=c0o82qoalhj m1oenAnRk$ohnGokmiomnKoVouo$oOl/oWpfnOn|m+o#iJoDn#m@aAehn0h9onifn^m~l pii9nUoEnXpj47o(01o*2ho,kno/g:jVlPnllWo7g^2vmp6+hefMhffGdodq0yfLp!9EgJ2niNms9$l8b|gX2C0UhkdL0T0m1a9Ll7k-kLj|0f2V0Wg.n#g09!i^cyi|g{gajigdo^nn0r0$j82SgX0/0r2X0hb,9mjJ2rl!0n0rb(0j41jf0G0zgYe61sjVlU2rbWgikJ5S2njxa912gti$g;2S0U100S1znsjg0hq6g;0(lYkv1?jGjIdHpNgog.3l0!0!0ngm1olZjJ18p-i{g63`3k0Hq3q5g.0HjVj|0n2~1akj0vju5883qR3k0c0m2L2b0hbWb-19p}gf0/100WgVhlg#2Semq{i/0.0ng{iLke4v1kp@0f1}2=ojp5lmptlLh^qcdi000*0M0q0l0_0C0B0z0)0;0M0_0J0)0~00nQpu6:0brZ0B0M0~0s0l0Pr)0A0.0!r@pBk2r{1k000x0~0P0J0l0J0Cs7ou0IrKp1meq39maUl!j@a?j`lor70vq)rSfqsolBfY0f2WdYq7l@rVn{8hj~kE9ldihf0P2QnDjaq@j|1814knq+ge00dqqmkynyg$1cq^q`gm10sr0#jHmHhp04kHc3losFsHgVp l@ltoYh7h%sveAeCsLifc*ouk:lxm7expej=l*n-mnoXoKi*j?prtbf.sqewstaDh(lic|rOrQt2k-azrioQh10r0+0+gZq0tIi{rZr#r%r)r}r}0_0ZsktPn+bvl:f0tC1%rRd704tHp9nCtLtNoWpwr`rZ0s0V0X0Xr=0d0C0n0~q(g.tZt/f=mol$rLp.hqfRr_k=k1orazeBlHnZikoWhblLkg0s00160n0mqykt2~gt1?4irFj4jVut0jqzjfqpmOnm8hl%sDe9tsnbnd010!o nNezt4tp3E0S1k9Mtit!k.9{i!kMu(u6nIu8obuaftb}fnunl:u?tq0DuQkKu#04u%tOu/rMu-pqu9uOfPuctklquhe)kSulm}tnuofBsR0n0s0Gjlj11pg+0Qksgsb)9Mg$1y18tM1hjfs$q^jVdquJmB1?jOuMuNl(f`u orpIuUpruYuW4vv1v3t?u,tloNu7t$v9sPh+u^hTu`v,l;ljvSuZi,u$2*v4tmcXv(oFt%dVj|v^vY3ev!v|v$l8croWoGw6n(04vXrTlB0uvWk5w2f.t)0Wt+f}tGu,tKtMe6v}v)pHrZ0J0Z0s0Zr=0Zsjt,wiwAv6w4wdwotB3GrPt*tEu)wuwbcYt;wywak-sa0400r/sitVr/tYv8u=vawNqV0fsrqpqvw5wjcXsVnFi/wzf0tvssw{s8t5nLwPv=f0s s?wVwfj_whttoUemsnv-hDwqwstF1kt.v~l`w!e7out@5?w(w*r:r*r,r.r:r=u5xuoRv+rju|lMvnjzjW102b9nrF2~0n0kjAjhgc0mdIrd0TvqgAj70GvG0TdOql1?quq;qx0EvL18sJobvmb#x:qkrRq$jm1*kkkvs+rxg;jMns18lP1zuzjlwU0bxtsCxn4meOcls9rZqc9o09iuwMqQyswtxsu,dXh?w$u)kLxpxfxK2nlg4AiMkL0j2Jwlp:n0l8kL0G0TsBqayUk-0`yW0u2LofloqFp^1sr11fp/k-mtv5iR1kmx9,p@gZp`iWp|p~yZpvmGnwdV0Tw|uemey}e6y w^rvyJyxoLu+m_oMoopytnm n{m=n_pcpDw:uZyMeKw=w71k342~p4zit#xzzbzwcgzAe!04p@z9vQ04y-gZy/yFy^zNz8xax~8Zv1zDjJx2z73Gt,ylf00vjpq zK4J0Y9w0v2$34z`9g1W9i2)2+2%24262)0r1;z}0Y9h1mAa13151704.