<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Modularité et paradigmes</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Modularité d'un programme par séparation en modules<br/>
cohérents, paradigmes de programmation (impératif,<br/>
fonctionnel, objet), notion d'abstraction, intérêt<br/>
de la décomposition pour la lisibilité et la<br/>
réutilisation du code.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q01 : Modularité d'un programme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on la <strong>modularité</strong> d'un<br/>
programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Découper un programme en modules permet de confier à chacun une tâche précise, de le tester isolément et de le réutiliser ailleurs. Un module bien conçu dépend le moins possible des détails internes des autres.</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>Sa décomposition en modules cohérents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un programme modulaire est plus<br/>
lisible, plus testable et plus<br/>
facile à maintenir. La modularité<br/>
est l'un des piliers du génie<br/>
logiciel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa qualité esthétique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La modularité est une propriété<br/>
structurelle objective, et non un<br/>
jugement subjectif sur l'apparence<br/>
du code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa taille mesurée en nombre de lignes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La taille en lignes ne reflète pas<br/>
la modularité d'un programme. Un<br/>
programme court peut être très peu<br/>
modulaire, et inversement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa rapidité d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La rapidité d'exécution est une<br/>
propriété distincte. Un programme<br/>
modulaire peut être rapide ou<br/>
lent ; les deux qualités sont<br/>
indépendantes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q02 : Paradigme impératif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que le <strong>paradigme impératif</strong><br/>
en programmation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Caractéristiques de ce paradigme :<br/>
utilisation de variables modifiables,<br/>
de boucles et d'instructions<br/>
séquentielles. Cette approche est<br/>
historiquement liée à l'architecture<br/>
de von Neumann.</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>Des instructions dans l'ordre modifiant l'état</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est le style de programmation le<br/>
plus répandu, présent en C, en<br/>
Pascal, en Java, et partiellement<br/>
en Python. Il consiste à décrire<br/>
« comment faire » étape par<br/>
étape, à la manière d'une<br/>
recette.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme inventé en 2020</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paradigme impératif est très<br/>
ancien : il est associé aux<br/>
débuts mêmes de la programmation<br/>
dans les années 1950.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une simple variante du paradigme fonctionnel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les paradigmes impératif et<br/>
fonctionnel sont au contraire<br/>
très différents : ils s'opposent<br/>
notamment sur la place accordée à<br/>
la mutation des variables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un style de programmation interdit par la loi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale du<br/>
mot « impératif » est sans rapport<br/>
avec son sens informatique. Aucun<br/>
paradigme de programmation n'est<br/>
interdit par une loi.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q03 : Paradigme fonctionnel</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que le <strong>paradigme fonctionnel</strong> en programmation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantages : un code plus prévisible<br/>
(sans effets de bord cachés), un<br/>
parallélisme facilité, et une plus<br/>
grande facilité de test. En<br/>
contrepartie, l'apprentissage peut<br/>
paraître exigeant pour quelqu'un<br/>
habitué au style impératif.</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>Évaluer des fonctions sans effet de bord</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les langages purement<br/>
fonctionnels les plus connus sont<br/>
Haskell, Lisp et OCaml. Python<br/>
permet aussi d'adopter certains<br/>
aspects fonctionnels, par exemple<br/>
avec les expressions lambda,<br/>
ou les fonctions map et<br/>
filter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tout simplement un programme qui fonctionne correctement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale du<br/>
mot « fonctionnel » est trompeuse.<br/>
En programmation, le paradigme<br/>
fonctionnel renvoie à un style<br/>
précis, fondé sur l'évaluation de<br/>
fonctions sans effet de bord.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme dédié à la gestion des erreurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La gestion des erreurs n'est pas<br/>
le sujet propre du paradigme<br/>
fonctionnel. Celui-ci concerne<br/>
plutôt la manière de structurer<br/>
les calculs autour de fonctions<br/>
sans effet de bord.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le même paradigme que l'impératif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux paradigmes s'opposent<br/>
sur des points fondamentaux,<br/>
notamment la mutation des<br/>
variables et la présence<br/>
d'effets de bord.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q04 : Paradigme objet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que la <strong>programmation orientée objet</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La programmation orientée objet a été<br/>
formalisée par Alan Kay dans le<br/>
langage Smalltalk en 1972. Elle<br/>
est particulièrement adaptée pour<br/>
modéliser des entités du monde réel<br/>
(Voiture, Personne, Compte<br/>
bancaire). Pour des problèmes<br/>
simples, elle peut toutefois<br/>
alourdir inutilement 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="100" format="html">
    <text><![CDATA[<p>Structurer le code autour d'objets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Java, C++, Python et Ruby sont<br/>
des langages très utilisés en<br/>
programmation orientée objet. Au<br/>
programme officiel : la définition<br/>
d'une classe, ses attributs, ses<br/>
méthodes, et la création<br/>
d'instances.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le fait de coder en utilisant des objets physiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale est<br/>
sans rapport avec le sens<br/>
informatique. Les objets en<br/>
programmation orientée objet sont<br/>
des entités logicielles<br/>
abstraites, pas des objets<br/>
physiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une bibliothèque graphique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paradigme objet est une manière<br/>
d'organiser le code en général,<br/>
et non une bibliothèque<br/>
particulière dédiée à<br/>
l'affichage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme aujourd'hui obsolète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Au contraire, la programmation<br/>
orientée objet reste très utilisée<br/>
dans le monde du logiciel, et<br/>
notamment dans les grands projets<br/>
industriels.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q05 : Abstraction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on <strong>abstraction</strong> en<br/>
programmation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tous les langages offrent des<br/>
mécanismes d'abstraction : les<br/>
fonctions, les modules, les classes,<br/>
les types abstraits. Un bon design<br/>
logiciel exploite ces mécanismes au<br/>
maximum pour produire un code<br/>
lisible et maintenable.</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 notion appartenant aux mathématiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot « abstraction » a un sens<br/>
précis en mathématiques, mais on<br/>
parle ici de son sens<br/>
informatique : cacher les détails<br/>
d'une implémentation derrière une<br/>
interface.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Cacher les détails derrière une interface</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Par exemple, on utilise<br/>
len(liste) sans avoir besoin de<br/>
connaître l'implémentation de<br/>
cette fonction. L'abstraction est<br/>
le fondement même de la<br/>
modularité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une obligation imposée par la loi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'abstraction est un principe de<br/>
conception, sans rapport avec une<br/>
quelconque obligation légale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme de programmation particulier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'abstraction est plus large<br/>
qu'un paradigme : elle traverse<br/>
tous les paradigmes (impératif,<br/>
fonctionnel, objet) et fait<br/>
partie du vocabulaire général de<br/>
la programmation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q06 : Pourquoi découper un programme ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi <strong>découper un programme</strong> en<br/>
plusieurs fonctions ou modules ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une maxime classique du génie<br/>
logiciel résume bien cette idée :<br/>
« une fonction, une responsabilité ».<br/>
Si une fonction effectue plusieurs<br/>
tâches distinctes, mieux vaut la<br/>
scinder en autant de fonctions que<br/>
de responsabilités identifiées.</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>Aucune raison particulière ne le justifie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le découpage répond au contraire à<br/>
plusieurs objectifs concrets,<br/>
comme expliqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour gagner quelques secondes lors de la compilation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le gain en compilation, s'il<br/>
existe, est marginal et ne<br/>
constitue pas l'objectif<br/>
principal du découpage en<br/>
modules.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour la lisibilité, les tests et la maintenance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un programme découpé en petites<br/>
unités cohérentes est nettement<br/>
plus facile à comprendre, à<br/>
tester et à faire évoluer dans<br/>
le temps.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour rendre le code plus complexe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est exactement l'inverse. Le<br/>
découpage vise à <strong>simplifier</strong><br/>
le code en le structurant en<br/>
petites unités intelligibles.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q07 : Paradigmes du langage Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel paradigme <strong>dominant</strong> caractérise<br/>
le langage Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Python est un langage multi-paradigmes<br/>
par conception. De nombreux langages<br/>
modernes le sont également<br/>
(JavaScript, Scala, Kotlin). Cette<br/>
flexibilité permet de choisir le<br/>
meilleur outil pour chaque situation.</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 est multi-paradigmes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python permet de mélanger<br/>
librement les différents styles<br/>
de programmation. C'est un<br/>
langage très flexible, qui laisse<br/>
au programmeur le soin de<br/>
choisir l'approche la plus<br/>
adaptée au problème traité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Strictement le seul paradigme fonctionnel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python n'est pas un langage<br/>
purement fonctionnel. Il accepte<br/>
la mutation des variables et les<br/>
effets de bord, qui sont au<br/>
contraire évités en<br/>
programmation purement<br/>
fonctionnelle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement le paradigme objet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python est certes très orienté<br/>
objet en interne (toute valeur<br/>
est un objet), mais il accepte<br/>
parfaitement d'autres styles de<br/>
programmation, à commencer par<br/>
le style impératif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement le paradigme impératif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python ne se limite pas au style<br/>
impératif : il offre des outils<br/>
fonctionnels (lambda, map,<br/>
compréhensions) et un système<br/>
objet complet.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q08 : Importer un module</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, comment <strong>importe-t-on</strong> des<br/>
fonctions définies dans un module<br/>
outils.py situé à côté du fichier<br/>
principal ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La modularité en Python repose sur les modules, qui sont de simples fichiers d'extension .py : un fichier placé à côté du programme principal s'importe par son nom, sans l'extension.</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>Avec l'instruction use outils</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La syntaxe use n'existe pas en<br/>
Python. C'est le mot-clé<br/>
import qu'il faut utiliser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec une directive spéciale include outils.py en tête</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La directive include existe en<br/>
C ou en C++, mais pas en<br/>
Python. Le mécanisme d'import<br/>
est différent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec import outils ou from outils import fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont les deux syntaxes standard. Avec la première, les fonctions s'utilisent sous la forme outils.fonction ; la seconde permet d'utiliser directement la fonction importée, sans préfixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune syntaxe ne permet ce type d'import</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python propose au contraire un<br/>
mécanisme d'import très complet,<br/>
comme indiqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q09 : Avantage de la réutilisation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le <strong>principal avantage</strong> de la<br/>
réutilisation de code déjà écrit ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne pratique consiste à se<br/>
familiariser avec la bibliothèque<br/>
standard de son langage avant<br/>
d'écrire du code soi-même. Beaucoup<br/>
de problèmes ont déjà une solution<br/>
éprouvée disponible.</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>On code plus vite, avec moins de bugs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plutôt que de tout réinventer, on<br/>
s'appuie sur du code existant,<br/>
qu'il s'agisse de la<br/>
bibliothèque standard du langage<br/>
ou de bibliothèques externes<br/>
reconnues. Cela permet un effet<br/>
d'échelle : un même code testé<br/>
sert à de nombreux programmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code occupe moins d'espace</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La place occupée n'est pas le<br/>
critère principal. La<br/>
réutilisation peut même<br/>
augmenter la taille du programme<br/>
si la bibliothèque utilisée est<br/>
volumineuse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun avantage particulier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La réutilisation apporte au<br/>
contraire des bénéfices<br/>
importants, comme expliqué dans<br/>
la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code s'exécute plus rapidement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La rapidité d'exécution n'est<br/>
pas systématiquement améliorée<br/>
par la réutilisation. Une<br/>
bibliothèque générique peut<br/>
parfois être plus lente qu'une<br/>
implémentation spécialisée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q10 : Décomposition typique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour calculer la moyenne d'une liste<br/>
de notes lue dans un fichier au format<br/>
CSV, quelle décomposition est la <strong>plus propre</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le principe de <strong>séparation des préoccupations</strong> consiste à isoler<br/>
les entrées-sorties, le calcul, et<br/>
la présentation des résultats. C'est<br/>
une architecture classique, simple<br/>
et robuste.</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>Trois fonctions distinctes (lire, calculer, afficher)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Chaque fonction a alors une<br/>
responsabilité claire et unique.<br/>
Chacune peut être testée<br/>
indépendamment et réutilisée<br/>
ailleurs dans le programme ou<br/>
dans un autre projet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'utiliser aucune fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Écrire un programme entier sans<br/>
aucune fonction est une mauvaise<br/>
pratique. Le découpage en<br/>
fonctions reste essentiel à la<br/>
lisibilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tout placer dans une seule fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une fonction qui mélange lecture,<br/>
calcul et affichage est plus<br/>
difficile à tester et à<br/>
réutiliser. Mieux vaut séparer<br/>
ces responsabilités.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une seule fonction qui ne fait qu'un appel à print</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette décomposition est trop<br/>
minimaliste. Aucune des<br/>
opérations principales (lecture,<br/>
calcul) n'est isolée dans sa<br/>
propre fonction.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q11 : Deux modules qui s'importent mutuellement</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un projet, le module calculs.py<br/>
commence par import affichage pour<br/>
montrer ses résultats à l'écran, et le<br/>
module affichage.py commence par<br/>
import calculs pour obtenir les valeurs<br/>
à afficher. Quel défaut de conception ce<br/>
choix révèle-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les dépendances entre modules doivent<br/>
former une hiérarchie sans cycle : un<br/>
module de bas niveau (calculs, structures<br/>
de données) ignore ceux qui l'utilisent<br/>
(affichage, programme principal). Un module<br/>
qui ne dépend que de la bibliothèque<br/>
standard est le plus simple à tester et à<br/>
réutiliser.</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 doublon de code, car chaque module recopie les fonctions de l'autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : import ne recopie aucun<br/>
code. Chaque fonction n'existe qu'une<br/>
fois, dans le fichier qui la définit.<br/>
Le défaut n'est pas la duplication mais<br/>
la dépendance mutuelle, qui attache les<br/>
deux modules l'un à l'autre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun défaut, car Python accepte les imports dans les deux sens</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python charge bien les deux<br/>
fichiers, mais la conception reste<br/>
défectueuse, car aucun des deux modules<br/>
ne peut plus vivre séparément.<br/>
L'exécution peut même échouer : si<br/>
affichage.py écrit<br/>
from calculs import moyenne, le<br/>
programme s'arrête sur ImportError,<br/>
car calculs n'a pas fini de se charger<br/>
au moment où affichage réclame sa<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une dépendance circulaire, qui soude les deux modules l'un à l'autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : deux modules qui<br/>
s'importent l'un l'autre forment en<br/>
réalité un seul bloc. Impossible de<br/>
tester calculs seul, de le réutiliser<br/>
dans un autre projet ou de remplacer<br/>
affichage sans toucher à calculs.<br/>
C'est le couplage fort que la<br/>
conception modulaire cherche à éviter :<br/>
calculs doit se contenter de renvoyer<br/>
ses résultats, et c'est affichage (ou<br/>
le programme principal) qui les montre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une perte de temps, car chaque appel de fonction recharge l'autre module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un module n'est chargé qu'une<br/>
seule fois, lors de son premier<br/>
import ; les appels de fonctions qui<br/>
suivent ne rechargent rien. Le problème<br/>
n'est pas la vitesse d'exécution mais<br/>
l'organisation du programme, dans<br/>
laquelle les deux modules dépendent<br/>
l'un de l'autre.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q12 : Accéder à un attribut</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Soit l'instance<br/>
v = Voiture("Peugeot", 2020). Comment<br/>
accède-t-on à l'attribut marque de<br/>
cet objet ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La notation objet.attribut<br/>
permet de lire ou de modifier un<br/>
attribut. La notation<br/>
objet.methode(...) permet<br/>
d'appeler une méthode définie sur<br/>
l'objet.</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>Avec la notation v::marque</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le double deux-points est<br/>
utilisé en C++ (résolution de<br/>
portée), mais pas en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec la notation v.marque</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La notation pointée permet<br/>
d'accéder aussi bien aux<br/>
attributs qu'aux méthodes d'un<br/>
objet. C'est la syntaxe<br/>
standard en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la notation v-&gt;marque</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La flèche -&gt; est utilisée en<br/>
C ou en C++, mais pas en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la notation v[marque]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les crochets servent à indexer<br/>
une liste ou un dictionnaire,<br/>
et non à accéder à l'attribut<br/>
d'un objet.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q13 : Fonction pure</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'une <strong>fonction pure</strong>, au<br/>
sens du paradigme fonctionnel ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un avantage important des<br/>
fonctions pures est qu'elles<br/>
autorisent la <strong>mémoïsation</strong>, qui<br/>
consiste à mettre en cache les<br/>
résultats déjà calculés. Ces<br/>
fonctions facilitent aussi le<br/>
raisonnement mathématique sur le<br/>
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="100" format="html">
    <text><![CDATA[<p>Même résultat pour mêmes paramètres, sans effet de bord</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce type de fonction est<br/>
prévisible, facilement<br/>
testable, et permet une<br/>
parallélisation aisée. Un<br/>
exemple : def carre(x): return<br/>
x * x. À l'inverse, une<br/>
fonction comme<br/>
def lire_fichier(f) n'est<br/>
pas pure, car elle effectue<br/>
une opération<br/>
d'entrée-sortie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction qui ne prend aucun paramètre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de paramètres n'a<br/>
aucun rapport avec la pureté<br/>
d'une fonction. Une fonction<br/>
pure peut prendre zéro, un ou<br/>
plusieurs paramètres.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction qui ne contient aucun bug</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La pureté n'a aucun rapport<br/>
avec l'absence de bugs. Une<br/>
fonction pure peut très bien<br/>
être incorrecte ; inversement,<br/>
une fonction avec effets de<br/>
bord peut être correcte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction écrite dans un langage mathématique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description est trop<br/>
vague. Une fonction pure se<br/>
définit précisément par<br/>
l'absence d'effet de bord et<br/>
par sa déterministicité, et non<br/>
par son expression dans un<br/>
langage particulier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q14 : Une fonction, une responsabilité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que recommande le principe<br/>
« <strong>une fonction, une responsabilité</strong> » ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Si une fonction traiter lit un<br/>
fichier, effectue des calculs et<br/>
écrit le résultat, mieux vaut la<br/>
scinder en trois fonctions<br/>
distinctes, chacune dédiée à une<br/>
seule responsabilité.</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>Chaque fonction accomplit une seule tâche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce principe est l'un des piliers<br/>
de la modularité. Une fonction<br/>
à responsabilité unique est<br/>
plus fiable, plus lisible et<br/>
plus facile à tester. Si l'on<br/>
ne peut pas décrire une<br/>
fonction en une phrase courte,<br/>
il vaut mieux la découper.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Chaque fonction doit prendre exactement un seul paramètre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de paramètres n'a<br/>
aucun rapport avec ce<br/>
principe, qui concerne la<br/>
tâche accomplie par la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un programme ne doit posséder qu'une seule fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation est<br/>
incorrecte. Un programme<br/>
contient en général de<br/>
nombreuses fonctions, chacune<br/>
ayant sa responsabilité<br/>
propre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Chaque fichier doit contenir une seule fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un module peut tout à fait<br/>
contenir plusieurs fonctions<br/>
liées à un même thème. Ce<br/>
principe ne porte pas sur<br/>
l'organisation des fichiers.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q15 : Interface d'un module</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que désigne l'<strong>interface</strong> d'un<br/>
module ou d'une fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne pratique consiste à<br/>
« programmer contre une interface,<br/>
pas contre une implémentation ».<br/>
Cela rend le code robuste face<br/>
aux changements internes des<br/>
modules dont il dépend.</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 couleur d'affichage dans l'éditeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La couleur d'affichage relève<br/>
des préférences de l'éditeur,<br/>
et non de la définition d'une<br/>
interface en programmation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code source du module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code source représente<br/>
l'<strong>implémentation</strong> du module,<br/>
c'est-à-dire la manière dont il<br/>
fonctionne en interne. C'est<br/>
précisément ce que l'interface<br/>
cherche à masquer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les points d'accès publics du module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'interface joue le rôle d'un<br/>
contrat public. Tant que ce<br/>
contrat est respecté, on peut<br/>
modifier l'implémentation sans<br/>
impacter les utilisateurs du<br/>
module.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement la documentation du module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La documentation décrit<br/>
l'interface, mais l'interface<br/>
elle-même est un concept plus<br/>
large : elle inclut aussi la<br/>
signature effective des<br/>
fonctions et leur<br/>
comportement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q16 : Fonction d'ordre supérieur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Laquelle de ces écritures utilise explicitement<br/>
une <strong>fonction d'ordre supérieur</strong>, trait<br/>
caractéristique du style fonctionnel ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques outils fonctionnels en<br/>
Python : map, filter et<br/>
lambda. Ils sont idiomatiques<br/>
mais doivent être utilisés avec<br/>
discernement, sans sacrifier la<br/>
lisibilité.</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/>
carres = []<br/>
for x in liste:<br/>
    carres.append(x * x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette écriture est typique du<br/>
style impératif, avec une<br/>
boucle et des modifications<br/>
successives d'une variable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
carres = [x * x for x in liste]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette compréhension de liste<br/>
est d'esprit fonctionnel (pas<br/>
de mutation explicite), mais<br/>
elle n'appelle aucune fonction<br/>
d'ordre supérieur : aucune<br/>
fonction n'y est passée en<br/>
argument à une autre fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
carres = liste.map(square)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe n'est pas<br/>
valide en Python : les listes<br/>
ne possèdent pas de méthode<br/>
map. La fonction map est<br/>
une fonction native qui<br/>
s'utilise différemment.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
carres = list(map(lambda x: x * x, liste))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>map est une fonction d'ordre<br/>
supérieur : elle reçoit une<br/>
fonction en argument (ici une<br/>
lambda anonyme) et l'applique<br/>
à chaque élément de la<br/>
collection. C'est le trait<br/>
le plus caractéristique du<br/>
style fonctionnel.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q17 : Bibliothèques standard</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi est-il préférable de<br/>
privilégier les <strong>bibliothèques standard</strong> plutôt que de tout coder<br/>
soi-même ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques bibliothèques standard utiles en Python : math, random, csv, time. Leur documentation décrit précisément chaque fonction, ce qui permet de s'en servir sans lire leur 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>Parce qu'aucun avantage réel ne distingue les deux approches</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les bibliothèques apportent au<br/>
contraire de nombreux<br/>
avantages : un code testé par<br/>
de nombreux utilisateurs,<br/>
documenté et maintenu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que Python impose d'utiliser ses bibliothèques standard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune obligation n'est<br/>
imposée : on peut tout<br/>
réécrire soi-même. C'est une<br/>
question de choix raisonné,<br/>
et non de contrainte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que leur code est déjà testé, documenté et maintenu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ce code est de<br/>
qualité, éprouvé par de très<br/>
nombreux utilisateurs.<br/>
La probabilité de produire un<br/>
meilleur code seul, en<br/>
quelques heures, qu'une<br/>
bibliothèque standard<br/>
maintenue depuis des années<br/>
est très faible. Sauf cas<br/>
particuliers (apprentissage,<br/>
contraintes spécifiques), la<br/>
réutilisation est plus sage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'elles rendent toujours le programme plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une bibliothèque n'est pas<br/>
toujours plus rapide qu'un<br/>
code écrit à la main pour un<br/>
cas précis. La performance<br/>
n'est pas le critère<br/>
principal pour préférer une<br/>
bibliothèque, mais la qualité<br/>
et la fiabilité.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q18 : Le paramètre self</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans la définition d'une méthode<br/>
Python, à quoi sert le premier<br/>
paramètre, traditionnellement nommé<br/>
self ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Lors d'un appel comme<br/>
v.afficher(), Python transmet<br/>
automatiquement l'objet v<br/>
comme premier paramètre self.<br/>
La méthode peut alors lire ou<br/>
modifier les attributs de v<br/>
via la notation<br/>
self.attribut.</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>Il représente la classe elle-même, pas l'instance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paramètre self représente précisément l'<strong>instance</strong> (l'objet créé), et non la classe dont elle est issue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il est rempli automatiquement avec la valeur 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paramètre self reçoit<br/>
l'objet courant lors de<br/>
l'appel, et non une valeur<br/>
numérique fixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est un mot-clé réservé qu'il ne faut jamais modifier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nom self est une simple<br/>
convention, et non un mot-clé<br/>
réservé du langage. On<br/>
pourrait techniquement<br/>
l'appeler autrement, mais ce<br/>
serait fortement déconseillé,<br/>
car cela briserait les<br/>
habitudes des autres<br/>
développeurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il désigne l'instance sur laquelle la méthode est appelée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paramètre self permet à<br/>
la méthode d'accéder aux<br/>
attributs et aux autres<br/>
méthodes de l'objet courant,<br/>
par exemple self.marque. Il<br/>
fait le lien entre la méthode<br/>
appelée et l'objet sur lequel<br/>
elle s'exécute.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q19 : Classe et instance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre une<br/>
<strong>classe</strong> et une <strong>instance</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une classe peut avoir aucune,<br/>
une, ou de très nombreuses<br/>
instances. Chaque instance<br/>
possède son propre état (ses<br/>
propres valeurs d'attributs),<br/>
mais les méthodes restent<br/>
définies une seule fois, dans<br/>
la classe.</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 classe est le plan, l'instance un objet concret</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une analogie utile : la<br/>
classe est comme un moule à<br/>
gâteaux, et les instances<br/>
sont les gâteaux eux-mêmes.<br/>
On écrit class Voiture:<br/>
pour définir une classe et<br/>
ma_voiture = Voiture() pour<br/>
en créer une instance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe s'exécute plus rapidement que l'instance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La rapidité d'exécution n'est<br/>
pas la différence pertinente<br/>
entre classe et instance. Ce<br/>
sont deux notions distinctes,<br/>
pas deux variantes d'un même<br/>
concept.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La notion d'instance est aujourd'hui obsolète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La notion d'instance reste<br/>
centrale en programmation<br/>
orientée objet : c'est l'objet<br/>
concret manipulé au cours de<br/>
l'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux notions sont au<br/>
contraire bien distinctes,<br/>
comme expliqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q20 : Choisir un paradigme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel paradigme de programmation<br/>
faut-il privilégier ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La tendance moderne est aux<br/>
langages multi-paradigmes, qui<br/>
permettent de mélanger les<br/>
meilleurs aspects de chaque<br/>
approche selon le contexte.</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 paradigme objet, dans tous les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette position est trop<br/>
dogmatique. Aucun paradigme<br/>
n'est universellement<br/>
supérieur aux autres ; le<br/>
choix dépend du problème à<br/>
résoudre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Cela dépend du problème à résoudre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun paradigme n'est<br/>
universellement meilleur. Un<br/>
bon programmeur sait choisir<br/>
l'outil adapté au contexte.<br/>
Beaucoup de programmes<br/>
modernes mélangent<br/>
d'ailleurs plusieurs<br/>
paradigmes au sein d'un même<br/>
projet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'importe quel paradigme convient toujours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Il existe souvent un choix<br/>
plus pertinent qu'un autre,<br/>
en fonction de la nature du<br/>
problème à résoudre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paradigme fonctionnel, dans tous les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette position est elle<br/>
aussi trop dogmatique. Le<br/>
paradigme fonctionnel<br/>
excelle pour les<br/>
transformations de données,<br/>
mais il n'est pas toujours<br/>
le plus naturel pour tous<br/>
les problèmes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q22 : Piège classique de la programmation orientée objet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est un <strong>piège classique</strong> de la<br/>
programmation orientée objet ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne maxime : choisir<br/>
l'outil adapté au problème. Une<br/>
classe pour seulement deux<br/>
fonctions s'apparente à un<br/>
empilement inutile. À partir<br/>
d'une méthode importante avec<br/>
un état persistant, la classe<br/>
devient en revanche pertinente.</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>Utiliser des fonctions classiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Utiliser des fonctions n'est<br/>
pas un piège ; c'est au<br/>
contraire souvent la bonne<br/>
solution face à des<br/>
problèmes simples.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Modéliser en classes des cas qui ne le justifient pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour calculer une simple<br/>
somme de notes, il n'est pas<br/>
nécessaire de créer une<br/>
classe CalculateurDeMoyenne.<br/>
Une fonction suffit<br/>
largement. La programmation<br/>
orientée objet a un coût en<br/>
complexité qu'il faut savoir<br/>
peser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La programmation orientée objet ne présente aucun piège</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Comme tout paradigme, la<br/>
programmation orientée objet<br/>
a ses pièges, dont l'excès<br/>
de modélisation est l'un des<br/>
plus classiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Coder de manière trop simple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le piège évoqué ici est<br/>
précisément l'inverse :<br/>
c'est l'excès de complexité<br/>
qui pose problème, pas la<br/>
simplicité.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q23 : Définir une classe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel squelette permet de définir une<br/>
classe Point avec deux attributs x<br/>
et y initialisés à la création ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le constructeur s'écrit<br/>
toujours sous la forme<br/>
def __init__(self, …): et<br/>
stocke les paramètres reçus<br/>
dans self. Pour instancier la<br/>
classe, on écrit par exemple<br/>
p = Point(3, 4) ; ensuite,<br/>
p.x vaut 3 et p.y vaut<br/>
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>`<code>python<br/>
def Point(x, y):<br/>
    self.x = x<br/>
    self.y = y<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette définition utilise<br/>
def, qui définit une<br/>
fonction, et non une classe.<br/>
Il manque le mot-clé<br/>
class.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
class Point:<br/>
    def __init__(x, y):<br/>
        self.x = x<br/>
        self.y = y<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Il manque le paramètre self<br/>
en tête de __init__. À la<br/>
création de l'objet, Python<br/>
transmet l'instance comme<br/>
premier argument : l'appel<br/>
Point(3, 4) fournit donc<br/>
trois arguments à une méthode<br/>
qui n'en attend que deux, d'où<br/>
une erreur TypeError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
class Point(x, y):<br/>
    return x, y<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les parenthèses qui suivent<br/>
le nom d'une classe ne<br/>
servent pas à déclarer ses<br/>
attributs. Une définition<br/>
de classe ne renvoie pas<br/>
non plus de valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
class Point:<br/>
    def __init__(self, x, y):<br/>
        self.x = x<br/>
        self.y = y<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode __init__ est<br/>
appelée automatiquement à la<br/>
création de l'objet. Elle<br/>
reçoit self, puis les<br/>
valeurs initiales, et les<br/>
stocke en tant qu'attributs<br/>
de l'instance.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes<br/>
sur la modularité et les<br/>
paradigmes, laquelle est<br/>
<strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les langages purement<br/>
fonctionnels les plus connus<br/>
sont Haskell et Idris. Les<br/>
langages multi-paradigmes<br/>
incluent Python, JavaScript,<br/>
Scala et OCaml.</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 fonction pure n'a pas d'effet de bord</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. L'absence d'effet<br/>
de bord est précisément ce<br/>
qui définit une fonction<br/>
pure.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La modularité améliore la maintenabilité du code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. La modularité est<br/>
précisément un facteur clé<br/>
de maintenabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Python est un langage purement fonctionnel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est fausse<br/>
(donc c'est la bonne<br/>
réponse). Python est un<br/>
langage <strong>multi-paradigmes</strong>.<br/>
Il prend en charge des<br/>
aspects fonctionnels<br/>
(lambda, map,<br/>
compréhensions), mais il<br/>
autorise aussi la mutation<br/>
des variables et les effets<br/>
de bord, ce qui n'est pas<br/>
possible dans un langage<br/>
purement fonctionnel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paradigme objet structure le code autour d'objets combinant données et comportements</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. C'est même la<br/>
définition du paradigme<br/>
objet.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q26 : Encapsulation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que désigne le principe<br/>
d'<strong>encapsulation</strong> en programmation<br/>
orientée objet ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'encapsulation favorise le<br/>
couplage faible : un objet expose<br/>
uniquement ce dont les autres ont<br/>
besoin (son interface publique) et<br/>
cache le reste. C'est la base du<br/>
principe « programmer contre une<br/>
interface, pas contre une<br/>
implémentation ».</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>Compresser un fichier avant de<br/>
l'envoyer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la compression de<br/>
données est sans rapport avec<br/>
le concept d'encapsulation. Le<br/>
terme « encapsulation » a un<br/>
sens informatique précis,<br/>
différent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Regrouper données et méthodes, en masquant l'interne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'un des<br/>
piliers de la programmation<br/>
orientée objet. L'utilisateur<br/>
d'un objet manipule l'interface<br/>
publique (les méthodes) sans<br/>
dépendre du fonctionnement<br/>
interne (les attributs). On<br/>
peut alors modifier<br/>
l'implémentation sans casser<br/>
le code utilisateur, tant que<br/>
l'interface reste stable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réutiliser les classes<br/>
d'un autre programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la réutilisation est<br/>
un autre concept (lié à la<br/>
modularité). L'encapsulation<br/>
concerne le <strong>masquage</strong> des<br/>
détails internes derrière une<br/>
interface publique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Mettre tout le code d'une<br/>
application dans un seul fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse de la<br/>
modularité. L'encapsulation va<br/>
précisément dans le sens<br/>
opposé : on isole les<br/>
responsabilités dans des objets<br/>
(ou modules) distincts.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q27 : Lire la documentation de sorted</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un extrait simplifié de la documentation de Python indique : « sorted(liste, reverse=False) renvoie une <strong>nouvelle</strong> liste triée ; si reverse vaut True, le tri est décroissant ». Qu'affiche le programme suivant ?</p>
<p>`<code>python<br/>
notes = [12, 8, 15]<br/>
t = sorted(notes, reverse=True)<br/>
print(notes, t)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Exploiter la documentation d'une fonction permet de savoir, sans lire son code, ce qu'elle renvoie, si elle modifie ses arguments et à quoi servent ses paramètres optionnels, comme reverse.</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>[8, 12, 15] [15, 12, 8]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sorted ne trie pas notes sur place, il fabrique une autre liste. La liste notes s'affiche telle qu'elle a été créée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[12, 8, 15] [15, 12, 8]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sorted construit une nouvelle liste, triée par ordre décroissant grâce à reverse=True, et laisse notes intacte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[12, 8, 15] [8, 12, 15]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le paramètre reverse=True demande un tri décroissant. Sans lui, on obtiendrait bien [8, 12, 15].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[15, 12, 8] [15, 12, 8]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la documentation précise que sorted renvoie une nouvelle liste. La liste notes n'est pas modifiée et s'affiche dans son ordre d'origine.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q24 : Reconnaître un paradigme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Considérez le fragment Python suivant :</p>
<p>print(sum(map(lambda x: x ** 2, range(10))))</p>
<p>Quel <strong>paradigme</strong> de programmation ce style illustre-t-il<br/>
principalement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un même langage peut accueillir plusieurs paradigmes.<br/>
Python est multiparadigme : on peut écrire ce calcul<br/>
de manière impérative<br/>
(total = 0; for x in range(10): total += x ** 2),<br/>
orientée objet (en passant par une classe), ou<br/>
fonctionnelle (comme ici). Choisir le style adapté à<br/>
chaque problème fait partie de la culture du<br/>
programmeur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La programmation orientée objet, car on utilise des méthodes implicites</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune classe ni méthode n'est définie<br/>
explicitement ici. Le code ne s'articule pas autour<br/>
d'objets et de messages, mais autour de la<br/>
composition de fonctions.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La programmation fonctionnelle (map, lambda)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la programmation fonctionnelle se<br/>
reconnaît à la composition de fonctions, à<br/>
l'absence de variables intermédiaires modifiées<br/>
en place, et à l'utilisation de fonctions comme<br/>
paramètres (ici, la lambda passée à map).<br/>
Python supporte ce style tout en restant<br/>
principalement impératif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La programmation logique, car le code déclare un ensemble de contraintes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la programmation logique (Prolog par<br/>
exemple) repose sur des règles et des prédicats,<br/>
pas sur des compositions de fonctions. Le fragment<br/>
présenté ici n'est pas déclaratif au sens logique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La programmation impérative, car on imprime un résultat à l'écran</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la présence de print ne suffit pas à<br/>
caractériser le style. Le cœur du calcul est<br/>
fonctionnel ; print est juste l'instruction<br/>
d'affichage finale.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q28 : Paradigmes mêlés dans un programme de notes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On considère le programme suivant :</p>
<p>``python<br/>
class Eleve:<br/>
    def __init__(self, nom, notes):<br/>
        self.nom = nom<br/>
        self.notes = notes</p>
<p>def moyenne(e):<br/>
    return sum(e.notes) / len(e.notes)</p>
<p>classe = [Eleve("Léa", [12, 16]), Eleve("Tom", [9, 10])]<br/>
admis = list(filter(lambda e: moyenne(e) &gt;= 10, classe))<br/>
noms = []<br/>
for e in admis:<br/>
    noms.append(e.nom)<br/>
``</p>
<p>Quels paradigmes de programmation ce programme mobilise-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avec un même langage, et même dans un même programme, on peut mêler plusieurs paradigmes. On choisit pour chaque partie le style le plus adapté : objets pour modéliser les élèves, fonctions pour filtrer, boucle pour accumuler un résultat.</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>Objet et impératif, filter n'étant qu'une boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : filter applique une fonction passée en argument, ici une lambda, sans modifier de variable : c'est une construction typique du paradigme fonctionnel, même si elle parcourt la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement objet, puisqu'il définit une classe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la classe Eleve relève bien du paradigme objet, mais le programme ne s'y limite pas. Le filtrage par filter et lambda est fonctionnel, la boucle qui remplit noms est impérative.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Objet, fonctionnel et impératif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la classe Eleve et ses attributs relèvent de l'objet, filter avec une lambda du fonctionnel, et la boucle qui ajoute les noms un à un en modifiant la liste noms de l'impératif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement fonctionnel, car tout passe par des fonctions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : définir des fonctions ne suffit pas à rendre un programme fonctionnel. La classe Eleve relève de l'objet, et la boucle for qui modifie noms au fil des tours est impérative.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q29 : Ce qu'est une API</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on l'<strong>API</strong> (interface de<br/>
programmation) d'une bibliothèque ou d'un service ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une API décrit ce qu'on peut demander à un module ou<br/>
à un service en ligne et sous quelle forme : noms<br/>
des fonctions, paramètres, valeurs renvoyées. Elle<br/>
sépare l'usage de l'implémentation, ce qui permet de<br/>
faire évoluer l'un sans toucher à l'autre.</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 code source complet de la bibliothèque, qu'il faut lire en entier avant de pouvoir l'utiliser</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Utiliser une bibliothèque ne demande pas d'en<br/>
lire le code : la documentation de l'interface<br/>
suffit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'interface graphique (fenêtres, boutons, menus) par laquelle un utilisateur manipule l'application</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une API s'adresse aux programmes, pas aux<br/>
utilisateurs ; les deux notions sont distinctes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un langage de programmation particulier, réservé à l'écriture des applications destinées au web</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une API n'est pas un langage ; on l'appelle<br/>
depuis Python, JavaScript ou tout autre langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les fonctions, classes et constantes qu'elle offre aux programmes, avec leur mode d'emploi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est le contrat entre la bibliothèque et ceux<br/>
qui l'utilisent ; le fonctionnement interne reste<br/>
caché.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q30 : Utiliser une fonction d'après sa documentation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La documentation du module meteo indique :<br/>
« temperature(ville) renvoie la température<br/>
actuelle de la ville, en degrés Celsius, sous forme<br/>
de flottant ; renvoie None si la ville est<br/>
inconnue. » Quel programme utilise correctement<br/>
cette fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Utiliser une API, c'est respecter son contrat : nom,<br/>
paramètres, type du résultat et cas particuliers<br/>
annoncés. La documentation dit tout ce qu'il faut<br/>
savoir, sans lire le code du module.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
import meteo<br/>
t = meteo.temperature("Lyon")<br/>
if t is None:<br/>
    print("ville inconnue")<br/>
else:<br/>
    print(t)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Appel par le nom du module, un seul argument, et<br/>
prise en compte du cas None prévu par la<br/>
documentation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
import meteo<br/>
t = meteo.temperature("Lyon", "Celsius")<br/>
print(t)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La documentation annonce un seul paramètre ;<br/>
l'unité est fixée par la fonction. Un second<br/>
argument provoque une TypeError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
import meteo<br/>
if meteo.temperature == "Lyon":<br/>
    print(meteo.temperature)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce code compare la fonction elle-même à une<br/>
chaîne, sans jamais l'appeler ; il n'affiche<br/>
jamais rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
import meteo<br/>
print(temperature("Lyon"))<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Après import meteo, la fonction s'appelle<br/>
meteo.temperature ; sans ce préfixe,<br/>
temperature est un nom inconnu (NameError).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q31 : Importer tous les noms d'un module</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi déconseille-t-on l'écriture from outils import * ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>import outils puis outils.moyenne(...) garde chaque nom dans<br/>
son espace : on sait d'où vient chaque 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="0" format="html">
    <text><![CDATA[<p>Elle recopie le fichier du module à l'intérieur du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le module est chargé une fois, rien n'est recopié.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle n'est permise que pour les modules de la bibliothèque standard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle fonctionne avec tout module, c'est bien le<br/>
problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle n'importe que les fonctions, jamais les constantes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle importe tous les noms publics, constantes<br/>
comprises.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle importe tous les noms, au risque d'en écraser d'autres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une fonction moyenne du programme peut être<br/>
remplacée en silence par celle du module, et l'origine de<br/>
chaque nom devient impossible à lire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q32 : Importer un module sous un alias</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Après import random as rd, comment appeler la fonction randint<br/>
de ce module ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un alias raccourcit le nom d'un module sans renoncer au préfixe,<br/>
qui dit d'où vient chaque 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="0" format="html">
    <text><![CDATA[<p>rd(randint, 1, 6), l'alias étant une fonction d'appel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rd est le module, pas une fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>rd.randint(1, 6), rd désignant le module random</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'alias remplace le nom du module dans tout le<br/>
programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>random.randint(1, 6), l'alias n'étant qu'un commentaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec un alias, le nom random n'est pas défini dans le<br/>
programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>randint(1, 6), toutes les fonctions étant importées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : import ne place pas les fonctions dans l'espace du<br/>
programme, il faut préfixer.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q33 : Ce que cherche une instruction d'importation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que cherche Python quand il exécute import outils ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Écrire un module, c'est écrire un fichier .py ; l'importer,<br/>
c'est le charger sous son nom.</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 fonction nommée outils définie plus haut dans le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : import ne concerne pas les fonctions du programme<br/>
courant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dossier outils contenant obligatoirement un fichier main.py</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un simple fichier suffit ; les dossiers ont leurs<br/>
propres règles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une variable outils contenant le texte du module sous forme de chaîne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le module n'est pas du texte stocké dans une variable,<br/>
c'est un fichier chargé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un fichier outils.py sur le chemin de recherche des modules</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un module est un fichier Python ; Python<br/>
l'exécute une fois et rend ses définitions accessibles sous le<br/>
nom outils.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q34 : Une modification dans un module importé</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le module A importe et utilise le module B. On modifie B.<br/>
Dans quel cas A risque-t-il de ne plus fonctionner ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Séparer interface et implémentation permet de faire évoluer un<br/>
module sans toucher à ceux qui l'utilisent.</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>Toujours, la moindre modification de B se répercutant sur A</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : changer l'implémentation d'une fonction sans changer<br/>
son interface ne touche pas A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Jamais, les deux modules étant des fichiers indépendants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : A dépend de B, puisqu'il l'importe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seulement si A et B sont écrits dans le même fichier source</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont deux fichiers, et la dépendance passe par<br/>
l'importation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Si l'interface de B change, noms ou paramètres de fonctions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : A ne connaît de B que son interface. Tant<br/>
que les fonctions gardent leur nom, leurs paramètres et leur<br/>
comportement annoncé, leur réécriture interne est invisible.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q35 : Le paradigme d'une requête SQL</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une requête SELECT nom FROM eleves WHERE note &gt; 15 décrit le<br/>
résultat voulu sans indiquer comment le calculer. De quel<br/>
paradigme relève-t-elle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Impératif, objet et fonctionnel disent comment calculer ; le<br/>
déclaratif dit seulement quoi obtenir.</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>Déclaratif, on décrit le résultat sans dire comment l'obtenir</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le système de gestion de bases de données<br/>
choisit lui-même l'ordre des opérations et les index à<br/>
utiliser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Objet, chaque table étant un objet avec ses méthodes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la requête ne manipule ni classe ni méthode.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Impératif, la requête étant une suite d'instructions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune boucle ni affectation, aucun ordre<br/>
d'exécution imposé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Fonctionnel, la requête étant une fonction pure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le style fonctionnel compose des fonctions ; SQL<br/>
décrit un résultat.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q36 : Un programme qui réagit aux clics</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans une page web, une fonction est associée à un bouton et ne<br/>
s'exécute qu'au clic ; le programme attend sinon sans rien faire.<br/>
Comment appelle-t-on ce style ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les interfaces graphiques et le web reposent sur la programmation<br/>
événementielle, souvent mêlée aux autres paradigmes.</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>Récursif, chaque clic rappelant le programme depuis le début</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun appel récursif n'intervient.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Impératif pur, les instructions se suivant dans l'ordre du fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre d'exécution dépend des clics, pas du fichier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Événementiel, le code répondant aux actions de l'utilisateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le programme ne déroule pas une suite<br/>
d'instructions, il enregistre des réactions et attend les<br/>
événements.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Fonctionnel, le bouton se contentant d'appeler une fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : appeler une fonction ne suffit pas ; c'est l'attente<br/>
d'événements qui caractérise ce style.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q37 : Une méthode qui ne modifie rien</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Cette méthode est-elle compatible avec le style fonctionnel ?<br/>
``python<br/>
class Point:<br/>
    def __init__(self, x, y):<br/>
        self.x = x<br/>
        self.y = y</p>
<p>def distance(self, autre):<br/>
        return ((self.x - autre.x) <strong> 2 + (self.y - autre.y) </strong> 2) ** 0.5<br/>
``</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Ce qui compte pour la pureté, c'est l'absence de modification et<br/>
de dépendance à un état caché, pas la syntaxe employé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="100" format="html">
    <text><![CDATA[<p>Oui, sans modification ni effet de bord, comme une fonction pure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : distance lit les attributs sans les changer et<br/>
son résultat ne dépend que des deux points. Les paradigmes se<br/>
combinent : des objets immuables et des méthodes pures.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement si la classe ne possède aucun attribut modifiable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : lire des attributs ne crée aucun effet de bord.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, les classes et leurs méthodes relèvent du seul paradigme objet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un programme mêle couramment objets et fonctions<br/>
pures.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, toute méthode modifie l'objet sur lequel elle est appelée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une méthode peut se contenter de lire les attributs.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
