<?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/>
(<code>if</code>/<code>elif</code>/<code>else</code>), opérateurs booléens<br/>
(<code>and</code>/<code>or</code>/<code>not</code>), boucles bornées (<code>for</code>/<code>range</code>),<br/>
boucles non bornées (<code>while</code>), instructions <code>break</code> et<br/>
<code>continue</code>.</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 (<code>if</code>, <code>for</code>, <code>while</code>, <code>def</code>...)<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[<pre><code>if (x &gt; 0)
    print("positif");</code></pre>]]></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[<pre><code>if x &gt; 0 then
    print("positif")
end</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>then</code> et <code>end</code> n'existent pas en<br/>
Python (Lua, Ruby).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>if x &gt; 0:
    print("positif")</code></pre>]]></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[<pre><code>if {x &gt; 0} print("positif")</code></pre>]]></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é <code>elif</code> en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général :<br/>
<pre><code>if cond1:
    ...
elif cond2:
    ...
else:
    ...</code></pre><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 <code>if</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>elif</code> ne s'utilise qu'<strong>après</strong> un<br/>
<code>if</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est un alias pour <code>else</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>else</code> n'a pas de condition. <code>elif</code><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 <code>else if</code> (ou <code>else { if ... }</code>) en C/Java.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>elif</code> 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 : <code>and</code> (et), <code>or</code> (ou<br/>
inclusif), <code>not</code> (négation). À noter :<br/>
évaluation paresseuse, <code>False and ...</code> 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><code>x &gt; 0 &amp;&amp; x % 2 == 0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>&amp;&amp;</code> n'existe pas en Python. C'est<br/>
la syntaxe C/Java.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>x &gt; 0 and x % 2 == 0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python utilise les<br/>
mots-clés <code>and</code>, <code>or</code>, <code>not</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>x &gt; 0 et x % 2 == 0</code></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><code>x &gt; 0, x % 2 == 0</code></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/>
<code>for i in range(5):</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention Python : la borne supérieure est<br/>
<strong>exclue</strong>. <code>range(5)</code> = [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 : <code>range(5)</code> est borné.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>range(5)</code> 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 : <code>range(n)</code> 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 <code>list(range(2, 7))</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois formes : <code>range(n)</code> (0 à n-1),<br/>
<code>range(a, b)</code> (a à b-1),<br/>
<code>range(a, b, pas)</code> (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><code>[3, 4, 5, 6, 7]</code></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><code>[2, 3, 4, 5, 6, 7]</code></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><code>[2, 3, 4, 5, 6]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>range(a, b)</code> produit les<br/>
entiers de <code>a</code> (inclus) à <code>b</code> (exclu).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[2, 7]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait <code>range(2, 7, 5)</code> qui<br/>
donne <code>[2]</code> 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/>
<pre><code>n = 10
while n &gt; 0:
    print(n)
    n -= 1</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>while</code> 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</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>Boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>n -= 1</code> garantit la terminaison.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'affiche rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>n = 10 &gt; 0</code>, la boucle s'exécute<br/>
au moins une fois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche les nombres de 10 à 1 (en décroissant)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque tour, on affiche<br/>
<code>n</code>, puis on le diminue de 1. Quand n<br/>
atteint 0, on sort.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q07 : break</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait l'instruction <code>break</code> dans une boucle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Utile pour sortir d'une recherche dès qu'on a<br/>
trouvé : <code>for x in liste: if x == cible: break</code>.</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>Sort immédiatement de la boucle (la plus interne)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>break</code> quitte la boucle.<br/>
L'exécution continue <strong>après</strong> la boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Met la boucle en pause</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>break</code> ne met pas en pause, elle<br/>
<strong>interrompt</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Recommence la boucle au début</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>continue</code> qui passe au tour<br/>
suivant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Termine le programme entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait <code>exit()</code> ou <code>sys.exit()</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q08 : continue</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait l'instruction <code>continue</code> dans une<br/>
boucle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Exemple : <code>for x in liste: if x &lt; 0: continue ;<br/>
print(x)</code> affiche tous les éléments<br/>
<strong>positifs</strong> sans plonger dans une condition<br/>
imbriquée.</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>Met la boucle en pause</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de pause.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Continue indéfiniment</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>continue</code> ne crée pas de boucle<br/>
infinie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Saute le reste de l'itération courante et passe à la suivante</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on ignore les instructions<br/>
restantes du tour, on passe directement à<br/>
l'itération suivante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sort de la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>break</code>.</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 <code>True</code> si et seulement<br/>
si <code>n</code> est <strong>pair</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Idiome très courant. Variante :<br/>
<code>bool(n % 2)</code> est <code>True</code> ⇔ <code>n</code> 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><code>n // 2 == 0</code></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><code>n % 2 == 0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>%</code> donne le reste. Reste<br/>
nul ⇔ pair.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>n / 2 == 0</code></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><code>n == 2</code></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/>
<pre><code>total = 0
for i in range(1, 5):
    total += i
print(total)</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma d'accumulation à connaître. En Python,<br/>
on peut aussi écrire <code>sum(range(1, 5))</code>.</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 <code>10</code> (= 1+2+3+4)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>range(1, 5)</code> produit<br/>
<code>[1, 2, 3, 4]</code>. 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 : <code>for</code> sur un range est toujours<br/>
fini.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche <code>4</code></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 <code>15</code> (= 1+2+3+4+5)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est <strong>exclu</strong> de <code>range(1, 5)</code>.</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 <code>print(...)</code> est-il exécuté ?<br/>
<pre><code>for i in range(3):
    for j in range(2):
        print(i, j)</code></pre></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 <code>range(3) × range(3)</code>.</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 <code>False and 1/0 == 0</code> ne lève-t-il pas<br/>
<code>ZeroDivisionError</code> en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Évaluation paresseuse : <code>and</code> s'arrête au<br/>
premier <code>False</code> ; <code>or</code> s'arrête au premier<br/>
<code>True</code>. 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 qu'il faut un <code>try/except</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas nécessaire ici.</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 : <code>1/0</code> lève bien <code>ZeroDivisionError</code>.</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 : <code>1/0</code> plante en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que <code>and</code> est paresseux : si le premier opérande est <code>False</code>, le second n'est pas évalué</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python optimise. Cela permet<br/>
des idiomes comme <code>if liste and liste[0] &gt;<br/>
0:</code> (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 avec break</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que produit ce code ?<br/>
<pre><code>for i in range(10):
    if i == 3:
        break
    print(i)</code></pre></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 → break.</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 : <code>break</code> interrompt la boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune sortie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le <code>break</code> 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<br/>
tour i = 3, le <code>break</code> interrompt la boucle<br/>
avant l'affichage.</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 : <code>break</code> se déclenche <strong>avant</strong><br/>
<code>print</code>. Le 3 n'est pas affiché.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q14 : Trace avec continue</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que produit ce code ?<br/>
<pre><code>for i in range(5):
    if i % 2 == 0:
        continue
    print(i)</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>continue</code> est utile pour filtrer dans une<br/>
boucle. Alternative : <code>if i % 2 != 0:<br/>
print(i)</code>.</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 : <code>for</code> 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/>
le <code>continue</code> saute le <code>print</code>. Restent<br/>
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 : <code>continue</code> saute l'affichage pour<br/>
les pairs.</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, on saute les<br/>
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/>
<pre><code>n = int(input())
while n != 1:
    if n % 2 == 0:
        n = n // 2
    else:
        n = 3 * n + 1
    print(n)</code></pre></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 (ou Collatz) 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 une exception</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><pre><code>x = 5
if x &gt; 0:
    if x &gt; 10:
        print("grand")
    else:
        print("moyen")
else:
    print("négatif ou nul")</code></pre><br/>
Qu'affiche le code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Important : l'<code>else</code> est toujours apparié au<br/>
<code>if</code> 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><code>négatif ou nul</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est positif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>moyen</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : x = 5 entre dans le premier<br/>
<code>if</code> (5 &gt; 0) ; puis comme 5 ≤ 10, on<br/>
exécute le <code>else</code> interne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>grand</code></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 <code>0 &lt; x &lt; 100</code> en Python est<br/>
équivalente à :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas pratique : <code>if 0 &lt;= i &lt; len(liste):</code> pour<br/>
vérifier qu'un indice est valide. Bien plus<br/>
lisible que <code>if i &gt;= 0 and i &lt; len(liste):</code>.</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>0 &lt; x or x &lt; 100</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>and</code> (et), pas <code>or</code> (ou).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>0 &lt; x and x &lt; 100</code></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><code>(0 &lt; x) &lt; 100</code></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 boucle permet d'afficher les éléments<br/>
d'une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : <code>for x in liste:</code> quand on<br/>
n'a pas besoin de l'indice. Si l'indice est<br/>
utile aussi : <code>for i, x in enumerate(liste):</code>.</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[<pre><code>while i in liste:
    print(i)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>i in liste</code> est un test, pas une<br/>
itération. Et <code>i</code> n'est pas défini.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>for x in liste:
    print(x)</code></pre>]]></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[<pre><code>for i in range(len(liste)):
    print(liste[i])</code></pre>]]></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[<pre><code>do print(x) for x in liste</code></pre>]]></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>Quelle est l'équivalent <strong>pythonique</strong> de :<br/>
