
<h2 class="wimscenter">Exercices avec plusieurs questions et autres possibilités avancées</h2>

<h3>Exercices ayant plusieurs questions</h3>
La commande <span class="tt wims_code_variable">\steps</span> permet de définir des exercices ayant un nombre variable de champs de réponses présentés toutes en même temps ou en plusieurs fois (exercice à étapes).
 Par exemple, si vous définissez (parmi d'autres paramètres)

<pre>\steps{choice 1, reply 1
choice 2, reply 2, reply 3
choice 3
}</pre>
l'exercice sera présenté en trois étapes, la première proposant
un choix multiple (choice 1) et une réponse de type <span class="tt wims_code_words">reply</span> (reply 1),
la seconde proposant un choix multiple et deux réponses de type <span class="tt wims_code_words">reply</span>, etc.
<div>
L'argument de <span class="tt wims_code_variable">\steps</span> accepte des paramètres définis auparavant aussi bien que des définitions
conditionnelles de la même manière que pour la définition de paramètres. Cela permet
de présenter des champs de réponses sélectivement selon des variations aléatoires de
paramètres, même dans le cas où il n'y a qu'une seule étape.

Par exemple,
<pre>
\integer{n=randint(1..4)}
\text{listerep=reply1,reply2,reply3,reply4}
\text{listerep=\listerep[1..\n]}
\steps{\listerep}
</pre>
permettra de définir un énoncé comportant de 1 à 4 champs de réponses. <br>
Le nombre d'instructions <span class="tt wims_code_variable">\answer</span>
que l'exercice comporte est fixe lui. Dans cet exemple, le fichier aura 4 commandes
<span class="tt wims_code_variable">\answer</span>.
Celles utilisées pour analyser l'exercice seront les <span class="tt wims_code_words">\n</span>
premières.
</div><div>
Il faut noter que par défaut si une erreur est faite à une étape, les étapes suivantes ne sont pas
proposées et sont donc considérées comme fausses
(l'option <span class="tt wims_code_words">nonstop</span> peut être ajoutée dans
les commandes <span class="tt wims_code_variable">\answer</span> pour que l'exercice
continue même en cas d'erreur).
</div><div>
Le numéro de l'étape en cours est accessible dans le champ <span class="tt wims_code_words">statement</span>
dans la variable
<span class="tt wims_code_variable">\step</span> qui prend donc successivement les valeurs
 1,2,... à mesure que l'utilisateur avance dans ses réponses.
</div><div>
Pour faire des exercices dynamiques à plusieurs étapes
(étapes variant selon les réponses de l'étudiant), vous pouvez utiliser
la commande <span class="tt wims_code_variable">\nextstep{...}</span>. L'argument de
<span class="tt wims_code_variable">\nextstep</span> est semblable à celui
de <span class="tt wims_code_variable">\steps</span> mais seule la première
ligne est effective. Elle n'est utile que si cet argument est une variable qui change
après avec les définitions de paramètres après soumission.
L'exercice s'arrête quand le contenu de <span class="tt wims_code_variable">\nextstep</span> est vide.
</div><div>
Dans tous les cas, une seule déclaration parmi <span class="tt wims_code_variable">\steps</span>
ou <span class="tt wims_code_variable">\nextstep</span> doit apparaître dans un source OEF.
</div>
<div>
La commande <span class="tt wims_code_variable">\conditions</span> peut être utilisée
en même temps que <span class="tt wims_code_variable">\steps</span> ou
<span class="tt wims_code_variable">\nextstep</span> pour définir la liste des numéros
des commandes <span class="tt wims_code_variable">\condition</span> qui seront utilisées
pour l'analyse des réponses.
</div>

<h3>Branchements conditionnels et boucles</h3>

Commandes disponibles:

<pre>
\if{condition}{contenu conditionnel}
\if{condition}{contenu_conditionnel}{autre_contenu_conditionnel}
\ifval{condition}{contenu conditionnel}
\ifval{condition}{contenu_conditionnel}{autre_contenu_conditionnel}
\for{var=n1 to n2}{contenu_de_la_boucle}
\while{condition}{contenu_de_la_boucle} (uniquement dans l'environnement principal)
</pre>
Les commandes de branchements conditionnels et de boucles peuvent être utilisées
dans l'environnement principal ou (sauf pour <span class="tt wims_code_words">while</span>)
à l'intérieur de l'énoncé (<span class="tt wims_code_words">statement</span>),
d'une aide (<span class="tt wims_code_words">hint</span>),
d'une solution (<span class="tt wims_code_words">solution</span>),
d'un feedback (<span class="tt wims_code_words">feedback</span>).
Lorsque ces commandes sont dans l'environnement principal, elles n'affectent
que la définition de paramètres.
<p>
Attention, dans les commandes <span class="tt wims_code_words">statement</span>,
<span class="tt wims_code_words">feedback</span> ..., la variable utilisée
pour faire une boucle (ici <span class="tt wims_code_words">var</span>) ne doit pas
avoir été déjà définie avant la commande
<span class="tt wims_code_words">statement</span>.
</p>
<h3>Cacher le nom d'images</h3>
Si l'exercice demande de reconnaître une image prise au hasard, le nom de l'image peut donner
une indication à l'exercice. Pour cacher ce nom d'image, vous pouvez écrire dans les parties
<span class="tt wims_code_variable">statement</span>,
<span class="tt wims_code_variable">feedback</span>, etc

<pre>\img{\imagedir/picture.jpg alt="picture"}</pre>

Ainsi dans le source de la page html, l'étudiant pourra voir

<pre>&lt;img src="a_random_unrelated_file_name" alt="picture"></pre>

Le vrai nom de l'image est ainsi caché.

<p><b>Remarque</b>. N'utilisez pas directement la commande WIMS <em>rename</em> pour
traiter le nom de fichier, sinon l'exercice ne fonctionnera pas correctement dans
l'environnement sauvegardé. D'autre part, le nom sera changé uniquement dans le
cas où l'exercice est sauvé dans un module et non dans une classe.
</p>

<h3>Fichiers source prétraités</h3>

Cette fonctionnalité n'est pas disponible pour Createxo. Vous pouvez
l'utiliser si vous écrivez des exercices OEF (et Deductio) sous Modtool.
<p>
Elle vous permet d'inclure des parties de codes communes dans plusieurs fichiers OEF.
Vous pouvez également l'utiliser pour fabriquer par lots plusieurs oef à partir d'un
pré-source, chacun différant des autres par quelques définitions de macros.
</p><p>
Pour utiliser cette possibilité, un sous-répertoire cpp/ doit être créée sous src. Y mettre
les fichiers de pré-source d'extension .cpp. Dans ces fichiers, vous pouvez ajouter
des directives cpp comme <span class="tt wims_code_words">#include</span>,
<span class="tt wims_code_words">#define</span> ou
<span class="tt wims_code_words">#if</span>. (Veuillez vous référer aux
manuels cpp et aux spécifications c pour les détails de la syntaxe.)
</p><p>
La première ligne du fichier cpp doit définir une liste de cibles (targets), dans le format
</p><pre>
target=targ1 targ2 targ3 ...
</pre>
Cette ligne indique que ce fichier cpp doit fabriquer targ1.oef, targ2.oef, etc
(l'extension .oef sera donc ajoutée aux noms de sortie). Lors de la génération du fichier
cible <em>targ1.oef</em>, une macro <em>TARGET_targ1</em> est définie.
Par conséquent, dans le source cpp, vous pouvez ajouter des lignes comme
<pre>
#if defined TARGET_targ1
 \title{Exercise 1}
 \integer{v1=3}
 \text{t1=this is target 1}
#endif
#if defined TARGET_targ2
 \title{Exercise 2}
 \integer{v1=5}
 \text{t1=this is target 2}
#endif
</pre>
afin de rendre le contenu dépendant de la cible.
<p>
Le nom du fichier (dans l'exemple
<span class="tt wims_code_words">targ1</span>, ...) est accessible par la variable
<span class="tt wims_code_words">OEFFILE</span>.
</p><p>
Dans l'exemple suivant, le titre de l'exercice sera
<span class="tt wims_code_words">targ1</span>
</p>
<pre>
#if defined TARGET_targ1
 \title{OEFFILE}
 \integer{v1=3}
 \text{t1=dit is target 1}
#endif
</pre>
<p>
Les fichiers <span class="tt wims_code_words">include</span> doivent également être
placés dans le répertoire src/cpp, avec extension
.inc. Une ligne
</p><pre>
#include "common.inc"
</pre>
va insérer le contenu de common.inc dans le fichier généré OEF.
Veuillez noter que pour des raisons de sécurité, il est interdit de
spécifier des répertoires de fichiers include.
<p>
Une remarque spéciale: cpp s'embrouille lorsque votre fichier contient dans le texte
des apostrophes ou guillemets qui ne sont pas fermés. Dans ce cas, vous pouvez protéger
les commandes contenant ces textes par des commentaires C
(<span class="tt wims_code_words">/* ... */</span>).
</p>

<div class="wims_warning">
<span class="wims_warning">$wims_name_warning</span> : Dans les commandes commençant par # comme dans
<span class="tt">#include</span>, le caractère <span class="tt">#</span> doit être le
premier caractère de la ligne. Il ne faut pas non plus utiliser
<span class="tt">#</span> comme caractère de commentaires.
</div>

<h3>Environnement dans un exercice</h3>
<h4>Variable de débogage</h4>
La variable spéciale <span class="tt wims_code_variable">\oefenv</span>
est utilisée pour tester un exercice
(si elle n'est pas redéfinie dans l'exercice).
<p>
Pour l'instant, le seul contenu possible de cette variable est le mot
<span class="tt wims_code_variable">debug</span>.
Ce mot apparaît à l'intérieur de <span class="tt wims_code_variable">\oefenv</span>
dans les situations suivantes.
</p>
<ol>
<li>quand l'exercice est exécuté à l'intérieur de Createxo ;</li>
<li>quand il est testé dans Modtool par le développeur lui-même ;</li>
<li>quand l'exercice est dans une classe et exécuté par l'administrateur de la classe.
</li>
</ol>
Dans ces cas, la bonne réponse apparaît par défaut dans les champs de réponse
si vous le demandez, vous permettant de voir ce que l'exercice attend comme
réponse sans avoir besoin de remplir vous-même les champs.
<p>
Vous pouvez ajouter des informations de débogage à l'intérieur de votre exercice
en utilisant des conditions comme
</p>
<pre>
\if{debug iswordof \oefenv}{informations de débogage à ajouter ici}
</pre>
Ces informations sont alors automatiquement montrées quand l'exercice
est sous test et automatiquement cachées quand les étudiants y travaillent.

<h4>Autres variables</h4>
Deux autres variables d'environnement sont prédéfinies :
<span class="tt wims_code_variable">lang</span>
et <span class="tt wims_code_variable">presentgood</span>.
On peut récupérer leur valeur à l'aide de la slib <span class="tt wims_code"> oef/env</span>.
<p>
La variable <span class="tt wims_code_variable">lang</span> peut être utilisée
pour l'internationalisation des modules.
</p><div>
La variable <span class="tt wims_code_variable">presentgood</span> permet de tenir compte,
dans la présentation des textes d'un exercice, de la valeur que l'utilisateur choisira
pour le paramétrage "Afficher la bonne réponse" proposé dans l'introduction d'un module oef.
Cette variable vaut 0 lorsque la bonne réponse ne doit pas être affichée et 1 sinon.

Pour l'utiliser, écrire avant le <span class="tt wims_code_variable">\statement</span>
<pre>
\text{presentgood=}
</pre>
et après le <span class="tt wims_code_variable">\statement</span>
<pre>
\text{presentgood=slib(oef/env presentgood)}
</pre>
Il est alors possible de tester la valeur de cette variable
et d'afficher des textes différents selon sa valeur.
Attention, sa valeur est vide lors de l'affichage du premier "écran" de l'exercice,
puisqu'elle n'est utile que pour l'affichage de textes analysant la réponse
de l'élève.
</div>
