<?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="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 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="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>
  <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>
</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 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>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>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>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est exclu de la séquence.</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>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(5) produit 5 valeurs, de 0<br/>
à 4.</p>]]></text>
    </feedback>
  </answer>
  <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>
</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>[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>
  <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>[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>
</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="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>
  <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>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="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>
</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="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 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 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>
  <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>
</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>20</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : x ne prend que les valeurs 1, 3, 9, 27 ;<br/>
rien ne l'arrête exactement sur la borne<br/>
20.</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>
  <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="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>
</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 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>
  <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>
</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="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="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>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>
  <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>
</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>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), (2,0), (2,1).</p>]]></text>
    </feedback>
  </answer>
  <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>
</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 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="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="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 : à chaque tour avec i inférieur<br/>
à 3, print(i) ; à 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</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>
  <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 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>
</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>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>
  <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, 3.</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 borné.</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>
</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, en supposant la saisie d'un entier strictement positif ?<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>Ce code calcule la suite de Syracuse : on divise n par 2 s'il est<br/>
pair, on le remplace par 3n + 1 sinon. La conjecture de Syracuse<br/>
affirme que cette suite atteint toujours 1, quel que soit l'entier de<br/>
départ ; elle n'est pas démontrée, si bien que personne ne sait prouver<br/>
que cette boucle s'arrête pour tout 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>Divise n par 2 jusqu'à obtenir 1, puis affiche le nombre de divisions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : quand n est impair, le code le remplace par 3 * n + 1 au lieu<br/>
de le diviser, et aucun compteur n'est calculé : ce sont les valeurs de<br/>
n qui s'affichent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche les valeurs successives de n, tant que n ne vaut pas 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tant que n ne vaut pas 1, la boucle calcule la valeur<br/>
suivante et l'affiche. Pour n = 6, on obtient 3, 10, 5, 16,<br/>
8, 4, 2, 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Boucle sans fin dès que l'entier saisi est impair</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un entier impair devient pair par 3 * n + 1, puis il est<br/>
divisé par 2. Pour n = 3, le programme affiche 10, 5, 16, 8,<br/>
4, 2, 1 puis s'arrête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche uniquement la valeur finale de n, une fois la boucle terminée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : print(n) est dans le corps de la boucle, donc exécuté à chaque<br/>
tour. Le programme affiche toutes les valeurs prises par n, pas<br/>
seulement la dernière.</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="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>négatif ou nul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est positif.</p>]]></text>
    </feedback>
  </answer>
  <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>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>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>
  <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>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>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q18 : Parcours de liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code affiche <strong>tous</strong> les éléments d'une<br/>
