SofusPy, une passerelle entre programmation visuelle et Python

mardi 6 juin 2017
par  Alain BUSSER , Patrick RAFFINAT

Cet outil permet

  • de programmer par blocs, comme avec Scratch mais en ligne ;
  • de programmer en Python (langage) en ligne ;
  • d’engendrer automatiquement le code Python à partir des blocs.

Cette passerelle entre Sofus (les blocs) et Python (le « code ») s’inscrit donc pleinement dans les programmes apparus en Seconde à la rentrée 2017.

A) Introduction

SofusPy est une extension mathématique de Blockly hébergée par l’IREM de la Réunion, tout comme l’extension tableur évoquée à la fin de l’article. Ces deux extensions sont accessibles à partir d’une page web créée pour l’occasion : https://irem.univ-reunion.fr/blockl.... SofusPy peut aussi être utilisé localement sans connexion à internet, contrairement à l’extension tableur qui communique avec un serveur.

Installation locale de SofusPy

SofusPy reprend plusieurs caractéristiques fondamentales de Sofus (voir article) : des blocs pour transformer des variables (augmenter/diminuer, augmenter/diminuer d’une proportion...), des blocs pour manipuler une ou plusieurs tortues... Sa nouveauté est l’ajout d’un traducteur vers Python, ainsi que d’un interpréteur Python (Skulpt), ce qui permet de faciliter l’apprentissage de Python pour des élèves formés à la programmation par blocs au collège.

B) De Sofus vers Python

Exercice 1

Après avoir augmenté de 20%, le prix d’un article diminue de 10%. Est-il vrai que l’augmentation globale de son prix est 10% ?

Pour vérifier ou infirmer cette hypothèse, on peut écrire le programme suivant :

Le prix initial de l’article est arbitrairement fixé à 80 €, mais il peut facilement être changé grâce à une variable nommée « prix ». Pour introduire cette variable et lui affecter une valeur, on peut procéder ainsi :

  • cliquer sur le menu Variables, puis choisir le bloc « fixer element à » et l’amener sur le plan de travail.
  • cliquer sur le nom « element » de la variable, puis choisir « créer une variable » et nommer celle-ci « prix ».
  • cliquer sur le menu Math, afin de sélectionner le bloc représentant les constantes (initialement 0) et de l’attacher au bloc « fixer ».
  • remplacer la constante 0 par 80

Les deux blocs suivants, permettant d’augmenter et de diminuer la variable d’un pourcentage, illustrent l’apport de Sofus par rapport à la version standard de Blockly. Ils sont disponibles dans le sous-menu sofus du menu Math. Le dernier bloc, qui affiche la valeur de la variable « prix », est disponible dans le menu Entrées-sorties.

Il ne reste plus qu’à exécuter le programme (bouton Exécuter) qui affiche alors « 86.4 ». Ceci donne la réponse au problème : l’augmentation globale n’est pas de 10%, car sinon l’affichage serait 88 €.

On aurait aussi pu faire la vérification en transformant le programme Blockly en un programme Python :

  • cliquer sur le bouton Editeur, ce qui fait apparaître la traduction Python dans un éditeur de texte et masque le programme Blockly
  • cliquer sur le bouton Exécuter

Pour faire réapparaître le programme Blockly, il suffit de cliquer sur le bouton Blockly. Mais attention : si vous avez modifié le programme Python sans le sauvegarder, vous le perdrez.

Voici le code Python engendré :

prix = None
element = None
prix = 80
prix = prix + prix * 20 / float(100)
prix = prix - prix * 10 / float(100)
print(prix)

Amélioration du code Python :

0n peut non seulement exécuter le code Python, mais aussi le modifier : « C’est en pythonnant qu’on devient Python », dit un vieux proverbe Jedi !

Voici une amélioration possible du script précédent :

prix = 80
prix = prix + prix * 20 / float(100)
prix = prix - prix * 10 / float(100)
print(prix)

La conversion de l’entier 100 en réel est nécessaire pour l’interpréteur Python, qui implémente Python 2 : en effet, l’expression 20/100 serait évaluée à 0 (division entière), contrairement à Python 3 qui l’évalue à 0.2 (division réelle). Si vous n’appréciez pas la notation float(100), vous pouvez la remplacer par 100.0

Exercice 2

Est-ce que 50 augmentations successives de 1% donnent une augmentation globale

de 50% ?

de moins que 50% ?

de plus que 50% ?

Pour répondre à cette question, on peut fixer le prix initial à 100 €, puis répéter 50 augmentations de 1% à l’aide d’une boucle :

L’exécution du script montre que l’augmentation globale est d’environ 64,46% et le script Python obtenu, une fois épuré des premières lignes superflues, montre la syntaxe des boucles dans Python :

prix = 100
for count in range(50):
    prix = prix + prix * 1 / float(100)
print(prix)

