La programmation au brevet des collèges 2018

mercredi 26 septembre 2018
par  Alain BUSSER

Le retour des programmes de calcul permet de mettre le flow programming en situation.

Pondichéry

Le sujet comportait, en exercice 4, un programme de calcul, et en exercice 5, un calcul de π par la méthode de Monte-Carlo.

Exercice 4

En fait il y avait deux programmes de calcul et l’objet de l’exercice était essentiellement la recherche des nombres donnant le même résultat avec ces deux programmes.

Programme A
• Choisir un nombre
• Soustraire 3
• Calculer le carré du résultat obtenu
Programme B
• Choisir un nombre
• Calculer le carré de ce nombre
• Ajouter le triple du nombre de départ
• Ajouter 7

Avant de réutiliser Sofus pour programmer A et B en calcul formel, on va d’abord montrer, sur ces deux programmes, comment mettre en œuvre flow974

Préliminaires

Lorsqu’on démarre flow974, il y a déjà une fonction, dont on n’a pas besoin pour ce corrigé. On a donc un peu de nettoyage préliminaire à faire (clic droit sur un bloc puis remove node pour l’enlever, pour ne garder qu’un des nombres présents [1]. On en profite pour ajouter un affichage pour connaître le « résultat des programmes » ; du point de vue fonctionnel, il suffit d’utiliser la fonction identité qui ne modifie rien mais affiche sa valeur. On a donc laissé un nombre, et, si on effectue un clic droit sur la partie vide du plan de travail, le menu qui apparaît alors permet, parmi les fonctions, de choisir l’identité :

Une fois que c’est fait, l’identité est en jaune parce qu’elle vient juste d’être sélectionnée, et il reste encore à effectuer un branchement :

Pour cela, on clique sur la sortie du nombre et, sans lâcher le bouton gauche de la souris, on mène celle-ci vers l’entrée de la fonction :

Une fois qu’on est arrivé et que le bouton gauche de la souris a été lâché, le branchement est effectué :

On s’en rend compte parce que la modification du nombre en entrée se répercute immédiatement à la sortie.

1. Corinne

Le programme A modélise une fonction, que l’on va noter A(x) par la suite : Il est clair, selon l’énoncé, que le nombre obtenu en sortie dépend du nombre choisi en entrée, et c’est exactement ce que signifie le mot « fonction ».
Pour programmer proprement, on se propose de créer une fonction, ce qui se fait en cliquant quelque part entre l’entrée et la sortie, et en naviguant dans le menu apparu, jusqu’à trouver la fonction générique. Comme c’est une fonction, elle se trouve parmi les fonctions.

Mais elle va se nommer « module » après sa création :

Pour la programmer et la renommer, il suffit alors de cliquer sur le bouton “Edit”, ce qui fait entrer dans la fonction.

Une fonction se doit d’avoir une entrée : clic gauche puis choix de celle-ci dans “fonctions” :

Une fonction se doit aussi d’avoir une sortie :

Comme l’étape suivante est de « soustraire 3 » on insère un module de soustraction. Il est dans les opérations :

C’est à l’entrée qu’on soustrait 3, d’où ce branchement :

Mais que soustraire ? Un nombre !

Et ce nombre est 3 :

Enfin il faut calculer le carré du résultat :

Après les branchements nécessaires, le contenu du module A(x) est le suivant :

Au passage on a renommé le module en haut. Après avoir cliqué sur “Enregistrer le module” on est de retour au plan de travail, et là on peut brancher le nombre choisi à l’entrée de A(x) et la sortie de A(x) à l’identité qui sert d’affichage :

On vérifie en positionnant l’entrée sur 1, que Corinne obtient bien 4 en sortie (à droite de l’écran) :

2. Tidjane

Pour répondre à la question de Tidjane, il faut créer un nouveau module nommé B(x) et commencer par y placer le module « carré » puisqu’on a besoin du carré du nombre de départ.

Mais on ne trouve pas de module « triple ». Qu’à cela ne tienne, on va en créer un !
On va donc créer une fonction à l’intérieur d’une fonction : On la nomme « triple » et voici son contenu :

En effet le triple d’un nombre, c’est le produit de 3 par ce nombre.

Avec ce module on peut facilement faire le programme B(x) :

Ci-dessus la partie en jaune correspond à l’expression « ajouter le triple du nombre de départ ». Ce module B(x) permet de répondre à la question de Tidjane : Le nombre trouvé est 17.

3. Lina

La formule saisie est =B3^2+3*B3+7

Pour étoffer un peu cette partie, on propose un prolongement : On verra dans la partie 4 que le but final de l’exercice est de savoir pour quel nombre choisi en entrée, les deux programmes A et B donnent le même résultat. Ce n’est pas difficile en flow programming : il suffit de mettre les deux modules A(x) et B(x) sur un même plan de travail, et d’y injecter le même nombre :

Si le nombre x est au moins 1, B(x) est plus grand que A(x) :

Si le nombre x est négatif ou nul, B(x) est plus petit que A(x) :

Comme les nombres ne prennent que des valeurs entières, on n’a ici que la même information donnée par le tableur : La solution de l’équation A(x)=B(x) est quelque part entre 0 et 1. Ceci dit, dans l’exercice, tous les nombres qui interviennent dans les questions 1, 2 et 3 étant entiers, il faut aller jusqu’à la résolution de l’équation dans la question suivante, pour comprendre que dans cet exercice, « nombre » signifie « réel » et pas nécessairement « entier ».

Pour gagner en précision, on peut ajouter un module de division par 10 au nombre d’entrée, et explorer la situation avec une précision accrue :

4. Zoé

Le vocabulaire de Sofus n’est pas très similaire à celui de l’énoncé ; notamment

  • Quand on soustrait 3, il faut dire à qui on soustrait 3 ;
  • Lorsqu’on calcule un carré, il faut dire quel est le nombre à élever au carré ;
  • Lorsqu’on finit un calcul, il faut dire quoi faire du résultat : L’afficher !
  • Et il faut savoir que si le nombre de départ s’appelle « x », son triple s’écrit « 3×x »

Mais on s’y fait vite. Avec l’aide de Sofus, Zoé

  • prouve que le programme A donne bien x²-6x+9 :
  • trouve que le programme B donne x²+3x+7 :
  • résout l’équation x²-6x+9=x²+3x+7 :

Annexe

Comme Python est de plus en plus un langage de programmation fonctionnelle, voici, à titre de comparaison avec les flow-programmes ci-dessus, les fonctions A et B programmées en Python :

def A(x):
    x -= 3
    x **= 2
    return x

def B(x):
    def triple(nombre):
   	    return 3*nombre
    y = x**2
    y += triple(x)
    y += 7
    return y

Exercice 5

La question 1 portait sur le théorème de Pythagore : Un triangle rectangle était d’ailleurs dessiné sur la copie d’écran de Scratch. La question 2 était une question de cours, portant sur la définition d’un disque. Mais la question 3 s’est montrée très synthétique, en associant le test sur la distance et le calcul de celle-ci par Pythagore. Le script aurait pu être simplifié en laissant Scratch effectuer le calcul de distance et en faisant un dessin à la place. En effet tout lutin de Scratch connaît la distance le séparant d’un autre lutin, et peut s’estampiller sur la scène.

Préparation

Dans Sofus, la tortue numéro 1 peut connaître à quelle distance se trouve la tortue numéro 0. On commence donc par créer la tortue 0, qui restera à l’origine ; puis on cache les deux tortues :

Le script, avec la tortue 0 placée à l’origine du repère, est quand même plus simple que celui de l’énoncé :

Avec SofusPy

On remarque que le script de l’énoncé ne comprend aucun affichage de la variable score et qu’il est fait allusion aux « lignes 5, 6 et 7 du programme » donc à de la programmation textuelle.

En reprogrammant le script avec SofusPy, on obtient ce genre de blocs :

Pas très différents de ceux de l’énoncé. Mais SofusPy donne automatiquement la version Python, laquelle (après quelques retouches comme remplacer les « 0 » par des pointillés) ressemble à ceci :

Et là, on a bien des lignes de programme et pas des blocs à compter...

Nuage de points

Une petite variante du programme simplifié permet de dessiner en rouge les points à l’intérieur du disque et en bleu les autres :

On obtient alors ce genre de nuage de points :

La variable score possède alors une signification : C’est le nombre de points rouges dans le nuage.

Avec SofusPy, les couleurs n’étant pas encore implémentées, on peut faire le choix de ne dessiner le point que lorsque la variable score est incrémentée et affichée sa valeur à la fin du script. Celui-ci peut être copié-collé vers SofusPy :

from turtle import * ; from math import *; from random import *
score = 0; reset()
for _ in range(120):
    setposition(randint(-100, 100), randint(-100, 100))
    Carre_de_OF = xcor()**2 + ycor()**2
    distance = sqrt(Carre_de_OF)
    if distance < 100:
        score = score + 1
        dot(10)
setposition(120,0)
write(score)

Il produit ce genre de dessin où on devine, en pointillés, le disque de rayon 100 (la tortue est à droite, en forme de chevron) :

USA

Le sujet comportait deux exercices de programmation : Le 4 avec des dessins de carrés par Scratch et le 5, avec un dessin de frise par « un logiciel de géométrie dynamique ».

Exercice 4

L’exercice 4 démarre par la définition d’une procédure « carré ». Le côté du carré est une variable globale côté, comme le montre la version Python ci-dessous, obtenue avec la version péï de SofusPy, et plus précisément la deuxième ligne de la fonction [2] carré() : « global côté » qui explique à Python le caractère global de cette variable.

La définition en Blockly est très similaire :

La différence essentielle est que Scratch met le stylo en position d’écriture sans préciser quelle est cette position, alors que Sofus baisse le stylo, la tortue étant vue d’au-dessus, et devant donc baisser son stylo pour que celui-ci laisse une trace de ses mouvements.

Le script principal montre aussi deux petites différences entre Scratch et Sofus :

  • Alors que Scratch met côté à 40, Sofus met 40 dans côté. Ce qui est également suggéré par le pseudocode côté ← 40
  • Alors que Scratch ajoute à côté 20, Sofus augmente côté de 20

Par ailleurs il est rappelé dans l’énoncé que s’orienter à 90 (sans unité !) « signifie qu’on se dirige vers la droite » (qui « on » ? Quelle droite ?)

Question 1

La question 1 porte sur un programme de calcul avec répétition, puisque seule la valeur de la variable côté est considérée. On peut donc ne laisser que les transformations de celle-ci :

La question a porte sur une affectation (initialisation) et la réponse est donc 40, à lire dans le script ; la question b trouve sa réponse dans l’affichage du script ci-dessus :

60
80
100
120

Question 2

Le réglage de l’épaisseur du stylo est une fonction experte de Scratch, on peut donc s’étonner de sa présence alors même que « l’enseignement de l’informatique au cycle 4 n’a pas pour objectif de former des élèves experts, ni de leur fournir une connaissance exhaustive d’un langage ou d’un logiciel particulier ».

Ceci dit, le seul endroit dans la boucle où il ne faut pas mettre le bloc d’augmentation de l’épaisseur du crayon, est avant le bloc carré.

Question 3

La programmation fonctionnelle n’est pour autant pas totalement absente de ce sujet puisque, même si la variable côté est globale, elle est argument de la fonction avancer et l’avant-dernier bloc du nouveau script est traduit en Python (voir ci-dessous) par avancer de (côté + 30). La notation parenthésée montre que avancer de est une fonction, et que son argument n’est plus la valeur actuelle de la variable côté mais la somme côté+30.

Le nouveau script

donne ceci

soit le dessin 3. Le dessin 2 est à écarter parce qu’il n’y a pas les levers de stylo, et le dessin 1 pour une raison plus subtile : Après avoir dessiné un carré, la tortue a tourné en tout de 360° et est donc à nouveau sur l’axe des abscisses, ce qui est incompatible avec le dessin 1.

Version Python

from turtle import * 
def carre():
    global cote
    pendown()
    for _ in range(4):
        forward(cote)
        left(90)
    penup()


reset()

setposition(-200, 0)
cote = 40
for _ in range(4):
    carre()
    forward(cote + 30)
    cote = cote + 20

Le pseudocode de la procédure principale est

téléporter la tortue vers (-200, 0)
côté ← 40
pour _ allant de 0 à 3
    carre( )
    avancer de (côté + 30)
    côté ← côté + 20

fin du pour


Exercice 5

Le logiciel de géométrie dynamique choisi, est, ici, CaRMetal, parce qu’il permet de programmer la construction de la frise en français.

Dessin du motif 1

Un moyen simple d’avoir un triangle isocèle par script est de donner des coordonnées aux sommets d’icelui :

a = Point("A",0,1);
b = Point("B",0,-1);
c = Point("C",-3,0);
Polygone("motif1","A,B,C");

Mais pour être complet il faudrait fixer les sommets A, B et C, sinon, sous l’effet du Monkey, le triangle ne restera pas isocèle (l’effet est néanmoins intéressant).

Le motif 2

La transformation est la symétrie d’axe (AB), mais une translation aurait aussi pu faire l’affaire :

d = SymétrieAxiale("D",Droite("l1","A","B"),"C");
Cacher("l1");
Polygone("motif2","A,B,D");

La première ligne signifie simplement que D est le symétrique de C par rapport à la droite (AB), mais au passage cette droite a été nommée l1 pour pouvoir, à la ligne 2, la cacher.

La translation

Voici le script engendrant la frise, on peut aisément y lire le vecteur de la translation, même si on ne connaît pas par cœur la syntaxe des CaRSCripts :

répéter 4 fois {
	a = Translation("C","B",a);
	b = Translation("C","B",b);
	c = Translation("C","B",c);
	d = Translation("C","B",d);
	Polygone("_a,_b,_c");
	Polygone("_a,_b,_d");
}

On voit que le script a bien engendré la frise de l’énoncé :

Le pseudocode

En mettant CaRMetal en mode pseudo-code, les effets des translations successives se voient mieux :

répéter 4 fois {
   a ⟵ Translation("C","B",a);
   b ⟵ Translation("C","B",b);
   c ⟵ Translation("C","B",c);
   d ⟵ Translation("C","B",d);
}

Étranger

Le sujet comprenait un programme de calcul dans l’exercice 1 (la troisième question d’un « vrai ou faux justifié ») et un programme Scratch à compléter dans l’exercice 6 (la partie B).

Exercice 1

Encore un programme de calcul bourré d’implicites (à qui ajouter 5 ? à qui soustraire 9 ?) :

Choisir un nombre;
Ajouter 5;
Multiplier le résultat obtenu par 2;
Soustraire 9.

On devait dire si la fonction ainsi programmée coïncide avec 2x+1 (x étant le nombre choisi au départ). La réponse affirmative est donnée par Sofus :

Python

Pour aller plus loin, on peut aussi utiliser SymPy (calcul formel sous Python), qui possède une variable n de type formel, laquelle peut être utilisée comme valeur initiale du nombre, et l’affichage final de cette variable donne bien 2n+1 :


Exercice 6

Cet exercice n’est pas une bonne publicité pour Scratch : On dit que le robot est orienté vers le haut alors qu’il doit effectuer des parcours horizontaux dans le champ ; et le « costume » choisi pour le robot dans l’illustration ne le montre pas vu de haut, alors que son tracé est donné en vue aérienne.

On ne sait pas si les élèves doivent dessiner des blocs ou seulement écrire du texte, en tout cas on leur demande clairement d’« écrire un programme simple », même si c’est dans des définitions de fonctions.

Voici le corrigé avec Sofus :

Python

Le jour où un maraîcher voudra programmer un robot pour désherber ses tomates, il est peu probable qu’il le programme en Scratch. Python ayant plus le vent en cote, voici le script produit par SofusPy à partir des blocs ci-dessus :

from turtle import * 
def Motif_montant():
    forward(80)
    right(90)
    forward(1)
    right(90)

def Motif_descendant():
    forward(80)
    left(90)
    forward(1)
    left(90)

for count in range(24):
    Motif_montant()
    Motif_descendant()
forward(64)

Asie

Un exercice 3 très western avec le dessin dune étoile de sheriff (enfin, à 5 branches).

Remarque : L’énoncé commence par « Arthur doit écrire un programme avec Scratch » ce qui, une deuxième fois, montre que « programmation visuelle par blocs » signifie, quoique de façon officieuse, « Scratch et rien d’autre ». Étant donné que de façon officielle il ne fallait pas former des experts sur un outil particulier, on peut extrapoler au lycée, en imaginant que le langage Python, quoique non annoncé officiellement, sera présent et cité explicitement au bac dans les années qui viennent.

Question 1 : Pour dessiner l’étoile à 5 branches, il faut boucler 5 fois, ce qui n’est pas vraiment surprenant :

On remarque que Sofus, en épurant le script, permet de concentrer l’attention des élèves sur ce qui constitue le cœur du sujet et ne pas les distraire par des considérations hors sujet comme les effets de l’effaçage, les manipulations de stylo ou l’orientation par défaut du lutin/tortue...

Question 2 : Comme chaque branche de l’étoile est faite de deux parcours de 80 pixels chacun, le préimètre s’obtient en multipliant par 5 la somme 80+80. Là encore, pas de grosse surprise.

Question 3 : Pour dessiner l’étoile 2 fois plus grande, il faut que chaque longueur soit doublée, ce qui n’est pas vraiment surprenant non plus :

Métropole-Réunion

Le sujet est intéressant ici, pour 2 raisons : L’exercice 5 et son programme de calcul ; et l’exercice 6 avec un dessin fait avec Scratch.

Exercice 5

Le programme de calcul est si court qu’on se demande si ça vaut le coup de le placer dans un module de ce genre :

La réponse est oui : Le nombre en entrée est manipulable en dehors du module alors que les autres (variables locales du point de vue de la programmation fonctionnelle) sont constants du point de vue extérieur. L’affichage du résultat par flow974 se fait en utilisant une fonction identité :

On y lit la réponse à la question 1, mais une exploration plus poussée révèle qu’aucune entrée entière ne donne 30 en sortie. On passe donc à Sofus pour la suite :

Énoncé

Le programme est celui-ci :

• Choisir un nombre
• Multiplier ce nombre par 4
• Ajouter 8
• Multiplier le résultat par 2

On devine que c’est à la nouvelle valeur du nombre qu’on doit ajouter 8 ; encore un implicite...

Question 1

Traduit en Sofus, le programme donne ceci (version question 1) :

Du coup le nombre n’est plus un nombre mais une variable. Ce qui est normal puisqu’il varie...

Question 2

Pour résoudre la question 2, on décide, comme dans la suite du sujet, de nommer « x » le nombre choisi au départ :

On apprend au passage que le programme implémente une fonction affine, à savoir 8x+16. Ce résultat sera utile par la suite.

Pour résoudre l’équation, on écrit celle-ci en ajoutant « =30 » à l’expression obtenue, puis en résolvant l’équation obtenue :

Question 3

En développant 2(4x+8) on retrouve bien 8x+16 vus à la question précédente. Il reste alors à entrer B :

puis le développer :

Question 4

  • Il y a un gros manque dans l’énoncé à ce stade : Il n’est pas précisé dans quel ensemble on a choisi le nombre de départ. Si on cherche quand le résultat est nul, on constate que la proposition est vraie si l’ensemble ne contient aucun nombre inférieur à -2 :

La réponse est donc oui si le nombre de départ est entier naturel,non s’il est entier relatif, ou réel. On dit que N est un modèle de la proposition, alors que R n’en est pas un. Ce qui manquait à cet énoncé c’est donc la précision sur le modèle dans lequel on travaillait.

  • Là encore, on ignore, àla seule lecture de l’énoncé, si l’entier est naturel ou relatif. À moins que la divisibilité des entiers relatifs soit au programme de collège, on supposera donc que le nombre est naturel. Auquel cas la division par 8 donne encore un entier naturel ce qui conclut favorablement à la question :

Exercice 6

L’exercice consistait à dessiner des carrés et des triangles homothétiques avec ces fonctions :

Le script épuré (notamment de l’affectation, inévitable avec Scratch mais pas avec Sofus), donne ceci :

Ce script étant complet, donne un corrigé des questions 1 et 2 (hormis les coordonnées du lutin, qui se calculent par une division de 300 par 6 ; la difficulté n’est pas insurmontable). Pour la question 3, le rapport d’homothétie se calcule en soustrayant 1/3 à 1 et le rapport des aires, en calculant le carré d’une fraction. Là encore, il ne devrait pas y avoir de difficulté majeure.

Polynésie

Le sujet se clôt par un exercice comportant un programme de calcul. L’énoncé laisse un peu perplexe, avec « un script saisi par Alice dans un logiciel d’algorithmique ». En effet, un algorithme est défini comme « une suite finie et non ambiguë d’opérations ou d’instructions permettant de résoudre un problème », et là, on a du mal à imaginer un problème dont la solution serait fournie par le script d’Alice. Ensuite, le premier bloc du script demande au lutin d’attendre, ce qui n’est peut-être pas l’action la plus efficace pour résoudre un problème. Une fois l’attente terminée, le lutin envoie un message à tous, c’est-à-dire à lui-même vu qu’apparemment il est seul. Puis il modifie trois variables Nombre, Résultat1 et Résultat2 de manière un peu imprévisible (on dirait un mélange de modifications et d’affectations par des expressions algébriques). On proposera donc ici de tout faire comme programme de calcul (en fait, deux programmes en un) et plutôt que faire demander un nombre par un lutin, affecter directement le Nombre par 3 ou x selon la question.

Question 1

Puisqu’Alice a choisi la valeur 3, autant initialiser le Nombre à la valeur 3 :

Comme la variable Résultat1 dépend de la valeur initiale de Nombre, le programme de calcul représente de fait une fonction numérique (antécédent : Nombre, image : Résultat1) et l’image de 3 par cette fonction est 81.

Pour Résultat2, il en est de même :

Question 2 : Généralisation

Il suffit, dans un premier temps, de remplacer le nombre 3 par la lettre x dans les scripts précédents :

Question a

La fonction évoquée ci-dessus est du second degré :

Il s’agit de la fonction 4x²+12x+9 comme on peut d’ailleurs le retrouver en développant et réduisant (2x+3)².

Question b

De fait, le Résultat2 dépend du Nombre par la même fonction du second degré :

Question c : Quand est-ce que le Résultat2 vaut 9 ?

Si, comme dans les questions a et b, on appelle x la valeur initiale du Nombre, la valeur finale de Résultat2 est 4x²+12x+9. Cette expression est une expression (si si !). La fonction à laquelle il est fait allusion dans les questions a et b est une liaison entre les expressions x et 4x²+12x+9. Mais on peut également, à partir de l’exrpession 4x²+12x+9, fabriquer une équation en lui accolant « =9 » :

La question c demande ni plus ni moins que de résoudre cette équation.

Résolution de l’équation

Il suffit, au lieu d’afficher l’équation, d’afficher ses solutions :

Il semble, à vue de nez, que les deux solutions pourraient s’écrire plus simplement, en utilisant le fait que sqrt(144)=12. Les termes complexes sont donc respectivement 12/8=3/2 et son opposé. Les deux solutions sont donc -3/2-3/2=-3 et -3/2+3/2=0. Mais si le calcul formel de Sofus laisse un peu à désirer sur les équations du second degré, on peut retrouver plus facilement ces solutions, en constatant que dans l’équation, le terme +9 est présent dans les deux membres, et en choisissant de s’en passer, en enlevant le bloc « augmenter Résultat2 de 9 ». Cela aboutit à l’équation 4x²+12x=0 dont on aperçoit immédiatement que 0 est une solution. Alors on simplifie encore l’équation en divisant par x la valeur de Résultat2 ce qui donne la seconde solution :

Septembre

En Polynésie, Scratch (ou quelque chose de ressemblant) était utilisé pour résoudre une équation par balayage :

Une personne pratique le vélo de piscine depuis plusieurs années dans un centre aquatique à raison de deux séances par semaine. Possédant une piscine depuis peu, elle envisage d’acheter un vélo de piscine pour pouvoir l’utiliser exclusivement chez elle et ainsi ne plus se rendre au centre aquatique.
• Prix de la séance au centre aquatique : 15 €.
• Prix d’achat d’un vélo de piscine pour une pratique à la maison : 999 €.

Le but de l’exercice était de savoir à partir de combien de semaines l’achat du vélo deveint rentable. Avec ce genre de script :

On remarque que la boucle « jusqu’à » a été préférée à l’omniprésente « tant que », ce qui pour ce genre de problème, élimine Python.

Suggestion d’amélioration

Avec des noms de variables plus parlants le script devient plus compréhensible :

Ceci dit, la question était justement de deviner le rôle joué par la variable x dans le script de l’énoncé.


Le sujet de Métropole-Réunion-Antilles-Guyane comportait deux exercices sur la programmation : Le 5 avec des tracés de rectangles par Scratch, et le 6 avec un programme de calcul représenté par un graphe orienté, donc totalement propice à une approche par flow974.

Exercice 5

On remarque que le tracé d’un rectangle est effectué par une procédure (« définition de blocs ») et que les dimensions du rectangle sont des variables globales. Cela s’éloigne d’expériences menées avec Logo où les dimensions étaient fournies à la procédure.

Les dimensions du rectangle sont les variables globales longueur et largeur.

Question 2

Lorsque l’on exécute le programme, quelles sont les coordonnées du point d’arrivée et dans quelle direction est-on orienté ?

On constate une prise de distance par rapport au chat qui est devenu « on » et peut donc très bien être une tortue. C’est le choix qui est fait ici puisqu’on utilise Sofus avec sa concision accrue par rapport à Scratch.

L’orientation de la tortue est la même qu’au départ :

Quand à ses coordonnées, elles aussi sont redevenues celles du départ, comme on le voit si on dessine un repère :

Homothétie

Pour faire varier les variables, on utilise (dans l’énoncé) des expressions algébriques (produits) et des affectations :

Par exemple, pour augmenter la valeur de la longueur,

  • on lit sa valeur actuelle longueur
  • on calcule le produit de cette valeur par 1,3 (longueur×1,3)
  • on remplace le contenu de longueur par le produit effectué.

En terminale voire après, cette suite d’opérations est compliquée. Il est intéressant de comparer avec la version Sofus :

De fait, c’est probablement parce que Scratch n’a pas d’équivalent de « multiplier par » que la version avec expressions algébriques a été choisie dans l’énoncé, à en juger par le choix fréquent de « augmenter de » dans d’autres sujets : On fait au mieux avec ce qu’on a, et les affectations par expressions algébriques ne sont pas forcément ce qu’ily a de mieux.

Sofus permet même de donner un aspect statistique à l’homothétie :

Exercice 6

La version flow974 ressemble quand même beaucoup à l’énoncé :

Comment on a fait

Dans flow974, il faut un nombre (celui que l’on choisit, que l’on positionnera à 1 selon la consigne), un « module » implémentant la fonction B, et un affichage (en l’occurrence une fonction identité qui affiche son entrée). Une fois le nombre créé (à gauche ci-dessous) on a cliqué sur « fonction » pour voir apparaître le module lequel s’appelle, pour l’instant, « module » :

En cliquant sur « edit » on peut renommer le module (B, pour des raisons qui apparaitront plus bas) et mettre dedans, une entrée (« x » par cohérence avec la suite de l’exercice) et une sortie. Mais le premier bloc dont on a besoin est le triple de x, et du coup il faut à nouveau, à l’intérieur de B, créer un module qui s’appellera triple. Son entrée est nommée nombre et sa sortie triple [3]. Comme le triple du nombre est son produit par 3, on ajoute le nombre 3 et un multiplicateur :

En enregistrant ce module, on aperçoit ceci :

Comme on aura aussi besoin, plus tard, de doubler le nombre, on répète les opérations ci-dessus, avec la multiplication pa 2 cette fois-ci :

Une fois enregistré ce nouveau module, on complète avec les additions et soustractions nécessaires et la sortie :

Enfin, on enregistre le module B et il suffit de modifier la valeur de x pour lire celle du nombre envoyé en sortie :

Sofus et le calcul formel

La programmation du programme de calcul avec Sofus permet aussi de vérifier que, si le nombre choisi est 1, on récupère -15 en sortie :

Mais si, au lieu de 1, on laisse « x », on a l’expression formelle du nombre de sortie, en fonction de x :

Comme le développement de l’expression B donne le même résultat que le programme de calcul, on a la réponse à la question 2 :

Et même, de façon similaire, la réponse à la question 3 :

Amérique du Sud

Le sujet comportait deux exercices sur la programmation : Le 3 avec des programmes de calcul, et le 6 avec des frises en Scratch.


Exercice 3

L’exercice portait sur des programmes de calcul (affines) donnant en fait les mêmes réponses pour tout nombre choisi en entrée.

Voici le programme 1 décrit dans l’énoncé :

• Soustraire 5
• Multiplier par 4

et en version flow974 :

et le programme 2, dans l’énoncé :

• Multiplier par 6
• Soustraire 20
• Soustraire le double du nombre de départ

puis en version flow974 [4] :

Une fois qu’on a enregistré dans flow974, ces deux fonctions, on peut y entrer un même nombre et faire suivre chacune d’entre elles d’un bloc « identité » (qui affiche le résultat comme le ferait une monade d’haskell) :

Ensuite, pour répondre à la question 2, il suffit de remplacer le nombre d’entrée par -2 :

Cela amène à conjecturer que les deux fonctions n’en seraient en réalité qu’une, et la suite de l’exercice consiste à renforcer puis prouver cette conjecture.

Ce n’est pas Scratch qui a été choisi pour réaliser les programmes de calcul, mais le tableur. Pourtant, avec Sofus, on a vite les réponses, surtout si on décide d’appeler x le fameux nombre choisi en entrée :

La version simplifiée du Programme 1 est 4x-20 :

Et la version simplifiée du programme 2 est aussi 4x-20 :

Ce qui prouve la conjecture émise par Lucie.


Exercice 6

Un chat devait dessiner le motif suivant :

La tortue de Sofus semble aussi douée que le chat pour ce faire. Et elle fait ceci :

La question portait sur la distance entre les motifs, celle-ci est donc de 60. Et si on avait mis 40, on aurait obtenu ceci :

Pour avoir un motif triangulaire, on pouvait faire ainsi :

Remarquer que la question sur la distance admettait plusieurs réponses correctes, l’objet étant de dessiner un triangle sans que ses dimensions soient précisées. Mais avec les données ci-dessus, on trouve un dessin relativement conforme au début de l’énoncé :

Mais toute valeur multiple de 3 convenait pour a, et toute valeur positive convenait pour b. Seul c devait nécessairement être de 120 (encore qu’en ajoutant un multiple de 360 on ne voyait pas la différence non plus).

Nouvelle-Calédonie

L’exercice 8 du sujet faisait faire des dessins par un chat.

Le script 1 de l’énoncé comportait 7 blocs. La version Sofus n’en comporte que 4 :

Les deux scripts donnent ce dessin (à faire à la main sur la feuille) :

Le script 2 de l’énoncé totalise pas moins de 9 blocs ; la version Sofus n’en prend que 6 :

Quels sont les 3 blocs que Sofus permet d’économiser ? Le drapeau vert, l’orientation du lutin au départ, et la gestion du stylo, levé par défaut [5].

Le dessin obtenu est celui-ci :

Alors que pour avoir ce dessin :

Il fallait ce script :


[1La première étape de chacun des programmes A et B est de « choisir un nombre »

[2en réalité cette fonction est une procédure, puisqu’il n’y figure pas de ligne commençant par return. De plus elle n’a pas d’antécédent puisque les parenthèses sont vides.

[3Abréviation pour triple du nombre, le nom triple désigne également autre chose, à

savoir la fonction qui, au nombre, associe son produit par 3.

[4La complexité de ce dessin laisse penser que cet exemple contredit l’adage « un dessin vaut mieux qu’un long discours ». En fait, l’énoncé textuel est plus long qu’il n’y paraît, puisque celui-ci ne précise pas à qui on doit soustraire 20 et de qui on doit soustraire le nombre de départ.

[5Le drapeau vert est souvent inutile sous Scratch aussi, il suffit de cliquer sur un bloc pour l’exécuter. La calculatrice Casio oriente la tortue mieux que Scratch, par défaut, mais dans sa version actuelle, elle lève le stylo au départ. Ce qui est améliorable.


Documents joints

PDF - 127.9 kio
PDF - 127.9 kio

Portfolio

PNG - 47.6 kio PNG - 22.4 kio

Commentaires