<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Spécification</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Spécifier une fonction : signature (nom, paramètres,<br/>
type de retour), préconditions, postconditions,<br/>
documentation par docstrings, exemples d'usage,<br/>
relation avec les tests.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q01 : Spécification</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que la <strong>spécification</strong> d'une<br/>
fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Adage : « bien spécifier = à moitié<br/>
implémenté ». Bien spécifier permet de<br/>
tester, de documenter, et de coder<br/>
correctement.</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>Sa vitesse d'exécution sur la machine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La vitesse d'exécution est<br/>
une mesure de performance,<br/>
observable à l'usage. Ce<br/>
n'est pas la<br/>
spécification, qui décrit<br/>
le comportement attendu<br/>
de la fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Son code source complet, recopié intégralement ligne par ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code source décrit<br/>
<strong>comment</strong> la fonction<br/>
réalise sa tâche, alors<br/>
que la spécification<br/>
décrit <strong>ce qu'elle doit faire</strong>. Les deux<br/>
notions sont<br/>
distinctes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Son nombre total de lignes de code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de lignes est<br/>
une mesure du code, sans<br/>
rapport avec ce que la<br/>
fonction est censée<br/>
accomplir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Ce que la fonction doit faire, indépendamment du code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la spécification est un<br/>
<strong>contrat</strong> entre l'auteur et<br/>
l'utilisateur. Elle précède<br/>
l'implémentation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q02 : Signature</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on la <strong>signature</strong> d'une fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux fonctions de <strong>même signature</strong> sont<br/>
interchangeables du point de vue de<br/>
l'appelant. C'est la base de la modularité.</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>Le numéro de ligne où la fonction est définie dans le fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La position dans le<br/>
fichier source ne fait<br/>
pas partie de la<br/>
signature : seuls le<br/>
nom, les paramètres et<br/>
le type de retour la<br/>
composent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Son nom, ses paramètres typés et son type de retour</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'« en-tête »<br/>
identifiant uniquement la fonction. En<br/>
Python avec annotations :<br/>
def carre(x: int) -&gt; int:.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La date de création</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La date de création n'a<br/>
aucun lien avec la<br/>
signature, qui désigne<br/>
uniquement l'en-tête<br/>
identifiant la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nom de l'auteur de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation<br/>
littérale n'a aucun<br/>
rapport avec le sens<br/>
technique du mot<br/>
« signature » en<br/>
programmation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q03 : Précondition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'une <strong>précondition</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est l'utilisateur qui doit garantir la<br/>
précondition. La fonction peut faire<br/>
confiance à ses paramètres (sauf si elle<br/>
est défensive et vérifie elle-même).</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 condition tirée au hasard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une précondition n'a rien<br/>
d'aléatoire. C'est une<br/>
contrainte explicite,<br/>
documentée par le<br/>
concepteur de la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une condition vérifiée juste après l'appel de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait une <strong>postcondition</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une condition vraie avant l'appel, sur les paramètres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, pour une<br/>
fonction racine(x), la précondition<br/>
peut être « x ≥ 0 ». Si la précondition<br/>
n'est pas respectée, la fonction n'a<br/>
pas à fonctionner correctement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une condition d'arrêt d'une boucle du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La condition d'arrêt<br/>
d'une boucle est une<br/>
notion liée au contrôle<br/>
de flux d'un programme,<br/>
et non à la<br/>
spécification d'une<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q04 : Postcondition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'une <strong>postcondition</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Précondition + postcondition = <strong>contrat</strong><br/>
de la fonction. Cette approche est dite<br/>
« <strong>programmation par contrat</strong> ».</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>Le type de retour déclaré dans la signature de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le type de retour fait<br/>
partie de la signature.<br/>
La postcondition est, elle,<br/>
une propriété logique<br/>
que la valeur renvoyée<br/>
doit vérifier (par<br/>
exemple, « le résultat<br/>
est positif »).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une condition tirée au hasard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une postcondition n'a<br/>
rien d'aléatoire. C'est<br/>
une garantie explicite<br/>
fournie par la fonction<br/>
sur son résultat.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Ce que la fonction garantit sur son résultat en sortie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, pour<br/>
racine(x), la postcondition est<br/>
« la valeur renvoyée r vérifie<br/>
r * r == x » (à epsilon près pour les<br/>
flottants).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une condition avant l'appel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait une <strong>précondition</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q05 : Docstring</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>documenter</strong> une fonction Python selon la convention du langage ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Docstring de qualité : description courte,<br/>
ligne vide, description détaillée,<br/>
paramètres, retour, exemples (&gt;&gt;&gt; ...).</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>Dans un fichier README placé à part</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La documentation<br/>
générale d'un projet<br/>
peut être placée dans un<br/>
fichier README, mais la<br/>
documentation d'une<br/>
fonction se met<br/>
directement dans son<br/>
corps, à l'aide d'une<br/>
docstring.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec un commentaire placé tout à la fin de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la convention est de placer la documentation en tout début de corps de fonction, sous forme de docstring, juste après la ligne def.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec un commentaire # au-dessus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un commentaire # se lit dans le code, mais la convention de Python pour documenter une fonction est la docstring, placée dans le corps de la fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec une docstring en première instruction du corps</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : def f(x): puis, sur la ligne suivante, """description...""". C'est ce texte qu'affiche help(f).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q06 : Exemple complet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la <strong>bonne pratique</strong> pour spécifier<br/>
une fonction Python valeur_absolue(x) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonnes pratiques : signature typée,<br/>
docstring claire, contrat<br/>
pré-/post-conditions documenté.</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>``python<br/>
def valeur_absolue(x: float) -&gt; float:<br/>
    """Renvoie la valeur absolue de x.</p>
<p>Précondition : x est un nombre.<br/>
    Postcondition : le résultat est &gt;= 0.<br/>
    """<br/>
    return abs(x)<br/>
