<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Conditions et boucles</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Structures de contrôle Python : conditions<br/>
(if/elif/else), opérateurs booléens<br/>
(and/or/not), boucles bornées (for/range),<br/>
boucles non bornées (while), boucles imbriquées et<br/>
traces d'exécution.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q01 : Syntaxe du if</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la syntaxe correcte d'une condition<br/>
simple en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Python utilise l'<strong>indentation significative</strong>.<br/>
Tous les blocs (if, for, while, def...)<br/>
se reconnaissent à leur indentation, pas à des<br/>
accolades.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
if (x &gt; 0)<br/>
    print("positif");<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe à la C/Java. En Python, pas<br/>
de parenthèses obligatoires, deux-points<br/>
obligatoires, indentation à la place des<br/>
accolades.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
if x &gt; 0 then<br/>
    print("positif")<br/>
end<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : then et end n'existent pas en<br/>
Python (Lua, Ruby).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
if x &gt; 0:<br/>
    print("positif")<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : deux-points en fin de ligne,<br/>
indentation (4 espaces conventionnels) pour<br/>
le bloc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
if {x &gt; 0} print("positif")<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'accolades en Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q02 : elif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert le mot-clé elif en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général :<br/>
`<code>python<br/>
if cond1:<br/>
    ...<br/>
elif cond2:<br/>
    ...<br/>
else:<br/>
    ...<br/>
</code>`<br/>
Au plus <strong>un</strong> des blocs s'exécute (le premier<br/>
dont la condition est vraie).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est simplement un alias pour le mot-clé if</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elif ne s'utilise qu'<strong>après</strong> un<br/>
if.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est un alias pour else</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : else n'a pas de condition. elif<br/>
a une condition.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela teste si une variable existe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec l'existence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>C'est l'équivalent du else if en C/Java.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : elif permet d'enchaîner<br/>
plusieurs conditions sans imbrication<br/>
excessive. Mot-clé Python spécifique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q03 : Opérateurs logiques</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment écrit-on « x est positif <strong>et</strong> pair »<br/>
en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois opérateurs : and (et), or (ou<br/>
inclusif), not (négation). À noter :<br/>
évaluation paresseuse, False and ... ne<br/>
teste pas la suite.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>x &gt; 0 &amp;&amp; x % 2 == 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : &amp;&amp; n'existe pas en Python. C'est<br/>
la syntaxe C/Java.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>x &gt; 0 and x % 2 == 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python utilise les<br/>
mots-clés and, or, not.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>x &gt; 0 et x % 2 == 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python est en anglais.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>x &gt; 0, x % 2 == 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la virgule produit un tuple, pas<br/>
une conjonction logique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q04 : Boucle for range</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien d'itérations effectue<br/>
for i in range(5): ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention Python : la borne supérieure est<br/>
<strong>exclue</strong>. range(5) = [0, 1, 2, 3, 4].</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une infinité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(5) est borné.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(5) produit 5 valeurs (0, 1,<br/>
2, 3, 4).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : range(n) produit les<br/>
entiers de 0 à n-1, soit <strong>n valeurs</strong> au<br/>
total.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est exclu de la séquence.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q05 : range avec deux arguments</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que produit list(range(2, 7)) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois formes : range(n) (0 à n-1),<br/>
range(a, b) (a à b-1),<br/>
range(a, b, pas) (a à b-1 par pas).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[3, 4, 5, 6, 7]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 2 est <strong>inclus</strong>, 7 est exclu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[2, 3, 4, 5, 6, 7]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 7 est <strong>exclu</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[2, 3, 4, 5, 6]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : range(a, b) produit les<br/>
entiers de a (inclus) à b (exclu).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[2, 7]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait range(2, 7, 5) qui<br/>
donne [2] seulement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q06 : Boucle while</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait la boucle suivante ?<br/>
`<code>python<br/>
n = 10<br/>
while n &gt; 0:<br/>
    print(n)<br/>
    n -= 1<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>while est une boucle <strong>non bornée</strong> : on<br/>
teste une condition à chaque tour. Bien<br/>
vérifier que la condition finira par devenir<br/>
fausse pour éviter une boucle infinie.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche les nombres de 1 à 10 dans l'ordre croissant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle décrémente, donc affiche<br/>
en ordre <strong>décroissant</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tourne sans fin, car n reste toujours positif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : n -= 1 fait décroître n à chaque<br/>
tour ; après dix tours, n vaut 0 et la<br/>
condition devient fausse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'affiche rien, car la condition est fausse au départ</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : n vaut 10 au départ, donc n &gt; 0<br/>
est vrai et la boucle s'exécute au moins une<br/>
fois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche les nombres de 10 à 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque tour, on affiche<br/>
n, puis on le diminue de 1, d'où un<br/>
affichage décroissant. Quand n atteint 0,<br/>
on sort.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q07 : Indentation et corps de boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce code ?<br/>
`<code>python<br/>
for i in range(3):<br/>
    print("a")<br/>