De quel pourcentage doit-on alors augmenter 50 fois de suite un prix, pour que l’augmentation globale soit 50% ? Il est facile de remplacer dans le script Python 1 par d’autres nombres, jusqu’à ce que le résultat affiché soit proche de 150 € (au centime près par exemple).

Intégrale

Cet exercice s’inspire du Capes 2017 : l’aire d’un quart de disque est égale à l’intégrale ∫01√(1-x²)dx.

Cela fournit un moyen de « calculer π » : on multiplie par 4 cette intégrale, après avoir évalué celle-ci par la méthode des rectangles. Cela permet également de montrer comment on programme une fonction dans Blockly ou dans Python.

Définition de la fonction avec Blockly

Il y a dans le menu Sous-programmes un bloc permettant de définir une fonction [1]. Après l’avoir introduit dans le plan de travail, il faut cliquer sur la roue dentée et ajouter un paramètre que nous nommerons « t » (et pas « x » [2]) :

Un nouveau clic sur la roue dentée permet de fermer la bulle. Pour finir, on fabrique une expression algébrique en cherchant et assemblant des blocs du menu Math, et on greffe cet arbre sur l’entrée « retourner » :

Utilisation de la fonction avec Blockly

La définition de la fonction « f » fait apparaître dans le menu Sous-programmes un nouveau bloc (« f avec t ») qu’il faut glisser dans le programme implémentant la méthode des rectangles :

Pour calculer l’intégrale de f entre 0 et 1 :

  • on initialise la variable x à 0 (borne inférieure de l’intégrale) ;
  • on initialise I (variable représentant l’intégrale) à 0 ;
  • on boucle jusqu’à ce que x dépasse 1 (borne supérieure de l’intégrale) ; dans cette boucle :
    • on augmente I de f(x)×dx, et
    • on augmente x de dx.

En fait, dx est une constante mais elle est traitée ici comme une variable (histoire qu’elle ait un nom). Il ne reste plus qu’à quadrupler l’intégrale à la fin pour calculer une valeur approchée de π.

Python

L’export en Python donne ce script (une fois un peu allégé) :

import math

def f(t):
    return math.sqrt(1 - t ** 2)

dx = 0.0025
x = 0
I = 0
while not x >= 1:
    I = I + f(x) * dx
    x = x + dx
print(I * 4)

Maintenant on peut relancer le programme après avoir changé la valeur de dx, pour voir l’effet produit sur la vitesse d’exécution et la précision.

On peut comparer avec ce TP qui a été donné, sur ce sujet, en première année de BTS SN :

Et, « pour aller plus loin », on peut modifier le script pour qu’il utilise le module decimal et calcule sur un plus grand nombre de chiffres. Mais on ne peut pas l’exécuter avec l’interpréteur Python de SofusPy, car il ne gère pas ce module.

Spirale

Sofus et Python ont autre chose en commun : la tortue.

Voici comment celle de Sofus peut dessiner une spirale logarithmique :

L’export en Python donne ce script (une fois un peu allégé) :

from turtle import * 
reset()
L = 40
for count in range(200):
    left(15)
    forward(L)
    L = L - L * 5 / float(100)

Si on exécute le programme par blocs, l’affichage de la spirale est instantané alors qu’on voit la tortue se déplacer en exécutant le code Python.

C) Une autre extension disponible : tableur Xcas

Il est aussi possible d’utiliser des transformations Sofus dans l’extension tableur Xcas, une autre extension hébergée par l’IREM de la Réunion. Cette extension [3], composante de la suite logicielle Mathém@ALGO, a été isolée afin d’en simplifier l’ergonomie et d’en faciliter la diffusion.

Elle propose des blocs permettant de lire et d’écrire dans un tableur. Le bouton Demo permet d’en télécharger un exemple caractéristique, qui calcule la moyenne de données stockées dans le tableur. Un plus de la version hébergée par l’IREM de la Réunion est qu’on peut en obtenir la traduction en Javascript (bouton Editeur) et ainsi faciliter l’apprentissage de ce langage, y compris avec des applications interagissant avec le tableur.

Cette extension peut également être utilisée pour combiner Blockly et calcul formel (voir article).


Pour aller vers SofusPy, cliquer sur le QR-code ci-dessous (ou le flasher) :


[1En fait il y en a 2, mais un seul « retourne » une valeur, et c’est ce qu’est censé faire une fonction. L’autre est une procédure.

[2On aura besoin, tout-à-l’heure, d’une variable nommée « x », pour calculer l’intégrale par la méthode des rectangles.

[3L’extension Xcas a déjà été décrite ici et (dans les deux cas, à la fin de l’article)


Erreur d’exécution plugins/auto/sarkaspip/v4.1.0/noisettes/document/inc_images_jointes.html

Commentaires

Navigation

Articles de la rubrique

  • SofusPy, une passerelle entre programmation visuelle et Python