<?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), instructions break et<br/>
continue.</p>]]></text>
  </info>
</question>

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

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

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

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

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

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q06 : Boucle while</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait la boucle suivante ?<br/>
`<code>python<br/>
n = 10<br/>
while n &gt; 0:<br/>
    print(n)<br/>
    n -= 1<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>while est une boucle <strong>non bornée</strong> : on<br/>
teste une condition à chaque tour. Bien<br/>
vérifier que la condition finira par devenir<br/>
fausse pour éviter une boucle infinie.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche les nombres de 1 à 10 dans l'ordre</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 : n -= 1 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 : n = 10 &gt; 0, 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/>
n, 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 break 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é : for x in liste: if x == cible: 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="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 : break 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 : break 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 continue 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 exit() ou sys.exit().</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 continue dans une<br/>
boucle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Exemple : for x in liste: if x &lt; 0: continue ;<br/>
print(x) 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 : continue 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 break.</p>]]></text>
    </feedback>
  </answer>
</question>

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

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

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

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q12 : Évaluation paresseuse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi False and 1/0 == 0 ne lève-t-il pas<br/>
ZeroDivisionError en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Évaluation paresseuse : and s'arrête au<br/>
premier False ; or s'arrête au premier<br/>
True. Très utile pour court-circuiter des<br/>
tests coûteux ou risqués.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'il faut un try/except</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 : 1/0 lève bien ZeroDivisionError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les nombres entiers ne plantent jamais</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 1/0 plante en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que and est paresseux : si le premier opérande est False, 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 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 avec break</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que produit ce code ?<br/>
`<code>python<br/>
for i in range(10):<br/>
    if i == 3:<br/>
        break<br/>
    print(i)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tracer pas à pas : i = 0 → print(0) ; i = 1 →<br/>
print(1) ; i = 2 → print(2) ; i = 3 → 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 : break 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 break 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 break 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 : break se déclenche <strong>avant</strong><br/>
print. 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/>
`<code>python<br/>
for i in range(5):<br/>
    if i % 2 == 0:<br/>
        continue<br/>
    print(i)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>continue est utile pour filtrer dans une<br/>
boucle. Alternative : if i % 2 != 0:<br/>
print(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>Boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : for sur un range est borné.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>1 3 (les impairs)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour i ∈ {0, 2, 4} (pairs),<br/>
le continue saute le print. 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 : continue 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/>
`<code>python<br/>
n = int(input())<br/>
while n != 1:<br/>
    if n % 2 == 0:<br/>
        n = n // 2<br/>
    else:<br/>
        n = 3 * n + 1<br/>
    print(n)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La conjecture de Syracuse (1937) demeure ouverte<br/>