print("b")<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'indentation délimite le corps de la boucle :<br/>
tout ce qui est décalé se répète, ce qui revient<br/>
au niveau de la ligne for ne s'exécute qu'une<br/>
fois, après le dernier tour.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>a a a b</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : seule la ligne indentée fait<br/>
partie du corps de la boucle, donc a est<br/>
affiché trois fois ; print("b") n'est<br/>
exécuté qu'une fois, après la boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a b a b a b</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : print("b") n'est pas indenté, il ne<br/>
fait pas partie du corps de la boucle et n'est<br/>
exécuté qu'une seule fois, après les trois<br/>
tours.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a b</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(3) fournit trois valeurs, le<br/>
corps de la boucle s'exécute donc trois fois<br/>
et a est affiché trois fois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a a a</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le programme ne s'arrête pas à la fin<br/>
de la boucle ; l'instruction print("b"), qui<br/>
la suit, est exécutée une fois.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q08 : Valeur finale d'un while</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut x à la fin de ce code ?<br/>
`<code>python<br/>
x = 1<br/>
while x &lt; 20:<br/>
    x = x * 3<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une boucle while peut dépasser la borne de sa<br/>
condition : le corps s'exécute une dernière fois<br/>
quand la condition est encore vraie, et c'est<br/>
cette valeur qui reste à la sortie.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour x = 9, la condition 9 &lt; 20<br/>
est encore vraie, donc un tour supplémentaire<br/>
a lieu et x passe à 27.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>20</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : x ne prend que les valeurs 1, 3, 9,<br/>
27 ; rien ne l'arrête exactement sur la borne<br/>
20.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>27</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trace : 1 → 3 → 9 → 27. Pour<br/>
x = 27, la condition 27 &lt; 20 est fausse,<br/>
la boucle s'arrête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>81</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tour de trop. Dès que x vaut 27,<br/>
la condition est fausse et le corps n'est plus<br/>
exécuté.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q09 : Test de parité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle expression vaut True si et seulement<br/>
si n est <strong>pair</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Idiome très courant. Variante :<br/>
bool(n % 2) est True ⇔ n est impair.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n // 2 == 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce test est vrai pour n = 0 ou<br/>
n = 1, pas pour la parité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>n % 2 == 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : % donne le reste. Reste<br/>
nul ⇔ pair.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n / 2 == 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce test est rarement vrai (n = 0<br/>
uniquement).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n == 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seulement vrai pour n = 2.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q10 : Boucle simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait ce code ?<br/>
`<code>python<br/>
total = 0<br/>
for i in range(1, 5):<br/>
    total += i<br/>