``</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : signature avec types,<br/>
docstring décrivant le but, pré- et<br/>
postconditions. Le code se documente<br/>
lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def valeur_absolue(x):<br/>
    """valeur_absolue(x)"""<br/>
    return abs(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la docstring ne fait que répéter<br/>
le nom de la fonction. Elle ne dit ni ce<br/>
que fait la fonction, ni ce qu'elle attend,<br/>
ni ce qu'elle garantit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
# x est un nombre<br/>
# renvoie sa valeur absolue<br/>
def valeur_absolue(x):<br/>
    return abs(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la spécification est écrite en commentaires placés au-dessus de la fonction. Elle est lisible, mais la convention de Python est une docstring, chaîne entre triples guillemets placée sous la signature.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def valeur_absolue(x: float) -&gt; float:<br/>
    # Renvoie la valeur absolue de x.<br/>
    # Précondition : x est un nombre.<br/>
    return abs(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la spécification est écrite en commentaires dans le corps. La forme attendue est une docstring, chaîne entre triples guillemets placée sous la signature.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q07 : Pourquoi spécifier ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi spécifier une fonction <strong>avant</strong> de<br/>
l'écrire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sans spécification : code parfois<br/>
« qui marche », mais buggé sur des cas<br/>
limites non envisagés. Avec spécification :<br/>
cas limites pensés en amont.</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>Pour ralentir l'exécution du code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La spécification n'a<br/>
aucune incidence sur la<br/>
performance ; elle<br/>
précède l'écriture du<br/>
code et ne s'exécute<br/>
pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour utiliser davantage de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La spécification est un<br/>
document conceptuel<br/>
rédigé avant le code.<br/>
Elle n'a aucun rapport<br/>
avec la consommation<br/>
mémoire à l'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que c'est strictement obligatoire dans le langage Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas une obligation<br/>
syntaxique. C'est une bonne pratique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour clarifier le but, faciliter les tests et la documentation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la spécification<br/>
structure la pensée. On évite de coder<br/>
dans le brouillard. La fonction est<br/>
alors testable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q09 : Écrire un test avec assert</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction carre(x) doit renvoyer le carré de x. Quelle ligne constitue un test qui arrête le programme si carre(3) ne renvoie pas 9 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un test compare le résultat d'un appel à la valeur attendue par la spécification. Écrit avec assert, il ne dit rien quand tout va bien et arrête le programme dès qu'un résultat est faux.</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>assert carre(3) == 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si la comparaison est fausse, assert arrête le programme avec une AssertionError ; si elle est vraie, l'exécution continue sans rien afficher.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>assert carre(3) = 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le signe = sert à l'affectation. Cette ligne provoque une erreur de syntaxe ; une comparaison s'écrit avec ==.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>carre(3) == 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette ligne calcule un booléen, mais personne ne l'exploite. Si carre(3) renvoyait une autre valeur, le programme continuerait sans rien signaler.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>assert carre(9) == 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les rôles sont inversés. Pour une fonction correcte, carre(9) vaut 81 : ce test arrêterait le programme alors que la fonction est juste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q10 : Cas limites</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quels sont les <strong>cas limites</strong> typiques à<br/>
considérer en spécifiant une fonction sur une<br/>
liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour les nombres : 0, négatifs, très<br/>
grands, fractionnaires. Pour les chaînes :<br/>
vide, un caractère, accents, emojis. Pour<br/>
les listes : vide, un élément, doublons,<br/>
triée/non trié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>Une liste constituée uniquement d'éléments imaginaires</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation<br/>
n'a pas de sens en<br/>
informatique : on<br/>
travaille toujours avec<br/>
des données concrètes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Liste vide, à un élément, ou très longue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ces cas révèlent<br/>
souvent des bugs. Toujours les inclure<br/>
dans les tests.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, le cas général suffit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les bugs sont souvent dans les<br/>
cas limites.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste de couleurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description est<br/>
trop spécifique : on<br/>
cherche ici les cas<br/>
limites génériques d'une<br/>
fonction sur une<br/>
liste, indépendamment<br/>
du type de ses<br/>
éléments.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q12 : Identifier la précondition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour la fonction<br/>
`<code>python<br/>
def diviser(a, b):<br/>
    return a / b<br/>
</code>`<br/>
Quelle est une <strong>précondition</strong> essentielle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonnes pratiques : (1) noter la<br/>
précondition dans la docstring ; (2) la<br/>
vérifier en début de fonction avec<br/>
assert ; (3) la tester explicitement.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a == b</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'égalité entre a et<br/>
b ne joue aucun rôle<br/>
dans la division. Cette<br/>
contrainte n'est pas<br/>
une précondition<br/>
pertinente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>b != 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sans cette<br/>
précondition, on lève<br/>
ZeroDivisionError. À documenter<br/>
clairement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a &gt; 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La division est<br/>
parfaitement définie<br/>
pour toute valeur de<br/>
a (positive, nulle ou<br/>
négative). Cette<br/>
contrainte n'est donc<br/>
pas une précondition<br/>
nécessaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune précondition n'est nécessaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une précondition est<br/>
bien nécessaire :<br/>
b != 0, faute de quoi<br/>
la division provoque<br/>
une exception.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q13 : Bonne docstring</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que devrait contenir une <strong>bonne docstring</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une docstring minimale décrit le but, les paramètres et la valeur renvoyée ; une docstring complète y ajoute des exemples d'appel et des remarques sur les cas particuliers.</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>Un poème ou un texte décoratif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation est<br/>
fantaisiste. La<br/>
docstring doit être<br/>
claire, factuelle et<br/>
informative.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le but, les paramètres, la valeur renvoyée et des exemples</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ce sont les informations utiles à l'utilisateur, qui peut ainsi appeler la fonction sans avoir besoin de lire son code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement le nom de l'auteur ayant rédigé la fonction et sa date</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nom de l'auteur peut<br/>
y figurer en complément,<br/>
mais il ne suffit pas :<br/>
la docstring sert avant<br/>
tout à décrire le<br/>
comportement de la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code source intégral de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La docstring décrit le<br/>
<strong>comportement</strong> de la<br/>
fonction. Reproduire<br/>
son code source serait<br/>
redondant : ce dernier<br/>
est déjà visible juste<br/>
après.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q14 : help()</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait help(ma_fonction) en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>help() est un raccourci interactif pour consulter la documentation d'une fonction ou d'une bibliothèque. Toujours documenter ses fonctions, pour aider les futurs lecteurs, y compris soi-même.</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 la signature et la docstring de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est pourquoi documenter une fonction par une docstring est utile, la documentation s'affiche directement dans l'interpréteur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle lance la documentation officielle en ligne sur Internet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : help ne consulte aucune ressource en ligne. Elle affiche la documentation disponible sur place, fournie par la docstring de la fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle exécute la fonction donnée en argument</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction help se<br/>
contente d'afficher la<br/>
documentation associée<br/>
à son argument ; elle<br/>
n'exécute pas la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie le code source</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : help affiche la signature et la docstring de la fonction, pas les instructions de son corps.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q15 : Protéger une fonction par une assertion</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction racine(x) a pour précondition x &gt;= 0. Quelle ligne, placée au début de son corps, arrête le programme dès qu'un appel ne respecte pas cette précondition ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>`<code>python<br/>
def racine(x):<br/>
    assert x &gt;= 0, "x doit être positif ou nul"<br/>
    return x ** 0.5<br/>
</code>`<br/>
Une assertion en tête de fonction vérifie la précondition à chaque appel. Le message qui la suit aide à comprendre l'arrêt.</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># précondition : x &gt;= 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un commentaire documente la précondition mais Python l'ignore. Un appel racine(-4) s'exécuterait sans aucun signalement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>assert x &gt;= 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si x est négatif, l'assertion est fausse et le programme s'arrête avec une AssertionError, avant tout calcul absurde.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>return x &gt;= 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : return termine la fonction et renvoie un booléen, à chaque appel. La racine ne serait jamais calculée, et aucun appel incorrect ne serait signalé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>assert x &lt; 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition est inversée. Une assertion énonce ce qui doit être vrai ; celle-ci arrêterait le programme pour tous les appels corrects et laisserait passer les mauvais.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q16 : Type de retour</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi spécifier le <strong>type de retour</strong> d'une<br/>
fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Annotations de type courantes : int, float, str, bool, list, dict. Elles documentent le prototype de la fonction sans rien changer à son exécution.</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 obligatoire en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'annotation du type de<br/>
retour est facultative<br/>
en Python ; le langage<br/>
accepte parfaitement les<br/>
fonctions sans<br/>
annotation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela rend la fonction nettement plus rapide à l'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les annotations de type<br/>
n'ont aucun effet sur la<br/>
performance d'exécution<br/>
en Python : elles ne<br/>
servent qu'à<br/>
documenter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour clarifier ce que reçoit l'appelant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, def moyenne(notes: list) -&gt; float annonce à l'appelant qu'il recevra un flottant, sans qu'il ait à lire le corps de la fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour économiser de la mémoire à l'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les annotations de type<br/>
n'ont aucun effet sur<br/>
la consommation mémoire<br/>
d'un programme Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q17 : Bonne signature</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle signature est la <strong>plus claire</strong> pour<br/>
« calculer la moyenne d'une liste de notes » ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonnes pratiques de nommage : verbes pour<br/>
les fonctions (« calculer », « afficher »,<br/>
« valider »), noms explicites pour les<br/>
paramètres (notes plutôt que l).</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>def moyenne(notes: list[float]) -&gt; float:</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : nom explicite, type du<br/>
paramètre, type de retour. Le lecteur<br/>
comprend tout sans lire le code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>def moyenne_liste_notes_float(x):</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nom entasse des informations<br/>
qui devraient être portées par les<br/>
annotations, et le paramètre x ne dit<br/>
rien de ce qu'il reçoit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>def moyenne(notes: list[float]) -&gt; str:</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nom et le paramètre sont clairs,<br/>
mais l'annotation de retour str est<br/>
fausse, une moyenne est un nombre. Une<br/>
annotation erronée est pire qu'une absence<br/>
d'annotation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>def moyenne(notes: list[float], n: int) -&gt; float:</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le paramètre n est redondant, la<br/>
longueur de la liste s'obtient par<br/>
len(notes). Un paramètre superflu rend la<br/>
signature ambiguë : que faire si n ne vaut<br/>
pas len(notes) ?</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q18 : Cas particuliers</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour la fonction moyenne(notes), quel <strong>cas limite</strong> poserait problème ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toujours penser : que se passe-t-il si<br/>
l'<strong>entrée est vide / unique / extrême</strong> ?<br/>
C'est typiquement là que se cachent les<br/>
bugs.</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 note décimale, par exemple 12{,}5 ou 14{,}25</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les notes à virgule ne<br/>
posent pas de problème<br/>
particulier au calcul<br/>
de la moyenne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste vide, qui divise par zéro</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sum([]) / len([]) =<br/>
0 / 0 → ZeroDivisionError. À<br/>
décider : précondition « liste non<br/>
vide », ou retour spécial (None,<br/>
nan).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une note négative</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une note négative n'a<br/>
rien d'un cas limite sur<br/>
le plan mathématique :<br/>
elle ne pose aucun<br/>
problème de calcul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste de cent notes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une liste contenant cent<br/>
notes constitue un cas<br/>
tout à fait standard,<br/>
sans difficulté<br/>
particulière.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q19 : Spec et robustesse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment une bonne spécification améliore-t-elle<br/>
la <strong>robustesse</strong> d'un programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Citation : « Si vous ne pouvez pas<br/>
spécifier ce que doit faire votre code,<br/>
vous ne savez pas ce qu'il doit faire. »<br/>
Conséquence directe : difficile à coder,<br/>
tester, déboguer.</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>En faisant réfléchir aux cas limites et aux entrées valides</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la rigueur de la<br/>
spécification se reflète dans la<br/>
qualité du code. Et permet de <strong>tester</strong><br/>
systématiquement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En réduisant le nombre de lignes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de lignes<br/>
dépend du style et des<br/>
contraintes du langage,<br/>
pas de la spécification.<br/>
Une bonne spec apporte<br/>
de la rigueur, pas de<br/>
la concision.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En écrivant le code plus rapidement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas garanti.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En obligeant à utiliser partout des types statiques très forts</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas spécifiquement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q20 : Choisir un jeu de tests</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La spécification de tarif(age) indique : « renvoie 5 si age est strictement inférieur à 18, et 8 sinon ». Quel jeu de tests vérifie le mieux cette spécification ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un bon jeu de tests couvre chaque cas de la spécification et ses frontières, avec des valeurs attendues conformes au texte. Même ainsi, le succès d'un jeu de tests ne garantit pas la correction du programme.</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>tarif(30) == 8, tarif(50) == 8, tarif(70) == 8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun test ne porte sur les moins de 18 ans. Une fonction qui renverrait toujours 8 passerait ce jeu de tests sans encombre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>tarif(10) == 5, tarif(18) == 5, tarif(40) == 8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le test tarif(18) == 5 contredit la spécification, puisque 18 n'est pas strictement inférieur à 18. Une fonction correcte échouerait à ce test.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>tarif(17) == 5, tarif(18) == 8, tarif(40) == 8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux cas de la spécification sont testés, ainsi que la frontière entre eux, 17 et 18, où se glissent les erreurs du type &lt;= au lieu de &lt;.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>tarif(10) == 5, tarif(12) == 5, tarif(15) == 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les trois tests portent sur le même cas, celui des moins de 18 ans. Une fonction qui renverrait toujours 5 les réussirait tous.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q21 : Spécification ambiguë</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel problème a la spécification suivante ?<br/>
« La fonction chercher(liste, valeur) cherche<br/>
la valeur dans la liste. »</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Signe d'une bonne spec : un autre<br/>
développeur peut implémenter la fonction<br/>
<strong>sans poser de question</strong> et son code<br/>
passe les tests fournis.</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>Aucun problème, cette spécification est parfaitement claire et complète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop ambiguë.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Trop d'ambiguïtés sur ce qu'il faut renvoyer selon les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une bonne spec doit<br/>
lever toutes les ambiguïtés. Sinon,<br/>
deux développeurs feront deux<br/>
implémentations différentes,<br/>
incompatibles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction n'a pas assez de paramètres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La signature chercher(liste,<br/>
valeur) est cohérente :<br/>
deux paramètres suffisent<br/>
pour décrire la recherche.<br/>
Le défaut de cette spec<br/>
tient à l'imprécision de<br/>
l'énoncé, pas au nombre<br/>
de paramètres.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nom de la fonction est trop long</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas le problème.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q22 : Cas d'erreur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment doit-on <strong>spécifier le comportement en cas d'erreur</strong> d'une fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois écoles : Python privilégie les<br/>
<strong>exceptions</strong>, comme l'erreur ValueError<br/>
que provoque int("abc") ; C/Go préfèrent<br/>
les <strong>codes de retour</strong> ; certains langages<br/>
forcent des types Result/Option (Rust).</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>Laisser le programme planter brutalement, sans rien prévoir de précis</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible (exception non rattrapée),<br/>
mais à documenter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoyer aléatoirement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un comportement aléatoire<br/>
en cas d'erreur rendrait<br/>
la fonction imprévisible<br/>
et inutilisable. Une bonne<br/>
spec définit toujours un<br/>
comportement déterministe :<br/>
valeur sentinelle, exception<br/>
ou précondition explicite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Décider explicitement : valeur spéciale, exception ou précondition</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois stratégies<br/>
principales. À documenter. Une fois<br/>
choisie, <strong>être cohérent</strong> dans tout<br/>
le projet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ne pas y penser</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur classique : les bugs viennent<br/>
souvent de cas non spécifiés.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q23 : Spec et évolution</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi une spécification claire facilite-t-elle<br/>
la <strong>maintenance</strong> d'un programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Principe de <strong>boîte noire</strong> : la fonction<br/>
est opaque pour l'appelant. Sa spec est<br/>
l'interface, son implémentation reste<br/>
interne. C'est un pilier de la<br/>
programmation modulaire.</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'elle élimine totalement et définitivement les bugs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
trop optimiste. La<br/>
spécification ne supprime<br/>
pas tous les bugs, mais<br/>
elle <strong>structure</strong> le<br/>
travail et facilite<br/>
leur détection.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le code obtenu est plus court</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La longueur du code n'a<br/>
pas de lien direct avec<br/>
la qualité de la<br/>
spécification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On peut réécrire l'implémentation sans changer le contrat</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'<strong>abstraction</strong>.<br/>
Tant que la spec est respectée, le code<br/>
appelant n'est pas affecté. Permet<br/>
d'optimiser, refactoriser, corriger<br/>
sans cascade de changements.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'une spécification est jolie à lire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'esthétique d'un<br/>
document est un<br/>
critère subjectif. Ce<br/>
n'est pas l'argument<br/>
qui justifie l'intérêt<br/>
pratique d'une<br/>
spécification.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur la<br/>
spécification, laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mnémonique : <strong>pré</strong> comme « avant »<br/>
(responsabilité de l'appelant), <strong>post</strong><br/>
comme « après » (responsabilité de la<br/>
fonction).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La précondition est ce que la fonction doit garantir à l'appel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : la<br/>
précondition est une condition que<br/>
l'<strong>appelant</strong> doit garantir avant<br/>
l'appel. La fonction garantit la<br/>
<strong>postcondition</strong> en sortie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La signature comprend nom, paramètres et type de retour</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : définition standard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La docstring permet d'accéder à la documentation via help()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est correcte : la docstring placée en tête d'une fonction est affichée par help(). Ce n'est donc pas la mauvaise affirmation recherchée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une bonne spécification facilite la maintenance et la robustesse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
juste : une spécification<br/>
claire réduit les<br/>
ambiguïtés, simplifie la<br/>
maintenance et limite<br/>
les bogues. Ce n'est<br/>
donc pas la mauvaise<br/>
affirmation recherchée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q26 : Effet de bord vs valeur de retour</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une fonction de tri peut être spécifiée de<br/>
deux façons différentes. Comment la<br/>
spécification doit-elle distinguer<br/>
explicitement ces deux choix ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention Python : un nom impératif comme<br/>
sort désigne souvent une modification en<br/>
place ; un nom au participe passé comme<br/>
sorted désigne une fonction pure qui<br/>
renvoie un nouvel objet. Toute<br/>
spécification doit préciser explicitement<br/>
ce point.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La spécification précise si la fonction modifie la liste ou en renvoie une copie triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est exactement la<br/>
distinction faite par Python entre<br/>
liste.sort() (en place, retourne None)<br/>
et sorted(liste) (renvoie une nouvelle<br/>
liste). La spécification doit toujours<br/>
préciser cela, sinon le comportement est<br/>
ambigu et bogué en pratique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distinction est purement esthétique et n'a pas d'effet réel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence est<br/>
fondamentale. Modifier en place ou<br/>
renvoyer une copie n'a pas le même coût<br/>
mémoire, et expose à des erreurs<br/>
d'aliasage si plusieurs variables<br/>
référencent la même liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distinction se fait au moment de l'exécution, selon la mémoire disponible sur la machine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait imprévisible et<br/>
rendrait le comportement non<br/>
reproductible. Une bonne spécification<br/>
fixe le comportement à l'avance, pas en<br/>
fonction de l'environnement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distinction n'a pas d'importance, l'utilisateur s'adapte au comportement obtenu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est exactement l'origine de<br/>
nombreux bugs en pratique. Si la<br/>
spécification ne dit pas si la liste est<br/>
modifiée ou si une nouvelle liste est<br/>
renvoyée, l'utilisateur peut écrire<br/>
liste = trier(liste) alors que<br/>
trier modifie déjà liste (et renvoie<br/>
None), ce qui détruit la liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q27 : Précondition, postcondition, invariant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans une fonction qui parcourt une liste avec<br/>
une boucle, comment se distinguent<br/>
<strong>précondition</strong>, <strong>postcondition</strong> et<br/>
<strong>invariant de boucle</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général d'une preuve : précondition à<br/>
l'entrée → invariant initialement vrai →<br/>
invariant conservé à chaque itération → en<br/>
sortie de boucle, l'invariant combiné à la<br/>
condition d'arrêt entraîne la postcondition.<br/>
Les trois notions s'articulent et ne se<br/>
remplacent 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>L'invariant de boucle remplace à lui seul la précondition et la postcondition de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les trois notions coexistent.<br/>
L'invariant de boucle est précisément<br/>
l'outil qui fait le pont entre<br/>
précondition et postcondition à<br/>
travers la boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La précondition est une postcondition imprécise</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces deux notions ne sont pas<br/>
comparables, elles ont un statut<br/>
symétrique. La précondition est garantie<br/>
par l'appelant, la postcondition par la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ce sont trois noms différents pour la même notion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces trois notions ne portent<br/>
pas sur la même chose. Elles concernent<br/>
respectivement l'entrée de la fonction,<br/>
sa sortie, et la boucle interne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La précondition porte sur l'entrée, la postcondition sur la sortie, l'invariant sur la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois échelles<br/>
différentes. La précondition est le<br/>
contrat à l'entrée de la fonction, la<br/>
postcondition le contrat à la sortie, et<br/>
l'invariant de boucle un outil interne<br/>
qui sert à prouver la postcondition à<br/>
partir de la précondition.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q28 : Tester une fonction que l'on croit juste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lina a relu sa fonction trois fois et la trouve correcte. Pourquoi<br/>
écrire quand même des tests ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un test confronte la fonction à sa spécification sur des cas<br/>
choisis : c'est le moyen le plus sûr de détecter une erreur avant<br/>
les utilisateurs.</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 Python exige des tests pour exécuter une fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python n'impose rien ; les tests sont une discipline du<br/>
programmeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'une relecture ne remplace pas une exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les erreurs de frontière, d'indice ou de type<br/>
échappent souvent à la lecture. Un test exécute réellement la<br/>
fonction et compare le résultat à la spécification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour rendre la fonction plus rapide à l'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tester ne change pas la fonction, cela la vérifie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement si la fonction fait plus de dix lignes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une fonction courte peut cacher une erreur de<br/>
frontière.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q29 : Ce que prouve un test réussi</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Les dix tests de la fonction tri passent tous. Que peut-on en<br/>
conclure ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les tests augmentent la confiance ; seule une preuve, par invariant<br/>
par exemple, établit la correction.</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>Que la fonction est rapide sur ces dix listes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les tests vérifient le résultat, pas la vitesse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Qu'aucun de ces dix cas ne révèle d'erreur, rien de plus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un test montre la présence d'une erreur quand il<br/>
échoue, pas son absence quand il réussit. D'autres cas peuvent<br/>
encore échouer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que la spécification est bien écrite et complète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : des tests peuvent réussir sur une fonction qui respecte<br/>
une spécification fausse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que la fonction est correcte pour toutes les listes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : dix cas ne couvrent pas l'infinité des listes<br/>
possibles.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q30 : La valeur à tester en priorité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction est_majeur(age) doit renvoyer True à partir de<br/>
18 ans. Quelle valeur de age est la plus importante à tester ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les cas limites, aux frontières de la spécification, sont ceux qui<br/>
révèlent le plus d'erreurs.</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, un enfant, loin de toute frontière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : même raison, 5 ne distingue pas &gt; de &gt;=.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>40, un adulte typique, loin de toute frontière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une valeur loin de la frontière passe même avec une<br/>
comparaison mal écrite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>18, la frontière entre les deux réponses</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est là qu'une confusion entre &gt; et &gt;=<br/>
se révèle. Les valeurs 17 et 18 testent les deux côtés de<br/>
la frontière.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>100, pour tester une grande valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien de particulier ne se passe à 100 pour cette<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q31 : Un jeu de tests pour une fonction sur les listes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction maximum(t) renvoie le plus grand élément d'une liste<br/>
non vide. Quel jeu de tests couvre le mieux les cas à risque ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Concevoir un jeu de tests, c'est imaginer comment la fonction<br/>
pourrait se tromper et écrire un cas pour chaque hypothèse.</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>Un élément seul, le maximum en dernière position, des doublons du maximum</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ces cas visent les erreurs classiques :<br/>
initialisation, parcours incomplet, comparaison stricte ou<br/>
large.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trois listes de cinq entiers tirés au hasard entre 0 et 100</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : des cas aléatoires passent à côté des situations<br/>
particulières où les bugs se cachent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une seule liste longue, qui contient forcément tous les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une longue liste n'a qu'un seul maximum et qu'une seule<br/>
position pour lui.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste vide, testée trois fois de suite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste vide viole la précondition ; la tester ne dit<br/>
rien de la fonction, et un seul cas ne vaut pas trois.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q32 : Tester une fonction aléatoire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction de() renvoie un entier aléatoire entre 1 et 6.<br/>
Comment la tester, puisque son résultat change à chaque appel ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quand la valeur exacte est imprévisible, on teste ce qui doit<br/>
toujours être vrai : bornes, type, répartition approximative.</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>En vérifiant que de() vaut 3, la valeur centrale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le résultat n'est pas fixé, ce test échouerait<br/>
souvent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>En vérifiant sur mille appels que le résultat est entre 1 et 6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : faute de valeur attendue, on teste une<br/>
propriété que tout résultat doit respecter, sur un grand nombre<br/>
d'appels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En vérifiant qu'elle renvoie toujours la même valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait précisément un signe de défaillance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En ne la testant pas, l'aléatoire étant intestable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les propriétés d'une fonction aléatoire se testent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q33 : Qui garantit la précondition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La spécification de racine(x) indique la précondition « x est<br/>
positif ou nul ». À qui revient-il de la respecter ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le contrat partage les responsabilités : l'appelant respecte la<br/>
précondition, la fonction assure la postcondition.</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>À celui qui appelle la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la précondition est une obligation de<br/>
l'appelant ; en échange, la fonction s'engage sur sa<br/>
postcondition.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À personne, une précondition n'étant qu'une suggestion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : hors de la précondition, le comportement n'est pas<br/>
garanti.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À la fonction, qui doit corriger les arguments invalides</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction peut vérifier, mais pas inventer un<br/>
résultat pour un argument interdit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À Python, qui refuse les arguments invalides</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne connaît pas la spécification.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q34 : La postcondition d'un maximum</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle postcondition décrit complètement le résultat m de<br/>
maximum(t), pour une liste t non vide ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne postcondition est vérifiable et suffisante : elle<br/>
caractérise exactement le résultat attendu.</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>m est un entier positif, comme toutes les notes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le maximum d'une liste de négatifs est négatif, et<br/>
cette condition ne dit rien du lien avec t.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>m est dans t et aucun élément de t ne dépasse m</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux conditions sont nécessaires. Sans la<br/>
première, renvoyer un nombre énorme conviendrait ; sans la<br/>
seconde, n'importe quel élément conviendrait.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>m est le dernier élément de t, la liste étant triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le maximum peut être n'importe où.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>m est plus grand que le premier élément de t</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette condition est insuffisante et même fausse quand<br/>
le premier élément est le maximum.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q35 : Une précondition trop stricte</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour moyenne(notes), Sami écrit la précondition « notes<br/>
contient exactement cinq entiers entre 0 et 20 ». Quel est le<br/>
problème ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une précondition minimale rend la fonction réutilisable ; une<br/>
précondition excessive la condamne à un seul usage.</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>Elle interdit des usages légitimes, comme une liste de trois notes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une précondition doit être juste assez<br/>
restrictive pour que la fonction marche ; ici « liste non vide<br/>
de nombres » suffit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les notes devraient être des flottants plutôt que des entiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le type des notes n'est pas le problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction ne peut pas calculer une moyenne de cinq valeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle le peut très bien, et bien d'autres tailles<br/>
aussi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une précondition ne peut pas mentionner la longueur d'une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle le peut ; la question est de savoir si c'est<br/>
nécessaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q36 : Spécifier une fonction qui modifie son argument</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction trier_sur_place(t) réordonne la liste t reçue et ne<br/>
renvoie rien. Que doit préciser sa spécification, en plus de la<br/>
précondition ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un effet de bord fait partie du contrat : la docstring doit annoncer<br/>
ce que la fonction modifie en dehors d'elle.</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>Qu'elle modifie la liste passée en argument, son effet de bord</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'appelant doit savoir que sa liste sera<br/>
changée et qu'aucune valeur ne sera renvoyée, sous peine<br/>
d'écrire t = trier_sur_place(t) et de perdre sa liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nom de la variable à utiliser par l'appelant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'appelant nomme ses variables comme il veut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre de comparaisons effectuées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le coût peut être documenté, mais ce n'est pas<br/>
l'information essentielle pour utiliser la fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien, une fonction sans return n'ayant pas besoin de spécification</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est justement une fonction à effet de bord qui doit<br/>
le dire clairement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q37 : La postcondition complète d'un tri</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour une fonction trier(t) qui renvoie une nouvelle liste, la<br/>
postcondition « le résultat est trié par ordre croissant » est-elle<br/>
suffisante ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une postcondition se vérifie en cherchant les résultats absurdes<br/>
qu'elle laisserait passer ; chaque faille appelle une condition<br/>
supplémentaire.</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>Oui, être trié suffit à définir le résultat d'un tri</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste vide ou [1, 2, 3] sont triées sans avoir de<br/>
rapport avec t.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, le résultat doit aussi contenir exactement les éléments de t</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sans cette condition, renvoyer la liste vide<br/>
respecterait la postcondition. Un tri conserve les éléments et<br/>
leurs répétitions.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, il faut imposer que t soit modifiée sur place</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction renvoie une nouvelle liste ; t doit au<br/>
contraire rester intacte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, il faut préciser l'algorithme de tri utilisé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la spécification décrit le résultat, pas la méthode.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q38 : La première ligne d'une docstring</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que doit dire, en premier, la docstring d'une fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une docstring répond à la question « que fait cette fonction et<br/>
comment l'appeler ? », sans entrer dans le 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>Le nom de son auteur et son adresse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'auteur peut figurer ailleurs, mais ce n'est pas ce<br/>
que cherche l'utilisateur de la fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La date d'écriture et de dernière modification</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la date n'aide pas à utiliser la fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le détail de chaque ligne de code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la docstring décrit l'usage, pas l'implémentation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Ce que fait la fonction, en une phrase</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la première ligne résume le rôle de la<br/>
fonction ; viennent ensuite les paramètres, la précondition et<br/>
le résultat.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Spécification — Q39 : Que renvoyer quand il n'y a rien à renvoyer</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction chercher(t, x) renvoie l'indice de x dans t.<br/>
Que doit préciser sa spécification pour le cas où x est absent ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les cas particuliers font partie de la spécification : le résultat<br/>
doit être défini pour toute entrée respectant la précondition.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La valeur renvoyée en cas d'absence, par exemple -1 ou None</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sans cette précision, l'appelant ne sait pas<br/>
comment reconnaître l'absence, et des choix différents selon les<br/>
versions casseraient les programmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que la fonction affiche un message signalant l'absence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : afficher n'aide pas le programme appelant, qui a besoin<br/>
d'une valeur exploitable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que la fonction renvoie 0, premier indice valide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 0 est un indice possible pour x présent ; il ne<br/>
peut pas signaler l'absence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien, l'absence étant une erreur de l'appelant, hors contrat</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chercher une valeur absente est un usage normal, pas<br/>
une violation de précondition.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
