<?xml version="1.0" encoding="UTF-8"?><quiz><question type="multichoice"><name><text>Question #1</text></name><questiontext format="html"><text><![CDATA[<p>Parmi ces opérations, lesquelles sont spécifiques à une procédure,
et ne doivent pas être réalisées par une fonction ?</p>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Une procédure interagit avec l’utilisateur. À l’inverse d’une fonction,
elle ne doit pas renvoyer de valeur. De la même manière, une fonction, pour
calculer, peut utiliser des variables.</p>
<p>Les variables constituent un espace de travail <em>local</em> pour les fonctions
comme pour les procédures.</p>]]></text></generalfeedback><single>false</single><answer format="html" fraction="100"><text><![CDATA[<p>affecter une valeur à une cellule</p>]]></text></answer><answer format="html" fraction="0"><text><![CDATA[<p>affecter une valeur à une variable</p>]]></text></answer><answer format="html" fraction="0"><text><![CDATA[<p>retourner une valeur</p>]]></text></answer><answer format="html" fraction="100"><text><![CDATA[<p>afficher un message à l’utilisateur (<code>MsgBox</code>, <code>Input</code>, …)</p>]]></text></answer></question><question type="essay"><name><text>Question #2</text></name><questiontext format="html"><text><![CDATA[<p>La fonction suivante peut-elle tourner indéfiniment ? Si oui, trouver un
exemple, sinon, argumenter.</p>
<pre class="basic"><code>Function Mystère(X as Integer) As Integer
  Mystère = 4
  For i = 1 to (X * X + 1)
    If Mystère &gt; 0 Then
      Mystère = - Mystère * X
    Else
      Mystère = X * X + 1
    End If
  Next i
End Function
</code></pre>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Si le contenu d’une boucle <code>For</code> termine, alors la boucle termine également.
Ici, le corps de la boucle ne contient que des tests et des affectations, ainsi
la boucle termine.</p>
<p>Il y a une exception concernant les boucles <code>For</code> : la variable de comptage
introduite par la boucle ne <em>doit pas</em> être modifiée à l’intérieur de la
boucle (ici, pas d’instruction de la forme <code>i = ...</code>), sinon, il est plus
difficile de prévoir son comportement.</p>
<p>Ne faites pas ça. 🥺</p>]]></text></generalfeedback></question><question type="shortanswer"><name><text>Question #3</text></name><questiontext format="html"><text><![CDATA[<p>Combien de tours de boucle effectue l’appel <code>=Mystère(-3)</code> ?</p>
<pre class="basic"><code>Function Mystère(X as Integer) As Integer
  Mystère = 4
  For i = 1 to (X * X + 1)
    If Mystère &gt; 0 Then
      Mystère = - Mystère * X
    Else
      Mystère = X * X + 1
    End If
  Next i