print(total)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma d'accumulation à connaître. En Python,<br/>
on peut aussi écrire sum(range(1, 5)).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche 10 (= 1+2+3+4)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : range(1, 5) produit<br/>
[1, 2, 3, 4]. La somme vaut 10. C'est<br/>
le schéma « accumulateur ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : for sur un range est toujours<br/>
fini.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche 4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on additionne plusieurs valeurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche 15 (= 1+2+3+4+5)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est <strong>exclu</strong> de range(1, 5).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q11 : Boucles imbriquées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien de fois print(...) est-il exécuté ?<br/>
`<code>python<br/>
for i in range(3):<br/>
    for j in range(2):<br/>
        print(i, j)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle : pour des boucles imbriquées, le total<br/>
est le produit des nombres d'itérations.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait additif (3 + 2), mais<br/>
c'est multiplicatif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la double boucle multiplie les<br/>
itérations.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait range(3) × range(3).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 3 × 2 = 6 itérations.<br/>
Couples : (0,0), (0,1), (1,0), (1,1),<br/>
(2,0), (2,1).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q12 : Évaluation paresseuse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi False and 1/0 == 0 ne lève-t-il pas<br/>
ZeroDivisionError en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Évaluation paresseuse : and s'arrête au<br/>
premier False ; or s'arrête au premier<br/>
True. Très utile pour court-circuiter des<br/>
tests coûteux ou risqués.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que == est prioritaire sur /, donc la division n'est jamais calculée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : / est prioritaire sur ==. Évaluée<br/>
seule, l'expression 1/0 == 0 lève bien<br/>
ZeroDivisionError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la division par zéro est tolérée par Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 1/0 lève bien ZeroDivisionError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les nombres entiers ne plantent jamais</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 1/0 plante en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que and est paresseux : si le premier est False, le second est ignoré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python optimise. Cela permet<br/>
des idiomes comme if liste and liste[0] &gt;<br/>
0: (test de non-vide avant d'accéder à<br/>
l'indice 0).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q13 : Trace d'un arrêt anticipé</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que produit ce code ?<br/>
`<code>python<br/>
i = 0<br/>
fini = False<br/>
while i &lt; 10 and not fini:<br/>
    if i == 3:<br/>
        fini = True<br/>
    else:<br/>
        print(i)<br/>
    i = i + 1<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tracer pas à pas : i = 0 → print(0) ; i = 1 →<br/>
print(1) ; i = 2 → print(2) ; i = 3 → fini<br/>
passe à True, puis le test not fini échoue.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 1 2 3 4 5 6 7 8 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : dès que fini passe à True, la<br/>
condition not fini devient fausse et la<br/>
boucle s'arrête, bien avant i = 10.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune sortie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au départ fini vaut False, donc<br/>
not fini vaut True et la boucle démarre ;<br/>
l'arrêt n'intervient qu'à i = 3.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>0 1 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on affiche 0, 1, 2 ; au tour<br/>
i = 3, la branche if met fini à True sans<br/>
afficher, puis la condition du while devient<br/>
fausse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 1 2 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au tour i = 3, c'est la branche if<br/>
qui s'exécute, pas le else : le 3 n'est pas<br/>
affiché.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q14 : Trace avec négation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que produit ce code ?<br/>
`<code>python<br/>
for i in range(5):<br/>
    if not (i % 2 == 0):<br/>
        print(i)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>not inverse un booléen : not (i % 2 == 0)<br/>
est vrai exactement quand i est impair.<br/>
Équivalent plus direct : if i % 2 != 0:.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : for sur un range est borné.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>1 3 (les impairs)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour i ∈ {0, 2, 4} (pairs),<br/>
i % 2 == 0 est vrai, donc sa négation est<br/>
fausse et le print est sauté. Restent 1 et 3.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 1 2 3 4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition filtre les valeurs ;<br/>
l'affichage n'a lieu que pour les impairs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 2 4 (les pairs)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse, le not renverse le<br/>
test de parité : on affiche ceux qui ne sont<br/>
<strong>pas</strong> pairs.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q15 : While et condition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait ce code, supposant la saisie d'un<br/>
entier non nul ?<br/>
`<code>python<br/>
n = int(input())<br/>
while n != 1:<br/>
    if n % 2 == 0:<br/>
        n = n // 2<br/>
    else:<br/>
        n = 3 * n + 1<br/>
    print(n)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La conjecture de Syracuse (1937) demeure ouverte<br/>