<pre><code>carres = []
for i in range(10):
    carres.append(i * i)</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Compréhension de liste générale :<br/>
<code>[expr for x in iterable if cond]</code>. 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><code>carres = [i * i for i in range(10)]</code></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><code>carres = [10][i * i]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe invalide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>carres = map(2, range(10))</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>map</code> prend une <strong>fonction</strong> en<br/>
premier argument, pas un nombre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>carres = range(10)  2</code></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 <code>n</code> à la fin de :<br/>
<pre><code>n = 100
while n &gt; 1:
    n = n // 2</code></pre></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 : <code>n // 2</code> 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, <code>1 &gt; 1</code> 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/>
<pre><code>i = 0
while i &lt; 10:
    print(i)</code></pre></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, <code>i</code>) 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 <code>print</code> ne renvoie rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le fait que <code>print</code> ne<br/>
renvoie pas de valeur<br/>
(autre que <code>None</code>) n'a<br/>
aucun lien avec la<br/>
terminaison de la boucle.<br/>
Ce qui pose problème ici,<br/>
c'est que <code>i</code> n'évolue<br/>
jamais.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>while</code> est toujours infini</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>while</code> peut très bien terminer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>i = 0</code> est faux</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 <code>i</code> n'est jamais modifié à l'intérieur de la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il faut ajouter <code>i += 1</code><br/>
pour que la condition <code>i &lt; 10</code> finisse par<br/>
devenir fausse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q22 : enumerate</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert <code>enumerate</code> en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>enumerate(iterable, start=0)</code> produit des<br/>
paires <code>(index, valeur)</code>. Avec <code>start=1</code> pour<br/>
commencer à 1.</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>À compter les éléments d'une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>len</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>À itérer en récupérant à la fois l'indice et la valeur de chaque élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : usage typique<br/>
<code>for i, x in enumerate(liste):</code>. Plus<br/>
lisible que <code>for i in range(len(liste)):</code><br/>
+ <code>liste[i]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À renvoyer une chaîne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>enumerate</code> renvoie un itérateur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À trier la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>sorted</code> ou <code>liste.sort()</code>.</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>Pourquoi ce code est-il <strong>buggué</strong> ?<br/>
<pre><code>liste = [1, 2, 3, 4, 5]
for x in liste:
    if x &gt; 2:
        liste.remove(x)</code></pre></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. Itérer<br/>