End Function
</code></pre>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Lorsqu’on appelle <code>=Mystère(-3)</code>, l’expression <code>X * X + 1</code> s’évalue à 10. Puis
les instructions se répètent pour <code>i</code> allant de 1 à 10, soit 10 répétitions.</p>
<p>À noter que puisque <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mn>2</mn></msup><mo>+</mo><mn>1</mn><mo>≥</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">X^{2} + 1 \geq 1</annotation></semantics></math> pour tout <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>X</mi><annotation encoding="application/x-tex">X</annotation></semantics></math>, il n’y a pas de problème.
Cependant si la valeur de fin de la boucle est plus petite que la valeur
initiale, la boucle ne s’exécute pas.</p>]]></text></generalfeedback><answer format="html" fraction="100"><text>10</text></answer></question><question type="multichoice"><name><text>Question #4</text></name><questiontext format="html"><text><![CDATA[<p>Une seule des expressions suivantes adresse sans ambigüité et sans erreur une
cellule (ou une plage de cellules) du tableur. Laquelle ?</p>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Les deux premières expressions sont ambigües car les appels à <code>Cells</code> ne sont
pas préfixés d’un <code>Sheets(...).</code>. La troisième expression adresse la ligne 0,
qui n’existe jamais. Enfin, la dernière expression est mal écrite : <code>Cellls</code> au
lieu de <code>Cells</code>. 👹</p>
<p>La bonne réponse adresse la cellule située à la colonne <code>"GBA"</code>, lointaine
(c’est la 4785<sup>e</sup>) mais valide, et à la 3<sup>e</sup> ligne de la feuille
<code>"MaFeuille"</code>.</p>]]></text></generalfeedback><single>true</single><answer format="html" fraction="0"><text><![CDATA[<p><code>Cells(1, 4)</code></p>]]></text></answer><answer format="html" fraction="0"><text><![CDATA[<p><code>Sheets("MaFeuille").Range(Cells(1, 2), Cells(3, 4))</code></p>]]></text></answer><answer format="html" fraction="0"><text><![CDATA[<p><code>Sheets("MaFeuille").Cells(0, 4)</code></p>]]></text></answer><answer format="html" fraction="100"><text><![CDATA[<p><code>Sheets("MaFeuille").Cells("GBA3")</code></p>]]></text></answer><answer format="html" fraction="0"><text><![CDATA[<p><code>Sheets("MaFeuille").Range(Sheets("MaFeuille").Cellls(1, 2),
Sheets("MaFeuille").Cells(3, 4))</code></p>]]></text></answer></question><question type="essay"><name><text>Question #5</text></name><questiontext format="html"><text><![CDATA[<p>Une procédure sans argument peut être appelée directement depuis
l’interface du logiciel de tableur, typiquement en appuyant sur un bouton
⏯. Ce n’est pas le cas d’une procédure avec argument.
Comment exécuter une telle procédure ? Quel est l’intérêt d’une telle
procédure ?</p>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Une procédure avec argument peut être appelé <em>depuis une autre procédure</em>,
avec le mot-clé <code>Call</code> :</p>
<pre class="basic"><code>Call MaProcedure(argument1, argument2, ...)
</code></pre>
<p>L’intérêt est ici le même que pour des fonctions, en anglais, on parle
de <em>separation of concerns</em> (“séparation
des préoccupations”). Par exemple, une procédure
<code>MiseEnPageCellule(Ligne as Integer, Col as Integer)</code> qui reçoit en argument
un numéro de ligne et de colonne peut s’occuper de modifier la mise en page
de la cellule associée (mettre le texte en gras, ajouter une bordure, etc.
avec la syntaxe fastidieuse qu’on connait). Puis cette procédure peut être
réutilisée par d’autres pour demander directement la mise en page d’une
cellule.</p>]]></text></generalfeedback></question><question type="shortanswer"><name><text>Question #6</text></name><questiontext format="html"><text><![CDATA[<pre class="basic"><code>Dim X, Z As Integer
X = 4
Z = X + 1
X = X + Z
Z = X
X = X + X
Z = Z - 3
X = X - Z
</code></pre>
<p>Quelle valeur contient <code>X</code> après exécution de ces intructions ?</p>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Une affectation opère en deux étapes : d’abord on évalue l’expression à droite
du signe égal, <em>puis</em> on affecte le résultat à la variable à gauche.</p>
<p>En particulier <code>X = Z</code> n’est pas la même chose que <code>Z = X</code> ! De plus le
symbole à gauche doit être un emplacement mémoire : l’instruction <code>4 = X</code> n’a pas
de sens. Plusieurs langages évitent la confusion en adoptant une notation
dissymétrique pour l’affectation : <code>X &lt;- Z</code>, <code>X := Z</code>, etc.</p>]]></text></generalfeedback><answer format="html" fraction="100"><text>12</text></answer></question><question type="multichoice"><name><text>Question #7</text></name><questiontext format="html"><text><![CDATA[<p>J’écris une fonction qui compte, sur une colonne d’un tableur représentant des
noms de famille, le nombre de ces noms qui sont composés.</p>
<p>A priori, quels sont les types les plus adéquats à donner à la variable qui
compte ces noms ?</p>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Le type <code>Variant</code> (aussi appelés <code>Any</code> dans d’autres langages) correspond à
n’importe quelle donnée possible. Il ne faut l’utiliser que si nécessaire.</p>
<p>On cherche à stocker un nombre (d’occurrences), donc le type <code>String</code> des
chaines de caractère n’est pas adéquat.</p>
<p>Utiliser le type <code>Double</code> des nombres à virgule serait ici maladroit : la
manipulations de ces nombres est plus couteuse, source d’erreurs d’approximation
et sans avantage ici.</p>
<p>Enfin, sans connaissance <em>a priori</em> sur le nombre d’entrée dans le tableau,
les deux types de nombres entiers <code>Int</code> et <code>Long</code> sont possibles.</p>]]></text></generalfeedback><single>false</single><answer format="html" fraction="0"><text><![CDATA[<p><code>Variant</code></p>]]></text></answer><answer format="html" fraction="0"><text><![CDATA[<p><code>Double</code></p>]]></text></answer><answer format="html" fraction="100"><text><![CDATA[<p><code>Int</code></p>]]></text></answer><answer format="html" fraction="0"><text><![CDATA[<p><code>String</code></p>]]></text></answer><answer format="html" fraction="100"><text><![CDATA[<p><code>Long</code></p>]]></text></answer></question><question type="shortanswer"><name><text>Question #8</text></name><questiontext format="html"><text><![CDATA[<p><strong>Plus difficile ⚠</strong> On considère la fonction suivante :</p>
<pre class="basic"><code>Function Grabadob(X As Double) As Integer
  Grabadob = 0
  While (Grabadob * Grabadob &lt; X)
    Grabadob = Grabadob + 1
  Wend