en mathématiques : on ne sait pas prouver que la<br/>
suite atteint toujours 1 pour tout n entier<br/>
positif.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Boucle infinie systématique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour tout n testé jusqu'à présent,<br/>
la suite atteint 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche la suite de Fibonacci</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune relation avec Fibonacci.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Calcule la suite de Syracuse jusqu'à atteindre 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'algorithme classique<br/>
dont la terminaison est une <strong>conjecture</strong><br/>
(non démontrée, mais vérifiée pour de très<br/>
grandes valeurs).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Lève systématiquement une exception à l'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : code valide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q16 : Bug d'imbrication</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
x = 5<br/>
if x &gt; 0:<br/>
    if x &gt; 10:<br/>
        print("grand")<br/>
    else:<br/>
        print("moyen")<br/>
else:<br/>
    print("négatif ou nul")<br/>
</code>`<br/>
Qu'affiche le code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Important : l'else est toujours apparié au<br/>
if du même niveau d'indentation. Lecture<br/>
attentive nécessaire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un cas est forcément exécuté.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>négatif ou nul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est positif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>moyen</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : x = 5 entre dans le premier<br/>
if (5 &gt; 0) ; puis comme 5 ≤ 10, on<br/>
exécute le else interne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>grand</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 n'est pas &gt; 10.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q17 : Chaînage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'expression 0 &lt; x &lt; 100 en Python est<br/>
équivalente à :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas pratique : if 0 &lt;= i &lt; len(liste): pour<br/>
vérifier qu'un indice est valide. Bien plus<br/>
lisible que if i &gt;= 0 and i &lt; len(liste):.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 &lt; x or x &lt; 100</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est and (et), pas or (ou).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>0 &lt; x and x &lt; 100</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python autorise le<br/>
chaînage. Idiomatique pour les bornes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur de syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(0 &lt; x) &lt; 100</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait du C ou du JavaScript, pas<br/>
du Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q18 : Parcours de liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la façon la plus pythonique d'afficher<br/>
les éléments d'une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : for x in liste: quand on<br/>
n'a pas besoin de l'indice. Si l'indice est<br/>
utile aussi, on parcourt les indices avec<br/>
for i in range(len(liste)): et on lit<br/>
l'élément par liste[i].</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
while i in liste:<br/>
    print(i)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : i in liste est un test, pas une<br/>
itération. Et i n'est pas défini.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for x in liste:<br/>
    print(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : forme idiomatique Python.<br/>
Plus lisible et moins sujette aux erreurs<br/>
d'indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(len(liste)):<br/>
    print(liste[i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Code correct mais peu pythonique. Préférer<br/>
la boucle directe sur les éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
do print(x) for x in liste<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe invalide en Python (peut-<br/>
être Ruby ou Perl).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q19 : Compréhension de liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est l'équivalent <strong>pythonique</strong> de :<br/>
`<code>python<br/>
carres = []<br/>
for i in range(10):<br/>
    carres.append(i * i)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Compréhension de liste générale :<br/>