en mathématiques : on ne sait pas prouver que la<br/>
suite atteint toujours 1 pour tout n entier<br/>
positif.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Boucle infinie systématique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour tout n testé jusqu'à présent,<br/>
la suite atteint 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche la suite de Fibonacci</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune relation avec Fibonacci.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Calcule la suite de Syracuse (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>`<code>python<br/>
x = 5<br/>
if x &gt; 0:<br/>
    if x &gt; 10:<br/>
        print("grand")<br/>
    else:<br/>
        print("moyen")<br/>
else:<br/>
    print("négatif ou nul")<br/>
</code>`<br/>
Qu'affiche le code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Important : l'else est toujours apparié au<br/>
if du même niveau d'indentation. Lecture<br/>
attentive nécessaire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un cas est forcément exécuté.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>négatif ou nul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est positif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>moyen</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : x = 5 entre dans le premier<br/>
if (5 &gt; 0) ; puis comme 5 ≤ 10, on<br/>
exécute le else interne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>grand</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 n'est pas &gt; 10.</p>]]></text>
    </feedback>
  </answer>
</question>

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

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

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

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

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

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q22 : enumerate</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert enumerate en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>enumerate(iterable, start=0) produit des<br/>
paires (index, valeur). Avec start=1 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 len.</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/>
for i, x in enumerate(liste):. Plus<br/>
lisible que for i in range(len(liste)):<br/>
+ liste[i].</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 : enumerate 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 sorted ou liste.sort().</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/>
`<code>python<br/>
liste = [1, 2, 3, 4, 5]<br/>
for x in liste:<br/>
    if x &gt; 2:<br/>
        liste.remove(x)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle de sécurité : ne <strong>jamais</strong> modifier une<br/>
collection pendant qu'on la parcourt. 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 5 &gt; 2 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/>
([x for x in liste if x &lt;= 2]).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que remove n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : remove 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 else après un<br/>
for. Quand est-elle exécutée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma : recherche avec « else = pas<br/>
trouvé ».<br/>
`<code>python<br/>
for x in liste:<br/>
    if x == cible:<br/>
        print("trouvé")<br/>
        break<br/>
else:<br/>
    print("absent")<br/>
</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>Si la boucle se termine normalement (sans break)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trait peu connu mais<br/>
puissant. Si la boucle se termine par<br/>
break, l'else 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 break</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 : « break ⇒ on casse (sort),<br/>
continue ⇒ 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>break et continue ont le même effet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : break<br/>
<strong>sort</strong> de la boucle ; continue 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 for sur un range fini termine toujours sans intervention</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : terminaison automatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les opérateurs logiques and, or, not permettent de combiner des conditions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : ce sont les trois opérateurs<br/>
booléens.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle while peut être infinie si la condition ne devient jamais fausse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : risque classique de bug.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Conditions et boucles — Q26 : Boucle de saisie validée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut que l'utilisateur saisisse un entier<br/>
strictement positif et redemander tant que la<br/>
réponse n'est pas correcte. Quel code convient le<br/>
mieux ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le schéma while True + break 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[<p>`<code>python<br/>
for i in range(10):<br/>
    n = int(input("n ? "))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code demande <strong>dix fois</strong> la valeur,<br/>
quelle que soit la qualité des saisies, et<br/>
conserve la dernière. Il ne s'arrête pas dès<br/>
qu'une bonne valeur est donnée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
while True:<br/>
    n = int(input("n ? "))<br/>
    if n &gt; 0:<br/>
        break<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle while True répète la<br/>
saisie indéfiniment ; on en sort dès que la<br/>
condition n &gt; 0 est satisfaite, grâce au<br/>
break. C'est l'idiome standard pour la<br/>
validation d'entrée utilisateur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
n = -1<br/>
while n &gt; 0:<br/>
    n = int(input("n ? "))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition initiale n &gt; 0 est<br/>
fausse (puisque n = -1), donc la boucle ne<br/>
s'exécute <strong>jamais</strong>. Aucune saisie n'est<br/>
réellement effectuée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
n = int(input("n ? "))<br/>
if n &lt;= 0:<br/>
    n = int(input("n ? "))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code ne redemande qu'<strong>une seule<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>
<p>``python<br/>
# Extrait A<br/>
if x &gt; 0:<br/>
    y = 1<br/>
elif x &gt; 10:<br/>
    y = 2</p>
<p># Extrait B<br/>
if x &gt; 0:<br/>
    y = 1<br/>
if x &gt; 10:<br/>
    y = 2<br/>
``</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle pratique : utiliser elif lorsque les<br/>
branches s'excluent mutuellement (un seul cas est<br/>
vrai à la fois). Utiliser des if séparés<br/>
lorsqu'on veut <strong>vraiment</strong> que plusieurs<br/>
conditions puissent déclencher chacune leur action.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ils produisent toujours le même résultat</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils diffèrent justement quand x est<br/>
strictement supérieur à 10. L'extrait A donne<br/>
y = 1 (la branche elif n'est pas testée<br/>
parce que la première est vraie), l'extrait B<br/>
donne y = 2 (les deux conditions s'évaluent).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>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 : elif indique que l'on<br/>
n'évalue cette branche que si la précédente<br/>
était fausse. Avec deux if séparés, les deux<br/>
conditions sont toujours vérifiées<br/>
indépendamment, ce qui peut conduire à des<br/>
réaffectations indésirables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'extrait A produit une erreur car elif ne fonctionne pas seul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elif est un mot-clé valide en Python<br/>
tant qu'il suit un if. Sa présence ne<br/>
provoque aucune erreur de syntaxe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'extrait B est plus rapide 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 noms et notes 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 : enumerate quand on veut<br/>
l'indice <strong>et</strong> l'élément ; zip(*matrice) pour<br/>
transposer une matrice ; zip(a, b, c) 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[<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="0" 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>Code correct mais peu pythonique. Il manipule<br/>
des indices alors que l'on n'en a pas besoin.<br/>
Préférer zip, qui exprime directement le<br/>
parcours parallèle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for nom in noms:<br/>
    for note in notes:<br/>
        print(nom, note)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces boucles imbriquées affichent<br/>
<strong>toutes les paires</strong> (nom, note), pas<br/>
uniquement celles de même rang. Pour deux<br/>
listes de longueur n, on obtient n²<br/>
lignes au lieu de n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for nom, note in zip(noms, notes):<br/>
    print(nom, note)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : zip(noms, notes) produit une<br/>
séquence de couples (nom, note) 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>
<p>`<code>python<br/>
n = 30<br/>
r = 0<br/>
while r * r &lt;= n:<br/>
    r = r + 1<br/>
</code></p>
<p>Quelle est la valeur de r` à la sortie de la boucle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cet algorithme calcule le plus petit entier r<br/>
tel que r² &gt; n. À la sortie, r - 1 est la<br/>
partie entière de √n. Pour n = 30, on<br/>
obtient r = 6, et r - 1 = 5, conforme à<br/>
\lfloor\sqrt{30}\rfloor = 5.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>7</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle s'arrête dès que la condition<br/>
devient fausse, sans incrémenter une fois de<br/>
plus. Pour r = 6, on a déjà 36 &gt; 30 : la<br/>
boucle est sortie avec r = 6.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle s'arrête dès que<br/>
r × r &gt; n. Pour r = 5, 25 ≤ 30 :<br/>
on incrémente. Pour r = 6, 36 &gt; 30 : on<br/>
sort. La valeur finale est donc r = 6.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>30</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion entre la valeur cible n et<br/>
la variable r. La boucle calcule la <strong>racine<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 × r = 25 ≤ 30, donc la condition est encore vraie.<br/>
La boucle fait au moins une itération de plus.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