End Function
</code></pre>
<p>Quelle est la valeur retournée par <code>=Grabadob(43)</code> ? Pour répondre, essayer
de déduire le comportement général de la fonction pour toute valeur de <code>X</code>.</p>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>Le compteur <code>Grabadob</code> est incrémenté de 1 à chaque tout de boucle. Il
parcourt, jusqu’à la sortie de la boucle, tous les entiers de 1 en 1, depuis 0.
La boucle s’arrête lorsque la condition <em>n’est plus vérifiée</em>, c’est-à-dire
lorsque le carré de <code>Grabadob</code> dépasse <code>X</code>. Ainsi, pour <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi><mo>≥</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">X \geq 0</annotation></semantics></math>, la fonction
retourne le plus petit entier dont le carré est supérieur ou égal à <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>X</mi><annotation encoding="application/x-tex">X</annotation></semantics></math>.
(On note ce nombre <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="true" form="prefix">⌈</mo><msqrt><mi>X</mi></msqrt><mo stretchy="true" form="postfix">⌉</mo></mrow><annotation encoding="application/x-tex">\left\lceil \sqrt{X} \right\rceil</annotation></semantics></math>.)</p>
<p>Sachant que <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>6</mn><mn>2</mn></msup><mo>=</mo><mn>36</mn><mo>&lt;</mo><mn>43</mn><mo>≤</mo><mn>49</mn><mo>=</mo><msup><mn>7</mn><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">6^{2} = 36 &lt; 43 \leq 49 = 7^{2}</annotation></semantics></math>, on en déduit la valeur de retour.</p>]]></text></generalfeedback><answer format="html" fraction="100"><text>7</text></answer></question><question type="essay"><name><text>Question #9</text></name><questiontext format="html"><text><![CDATA[<p>Soit une fonction <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>f</mi><annotation encoding="application/x-tex">f</annotation></semantics></math> qui prend en argument un entier et qui renvoie un entier.
(Par exemple, la fonction qui prend un nombre et renvoie son double.)
On suppose cette fonction implémentée dans VBA avec une fonction qu’on appelle <code>FonctionF</code> :</p>
<pre class="basic"><code>Function FonctionF(X As Integer) As Integer
</code></pre>
<p>Cette fonction reçoit donc en argument un entier <code>X</code> et retourne également un entier.
On définit la suite <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><msub><mrow><mo stretchy="true" form="prefix">(</mo><msub><mi>u</mi><mi>n</mi></msub><mo stretchy="true" form="postfix">)</mo></mrow><mrow><mi>n</mi><mo>≥</mo><mn>0</mn></mrow></msub><annotation encoding="application/x-tex">\left( u_{n} \right)_{n \geq 0}</annotation></semantics></math> par la relation suivante : <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>u</mi><mn>0</mn></msub><mo>=</mo><mn>3</mn><mo>;</mo><mspace width="1.0em"></mspace><msub><mi>u</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>=</mo><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><msub><mi>u</mi><mi>n</mi></msub><mo stretchy="true" form="postfix">)</mo></mrow></mrow><annotation encoding="application/x-tex">u_{0} = 3;\quad u_{n + 1} = f\left( u_{n} \right)</annotation></semantics></math>.
Ainsi, le premier terme de la suite vaut <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mn>3</mn><annotation encoding="application/x-tex">3</annotation></semantics></math>, le deuxième <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false" form="prefix">(</mo><mn>3</mn><mo stretchy="false" form="postfix">)</mo></mrow><annotation encoding="application/x-tex">f(3)</annotation></semantics></math>, le troisième <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>f</mi><mo stretchy="false" form="prefix">(</mo><mn>3</mn><mo stretchy="false" form="postfix">)</mo><mo stretchy="true" form="postfix">)</mo></mrow></mrow><annotation encoding="application/x-tex">f\left( f(3) \right)</annotation></semantics></math>, et ainsi de suite.
En gardant l’exemple d’une fonction qui prend un nombre et renvoie son double, on aurait
<math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>u</mi><mn>0</mn></msub><mo>=</mo><mn>3</mn><mo>,</mo><msub><mi>u</mi><mn>1</mn></msub><mo>=</mo><mn>6</mn><mo>,</mo><msub><mi>u</mi><mn>2</mn></msub><mo>=</mo><mn>12</mn><mo>,</mo><msub><mi>u</mi><mn>3</mn></msub><mo>=</mo><mn>24</mn><mo>,</mo><mi>…</mi></mrow><annotation encoding="application/x-tex">u_{0} = 3,u_{1} = 6,u_{2} = 12,u_{3} = 24,\ldots</annotation></semantics></math></p>
<p>Écrire en VBA une fonction qui prend en argument un entier <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>n</mi><annotation encoding="application/x-tex">n</annotation></semantics></math> et retourne l’entier <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><msub><mi>u</mi><mi>n</mi></msub><annotation encoding="application/x-tex">u_{n}</annotation></semantics></math>.</p>]]></text></questiontext><generalfeedback format="html"><text><![CDATA[<p>L’idée centrale est la suivante : il faut répéter une application de
fonction. Il faut donc une boucle. On utilisera une variable <code>U</code> qui contiendra,
à chaque étape, un terme de la suite. La solution n’est pas unique, on propose la fonction suivante :</p>
<pre class="basic"><code>Function FonctionRepetee(N As Integer) As Integer
  Dim U As Integer
  U = 3
  For i = 1 to N
    U = FonctionF(U)
  Next i
  FonctionRepetee = U
End Function
</code></pre>
<p>On utilise une boucle <code>For</code> car on connait “à l’avance” le nombre
d’itérations nécessaires. En cas de doute sur les valeurs extrême (<code>1</code> ou <code>0</code> ?
<code>N</code> ou <code>N - 1</code> ?) :</p>
<ul>
<li><p>testez avec des valeurs concrètes (“que doit renvoyer la fonction si <code>N</code> vaut 0 ?”) ;</p></li>
<li><p>rappelez-vous que la boucle <code>For i = A to B</code> s’évalue 1 fois quand <code>A</code> et
<code>B</code> sont égaux, et 0 fois quand <code>B</code> est plus petit que <code>A</code>.</p></li>
</ul>]]></text></generalfeedback></question></quiz>