[expr for x in iterable if cond]. Très<br/>
utilisée en Python pour les transformations<br/>
simples.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>carres = [i * i for i in range(10)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : compréhension de liste,<br/>
plus concise et idiomatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>carres = [10][i * i]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe invalide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>carres = [i * 2 for i in range(10)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : i * 2 calcule le <strong>double</strong>, pas le<br/>
carré : on obtient [0, 2, 4, ..., 18] au<br/>
lieu de [0, 1, 4, ..., 81].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>carres = range(10) ** 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne peut pas élever un range au<br/>
carré.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q20 : Trace de while</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut n à la fin de :<br/>
`<code>python<br/>
n = 100<br/>
while n &gt; 1:<br/>
    n = n // 2<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette boucle calcule combien de fois on peut<br/>
diviser n par 2. C'est le <strong>logarithme entier</strong><br/>
en base 2 (motif de complexité O(log n)).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une infinité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : n // 2 réduit n à chaque tour.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trace : 100 → 50 → 25 → 12<br/>
→ 6 → 3 → 1. À ce moment, 1 &gt; 1 est faux,<br/>
on sort.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle s'arrête quand n ≤ 1, donc<br/>
n vaut au moins 1 à la fin.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 2 // 2 = 1, donc on continue.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q21 : Boucle infinie</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi cette boucle est-elle infinie ?<br/>
`<code>python<br/>
i = 0<br/>
while i &lt; 10:<br/>
    print(i)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bug ultra-classique chez les débutants. Toujours<br/>
vérifier qu'un <strong>variant</strong> (ici, i) progresse<br/>
vers la condition de sortie.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que print ne renvoie rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le fait que print ne<br/>
renvoie pas de valeur<br/>
(autre que None) n'a<br/>
aucun lien avec la<br/>
terminaison de la boucle.<br/>
Ce qui pose problème ici,<br/>
c'est que i n'évolue<br/>
jamais.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que while est toujours infini</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : while peut très bien terminer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que l'initialisation i = 0 serait fausse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 0 &lt; 10 est vrai.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que i n'est jamais modifié dans la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il faut ajouter i += 1<br/>
pour que la condition i &lt; 10 finisse par<br/>
devenir fausse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q22 : Borne d'un range modifiée en cours de boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce code ?<br/>
`<code>python<br/>
n = 3<br/>
for i in range(n):<br/>
    n = n + 1<br/>
print(i, n)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>range(n) est construit une seule fois, à l'entrée<br/>
dans la boucle. Le nombre de tours est figé à ce<br/>
moment-là : modifier n ensuite n'allonge pas la<br/>
boucle, à la différence d'une liste que l'on<br/>
modifie pendant son parcours.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>2 6, car range(3) est calculé une fois pour toutes au début de la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : range(n) est évalué une seule<br/>
fois, avec n valant 3 ; la boucle fait donc<br/>
trois tours (i vaut 0, 1 puis 2) et n est<br/>
incrémenté trois fois, de 3 à 6.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle ne s'arrête jamais, car n augmente d'une unité à chaque tour</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne n'est pas relue à chaque tour.<br/>
Modifier n dans le corps ne change pas la<br/>
suite range(3) déjà construite, contrairement<br/>
à une liste que l'on allonge en la parcourant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3 6, car i termine à la valeur de la borne de départ, c'est-à-dire 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(3) produit 0, 1 et 2, jamais 3.<br/>
La dernière valeur prise par i est 2, car la<br/>
borne d'un range est exclue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur à l'exécution, car n ne peut pas être modifiée pendant le parcours de range(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune règle n'interdit d'affecter n<br/>
dans le corps de la boucle ; le code s'exécute<br/>
sans erreur. Une fois la boucle lancée, n et<br/>
la suite range(3) sont indépendants.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q23 : Modifier en parcourant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que se passe-t-il à l'exécution de ce code ?<br/>
`<code>python<br/>
liste = [1, 2, 3]<br/>
for x in liste:<br/>
    liste.append(x * 2)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle de sécurité : ne <strong>jamais</strong> modifier une<br/>
collection pendant qu'on la parcourt. Parcourir<br/>
une copie (liste[:]) ou construire une nouvelle<br/>
liste.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La boucle ne s'arrête jamais, car la liste s'allonge à chaque tour</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle for lit la liste<br/>
telle qu'elle est au moment de chaque tour ;<br/>
comme chaque tour ajoute un élément, la fin<br/>
n'est jamais atteinte. Ne jamais modifier une<br/>
liste pendant qu'on la parcourt.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle fait trois tours et la liste finale vaut [1, 2, 3, 2, 4, 6]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le for ne fige pas la liste au<br/>
départ ; il consulte sa longueur courante à<br/>
chaque tour et trouve toujours un élément de<br/>
plus. Ce résultat exigerait de parcourir une<br/>
copie, for x in liste[:]:.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Python lève une erreur, car une liste ne peut pas être modifiée pendant son parcours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python n'interdit rien ici, aucune<br/>
exception n'est levée ; c'est justement ce<br/>
silence qui rend le piège dangereux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle fait trois tours, car append ne modifie pas liste mais en renvoie une copie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append modifie la liste <strong>sur<br/>
place</strong> (et renvoie None) : c'est bien la<br/>
liste parcourue qui grandit.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q24 : Compteur avec if et elif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce code ?<br/>
`<code>python<br/>
c = 0<br/>
for n in range(1, 16):<br/>
    if n % 3 == 0:<br/>
        c = c + 1<br/>
    elif n % 5 == 0:<br/>
        c = c + 2<br/>
print(c)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans un if/elif, une seule branche s'exécute<br/>
par tour. Il faut donc trier chaque valeur de<br/>
range(1, 16) : multiples de 3 (cinq valeurs),<br/>
puis multiples de 5 restants (5 et 10).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : cinq multiples de 3 (3, 6, 9,<br/>
12, 15) ajoutent 1 chacun ; 5 et 10 ajoutent 2<br/>
chacun ; 15, déjà pris par le if, n'entre<br/>
pas dans le elif. Total 5 + 4 = 9.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>11</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 15 est compté deux fois, comme avec<br/>
deux if indépendants. Avec elif, la<br/>
seconde condition n'est pas testée quand la<br/>
première est vraie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la branche elif est ignorée ; 5 et<br/>
10, qui ne sont pas multiples de 3, y entrent<br/>
et ajoutent 2 chacun.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>7</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la branche elif ajoute 2, pas 1 ;<br/>
5 et 10 apportent donc 4 au total, et non 2.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes, laquelle est<br/>
<strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le while teste d'abord, exécute ensuite : une<br/>
boucle while peut ne faire aucun tour, alors<br/>
qu'une boucle for sur un range fini termine<br/>
toujours.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La condition d'un while n'est vérifiée qu'après chaque exécution du corps</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : la condition est<br/>
testée <strong>avant</strong> chaque tour, y compris le<br/>
premier. Si elle est fausse d'emblée, le corps<br/>
ne s'exécute jamais.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle for sur un range fini termine toujours sans intervention</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : terminaison automatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les opérateurs logiques and, or, not permettent de combiner des conditions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : ce sont les trois opérateurs<br/>
booléens.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle while peut être infinie si la condition ne devient jamais fausse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : risque classique de bug.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q26 : Boucle de saisie validée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut que l'utilisateur saisisse un entier<br/>
strictement positif et redemander tant que la<br/>
réponse n'est pas correcte. Quel code convient le<br/>
mieux ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma de validation de saisie : initialiser la<br/>
variable avec une valeur qui ne convient pas, pour<br/>
forcer un premier tour, puis répéter tant que la<br/>
valeur ne convient pas. La condition du while<br/>
dit exactement « tant que la saisie est mauvaise ».</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(10):<br/>
    n = int(input("n ? "))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code demande <strong>dix fois</strong> la valeur,<br/>
quelle que soit la qualité des saisies, et<br/>
conserve la dernière. Il ne s'arrête pas dès<br/>
qu'une bonne valeur est donnée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
n = 0<br/>
while n &lt;= 0:<br/>
    n = int(input("n ? "))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : n est initialisé à une valeur<br/>
invalide (0 n'est pas strictement positif), ce<br/>
qui garantit un premier passage ; la boucle<br/>
redemande ensuite tant que la saisie reste<br/>
négative ou nulle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
n = -1<br/>
while n &gt; 0:<br/>
    n = int(input("n ? "))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition initiale n &gt; 0 est<br/>
fausse (puisque n = -1), donc la boucle ne<br/>
s'exécute <strong>jamais</strong>. Aucune saisie n'est<br/>
réellement effectuée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
n = int(input("n ? "))<br/>
if n &lt;= 0:<br/>
    n = int(input("n ? "))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code ne redemande qu'<strong>une seule fois</strong> la valeur. Si l'utilisateur entre encore<br/>
une valeur invalide à la deuxième saisie, le<br/>
programme continue avec cette valeur erronée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q27 : if/elif vs plusieurs if</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Considérons les deux extraits suivants. En quoi<br/>
diffèrent-ils ?</p>
<p>``python<br/>
# Extrait A<br/>
if x &gt; 0:<br/>
    y = 1<br/>
elif x &gt; 10:<br/>
    y = 2</p>
<p># Extrait B<br/>
if x &gt; 0:<br/>
    y = 1<br/>
if x &gt; 10:<br/>
    y = 2<br/>
``</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle pratique : utiliser elif lorsque les<br/>
branches s'excluent mutuellement (un seul cas est<br/>
vrai à la fois). Utiliser des if séparés<br/>
lorsqu'on veut <strong>vraiment</strong> que plusieurs<br/>
conditions puissent déclencher chacune leur action.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ils produisent toujours le même résultat, quelle que soit la valeur de x</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils diffèrent justement quand x est<br/>
strictement supérieur à 10. L'extrait A donne<br/>
y = 1 (la branche elif n'est pas testée<br/>
parce que la première est vraie), l'extrait B<br/>
donne y = 2 (les deux conditions s'évaluent).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>A n'exécute qu'une seule branche ; B peut exécuter les deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : elif indique que l'on<br/>
n'évalue cette branche que si la précédente<br/>
était fausse. Avec deux if séparés, les deux<br/>
conditions sont toujours vérifiées<br/>
indépendamment, ce qui peut conduire à des<br/>
réaffectations indésirables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'extrait A produit une erreur car elif ne fonctionne pas seul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elif est un mot-clé valide en Python<br/>
tant qu'il suit un if. Sa présence ne<br/>
provoque aucune erreur de syntaxe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'extrait B est plus rapide, car il évite le mot-clé elif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence ne porte pas sur la<br/>
vitesse mais sur la <strong>logique</strong>. L'extrait A<br/>
peut au contraire être plus rapide, car il<br/>
n'évalue pas la deuxième condition lorsque la<br/>
première est vraie.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q28 : Parcours parallèle de deux listes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Deux listes noms et notes de même longueur<br/>
rangent au même rang le nom d'un élève et sa note.<br/>
Quel code affiche chaque nom suivi de sa note ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le parcours par indice for i in range(len(...))<br/>
est le moyen d'accéder au même rang dans deux<br/>
listes. L'hypothèse « de même longueur » garantit<br/>
que notes[i] existe pour tout indice valide de<br/>
noms.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
print(noms + notes)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la concaténation noms + notes produit<br/>
une seule liste juxtaposant les deux. Il n'y a<br/>
pas d'appariement, et tout est affiché en bloc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(len(noms)):<br/>
    print(noms[i], notes[i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'indice i parcourt les<br/>
positions de 0 à len(noms) - 1 et sert à lire<br/>
au même rang le nom et la note qui lui<br/>
correspond.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for nom in noms:<br/>
    for note in notes:<br/>
        print(nom, note)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces boucles imbriquées affichent<br/>
<strong>toutes les paires</strong> (nom, note), pas<br/>
uniquement celles de même rang. Pour deux<br/>
listes de longueur n, on obtient n²<br/>
lignes au lieu de n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for nom in noms:<br/>
    print(nom, notes[nom])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : nom est une chaîne, pas un indice.<br/>
notes[nom] lève TypeError, car une liste ne<br/>
s'indexe qu'avec un entier. Pour retrouver le<br/>
rang, il faut parcourir les indices.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q29 : Calcul d'une racine entière</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On exécute le code suivant :</p>
<p>`<code>python<br/>
n = 30<br/>
r = 0<br/>
while r * r &lt;= n:<br/>
    r = r + 1<br/>
</code></p>
<p>Quelle est la valeur de r` à la sortie de la boucle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cet algorithme calcule le plus petit entier r<br/>
tel que r² &gt; n. À la sortie, r - 1 est la<br/>
partie entière de √n. Pour n = 30, on<br/>
obtient r = 6, et r - 1 = 5, conforme à<br/>
\lfloor\sqrt{30}\rfloor = 5.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>7</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle s'arrête dès que la condition<br/>
devient fausse, sans incrémenter une fois de<br/>
plus. Pour r = 6, on a déjà 36 &gt; 30 : la<br/>
boucle est sortie avec r = 6.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle s'arrête dès que<br/>
r × r &gt; n. Pour r = 5, 25 ≤ 30 :<br/>
on incrémente. Pour r = 6, 36 &gt; 30 : on<br/>
sort. La valeur finale est donc r = 6.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>30</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion entre la valeur cible n et<br/>
la variable r. La boucle calcule la <strong>racine carrée entière</strong> par majorant, pas la valeur de<br/>
n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour r = 5, on a r × r = 25 ≤ 30, donc la condition est encore vraie.<br/>
La boucle fait au moins une itération de plus.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
