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:

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 :

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
.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.
# Tests(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)