sur une copie ou construire une nouvelle<br/>
collection.</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 <code>5 &gt; 2</code> est faux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est bien &gt; 2.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que modifier la liste pendant qu'on l'itère provoque des éléments sautés ou des comportements imprévisibles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python ne garantit pas le<br/>
comportement quand la liste est modifiée<br/>
pendant son parcours. Solution :<br/>
construire une nouvelle liste filtrée<br/>
(<code>[x for x in liste if x &lt;= 2]</code>).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>remove</code> n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>remove</code> existe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la boucle ne s'exécute jamais</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle s'exécute, mais avec des bugs.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q24 : for / else</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Python autorise une clause <code>else</code> après un<br/>
<code>for</code>. Quand est-elle exécutée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma : recherche avec « else = pas<br/>
trouvé ».<br/>
<pre><code>for x in liste:
    if x == cible:
        print("trouvé")
        break
else:
    print("absent")</code></pre></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>Si la boucle se termine normalement (sans <code>break</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trait peu connu mais<br/>
puissant. Si la boucle se termine par<br/>
<code>break</code>, l'<code>else</code> est sauté ; sinon, il est<br/>
exécuté. Utile pour les recherches.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours, comme un finally</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il y a une condition.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Si la boucle est interrompue par <code>break</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Jamais en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe existe.</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>Mnémonique : « <code>break</code> ⇒ on casse (sort),<br/>
<code>continue</code> ⇒ on continue (au tour suivant) ».</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>break</code> et <code>continue</code> ont le même effet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : <code>break</code><br/>
<strong>sort</strong> de la boucle ; <code>continue</code> passe à<br/>
l'itération <strong>suivante</strong>. Effets très<br/>
différents.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle <code>for</code> sur un <code>range</code> 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 <code>and</code>, <code>or</code>, <code>not</code> 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 <code>while</code> 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>Le schéma <code>while True</code> + <code>break</code> est très utilisé<br/>
pour les boucles dont la condition de sortie ne<br/>
s'évalue qu'au milieu du corps. Il est plus clair<br/>
qu'une variable booléenne intermédiaire dans<br/>
beaucoup de cas.</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[<pre><code>for i in range(10):
    n = int(input("n ? "))</code></pre>]]></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[<pre><code>while True:
    n = int(input("n ? "))
    if n &gt; 0:
        break</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle <code>while True</code> répète la<br/>
saisie indéfiniment ; on en sort dès que la<br/>
condition <code>n &gt; 0</code> est satisfaite, grâce au<br/>
<code>break</code>. C'est l'idiome standard pour la<br/>
validation d'entrée utilisateur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>n = -1
while n &gt; 0:
    n = int(input("n ? "))</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition initiale <code>n &gt; 0</code> est<br/>
fausse (puisque <code>n = -1</code>), 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[<pre><code>n = int(input("n ? "))
if n &lt;= 0:
    n = int(input("n ? "))</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code ne redemande qu'<strong>une seule<br/>
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>
<pre><code># Extrait A
if x &gt; 0:
    y = 1
elif x &gt; 10:
    y = 2

# Extrait B
if x &gt; 0:
    y = 1
if x &gt; 10:
    y = 2</code></pre>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle pratique : utiliser <code>elif</code> lorsque les<br/>
branches s'excluent mutuellement (un seul cas est<br/>
vrai à la fois). Utiliser des <code>if</code> 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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils diffèrent justement quand <code>x</code> est<br/>
strictement supérieur à $10$. L'extrait A donne<br/>
$y = 1$ (la branche <code>elif</code> 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>L'extrait A teste les conditions de manière exclusive ; l'extrait B les évalue indépendamment, ce qui peut écraser la valeur de y</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>elif</code> indique que l'on<br/>
n'évalue cette branche que si la précédente<br/>
était fausse. Avec deux <code>if</code> 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 <code>elif</code> ne fonctionne pas seul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>elif</code> est un mot-clé valide en Python<br/>
tant qu'il suit un <code>if</code>. 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 que l'extrait A</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>Quelle est la façon la plus pythonique de parcourir<br/>
en parallèle deux listes <code>noms</code> et <code>notes</code> de même<br/>
longueur, pour afficher chaque nom suivi de sa<br/>
note ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes utiles : <code>enumerate</code> quand on veut<br/>
l'indice <strong>et</strong> l'élément ; <code>zip(*matrice)</code> pour<br/>
transposer une matrice ; <code>zip(a, b, c)</code> pour<br/>
parcourir trois séquences en parallèle.</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[<pre><code>print(noms + notes)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la concaténation <code>noms + notes</code> 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="0" format="html">
    <text><![CDATA[<pre><code>for i in range(len(noms)):
    print(noms[i], notes[i])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Code correct mais peu pythonique. Il manipule<br/>
des indices alors que l'on n'en a pas besoin.<br/>
Préférer <code>zip</code>, qui exprime directement le<br/>
parcours parallèle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for nom in noms:
    for note in notes:
        print(nom, note)</code></pre>]]></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^2$<br/>
lignes au lieu de $n$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>for nom, note in zip(noms, notes):
    print(nom, note)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>zip(noms, notes)</code> produit une<br/>
séquence de couples <code>(nom, note)</code> que l'on<br/>
déballe directement dans la boucle. C'est<br/>
l'expression idiomatique du parcours parallèle.</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>
<pre><code>n = 30
r = 0
while r * r &lt;= n:
    r = r + 1</code></pre>
<p>Quelle est la valeur de <code>r</code> à 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^2 &gt; n$. À la sortie, $r - 1$ est la<br/>
partie entière de $\sqrt{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 \times r &gt; n$. Pour $r = 5$, $25 \leq 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 <code>r</code>. La boucle calcule la <strong>racine<br/>
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 \times r = 25<br/>
\leq 30$, donc la condition est encore vraie.<br/>
La boucle fait au moins une itération de plus.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