liste liste, un par ligne ?</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 : la boucle parcourt<br/>
directement les éléments, du premier au<br/>
dernier, sans manipuler d'indice.</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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in range(len(liste) - 1):<br/>
    print(liste[i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(len(liste) - 1) s'arrête un<br/>
indice trop tôt, donc le dernier élément<br/>
n'est jamais affiché. Il faudrait<br/>
range(len(liste)).</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 = [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>
  <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>
</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>2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 2 // 2 = 1, donc on continue.</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>
</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 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="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="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>
  <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>
</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="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 puis 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>
  <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/>
3 tours (i vaut 0, 1 puis 2) et n est<br/>
incrémenté 3 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>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q23 : Deux conditions pour un même while</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce programme ?<br/>
`<code>python<br/>
i = 0<br/>
total = 0<br/>
while i &lt; 10 and total &lt;= 12:<br/>
    i = i + 1<br/>
    if i % 2 == 0:<br/>
        total = total + i<br/>
print(i, total)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une boucle while dont la condition relie<br/>
deux tests par and s'arrête dès que l'un<br/>
d'eux devient faux. La condition n'est évaluée<br/>
qu'au début de chaque tour : pour une trace, on<br/>
la vérifie après chaque tour complet.</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>6 12</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : quand total vaut 12, la condition<br/>
total &lt;= 12 est encore vraie, donc la<br/>
boucle continue : i passe à 7 puis à 8, et<br/>
total à 20.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>8 20</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : total vaut 2, 6 puis 12<br/>
après les tours où i vaut 2, 4 et 6. Comme<br/>
12 &lt;= 12 est vrai, la boucle continue ; au<br/>
tour où i vaut 8, total passe à 20 et le<br/>
test suivant échoue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>10 30</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce résultat ignore la seconde<br/>
condition. Le and exige les deux : dès que<br/>
total dépasse 12, la boucle s'arrête, bien<br/>
avant que i atteigne 10.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>8 12</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition n'est testée qu'au<br/>
début de chaque tour, jamais au milieu. Le<br/>
tour où i vaut 8 s'exécute en entier et<br/>
total passe à 20 avant le test suivant.</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 (5 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="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>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>
  <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 10, qui ne sont pas multiples de 3, y entrent<br/>
et ajoutent 2 chacun.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 5 multiples de 3 (3, 6, 9, 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>
</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="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>
  <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="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>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>
</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/>
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>
  <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/>
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="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>
</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>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="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>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="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/>
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>
  <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>
</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 :<br/>
`<code>python<br/>
n = 30<br/>
r = 0<br/>
while r * r &lt;= n:<br/>
    r = r + 1<br/>
</code><br/>
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>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="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>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="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>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q30 : Combien de branches s'exécutent</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans une structure if ... elif ... elif ... else, combien de<br/>
branches sont exécutées lors d'un passage ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>elif enchaîne des cas exclusifs : un seul bloc s'exécute, ce qui<br/>
distingue cette structure d'une suite de if.</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>Au moins deux, le else s'exécutant toujours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le else n'est atteint que si toutes les conditions<br/>
sont fausses.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Exactement une, la première vraie ou le else</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les conditions sont testées dans l'ordre et la<br/>
première vraie l'emporte ; si aucune ne l'est, le else<br/>
s'exécute.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune, si plusieurs conditions sont vraies à la fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : plusieurs conditions vraies ne bloquent rien ; la<br/>
première l'emporte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toutes celles dont la condition est vraie, dans l'ordre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le comportement de plusieurs if<br/>
indépendants, pas d'une chaîne elif.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q31 : Trois issues pour un nombre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce programme ?<br/>
`<code>python<br/>
x = 5<br/>
if x &gt; 0:<br/>
    if x &lt; 10:<br/>
        print("A")<br/>
    else:<br/>
        print("B")<br/>
else:<br/>
    print("C")<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux if imbriqués découpent les cas en arbre ; lire<br/>
l'indentation dit quel else répond à quel if.</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, aucune branche ne convenant à 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tout nombre tombe dans une des trois branches.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>A</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le premier test sépare les positifs des autres,<br/>
le second, imbriqué, sépare les positifs inférieurs à 10 des<br/>
autres. Pour 5, c'est A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>B</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : suis les tests dans l'ordre, en respectant<br/>
l'indentation de chaque else.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chaque else est rattaché au if de même niveau.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q32 : Une double inégalité en Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Python accepte l'écriture 0 &lt; x &lt; 10. À quelle condition est-elle<br/>
équivalente ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les comparaisons chaînées traduisent directement les doubles<br/>
inégalités mathématiques, avec la sémantique du and.</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 &lt; 10 n'est pas une expression valide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'écriture est valide et très lisible pour un<br/>
intervalle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(0 &lt; x) &lt; 10</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette lecture comparerait un booléen à 10, ce qui est<br/>
toujours vrai ; Python ne lit pas ainsi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>0 &lt; x and x &lt; 10</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une comparaison chaînée vérifie chaque<br/>
inégalité, reliées par un and implicite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 &lt; x or x &lt; 10</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec or, tout nombre conviendrait.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q33 : Diviser par deux jusqu'à un</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien de tours effectue cette boucle ?<br/>
`<code>python<br/>
n = 20<br/>
while n &gt; 1:<br/>
    n = n // 2<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une boucle qui divise par deux fait environ \log_2 n tours : c'est<br/>
le schéma de la dichotomie.</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 : dès que n vaut 1, la condition n &gt; 1 est fausse<br/>
et aucun tour supplémentaire n'a lieu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : n prend les valeurs 20, 10, 5, 2, 1 ; chaque division<br/>
entière est un tour, et la boucle s'arrête dès que n vaut 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>20</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : n est divisé par deux à chaque tour, pas diminué de<br/>
un.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tour qui fait passer n à 1 compte aussi.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q34 : Deux boucles while imbriquées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce programme ?<br/>
`<code>python<br/>
i = 0<br/>
total = 0<br/>
while i &lt; 4:<br/>
    j = 0<br/>
    while j &lt; i:<br/>
        total = total + 1<br/>
        j = j + 1<br/>
    i = i + 1<br/>
print(total)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux boucles imbriquées se comptent en additionnant les tours de la<br/>
boucle intérieure pour chaque valeur de la boucle extérieure.</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>16</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle intérieure ne fait pas toujours 4 tours,<br/>
elle en fait i.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : total est incrémenté dans la boucle intérieure, bien<br/>
plus de 4 fois au total.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : dès que i vaut 1, la boucle intérieure tourne au<br/>
moins une fois.</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 intérieure fait i tours à chaque<br/>
passage, soit 0, puis 1, jusqu'à 4 - 1. Leur somme vaut<br/>
6.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q35 : Le premier multiple qui dépasse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce programme ?<br/>
`<code>python<br/>
k = 1<br/>
while k <em> 7 &lt; 50:<br/>
    k = k + 1<br/>
print(k </em> 7)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La valeur affichée est celle qui rend la condition fausse pour la<br/>
première fois : un while s'arrête juste après avoir dépassé le<br/>
seuil.</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 : 7 est la valeur initiale de k * 7, et la condition<br/>
est vraie au départ.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>49</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 49 est encore inférieur à 50, la boucle fait<br/>
un tour de plus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>50</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 50 n'est pas un multiple de 7, k * 7 ne peut pas<br/>
valoir 50.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>56</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : k augmente tant que k <em> 7 reste inférieur à<br/>
50 ; à la sortie, k </em> 7 est le premier multiple de 7 qui<br/>
atteint ou dépasse 50.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q36 : Un range qui descend par pas de trois</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce programme, les valeurs étant lues ligne par ligne ?<br/>
`<code>python<br/>
for i in range(10, 0, -3):<br/>
    print(i)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>range(debut, fin, pas) accepte un pas négatif : les valeurs<br/>
descendent de debut vers fin, exclue.</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>10 7 4 1 -2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne 0 est exclue, et aucune valeur négative n'est<br/>
produite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>10 7 4 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : i part de 10 et diminue de 3 à chaque<br/>
tour, tant qu'il reste strictement supérieur à 0, borne<br/>
exclue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>10 7 4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dernière valeur positive est encore produite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1 4 7 10</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un pas négatif parcourt les valeurs en descendant.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
