Permalink
Browse files

ajout l'implémentation scratch du tri à bulles

  • Loading branch information...
sdpython committed Mar 31, 2015
1 parent 4f4f04e commit 652159d83f7e3777ff23a8da724a321ccdd71813
View
@@ -1,4 +1,4 @@
.. _l-README:
@@ -23,6 +23,9 @@ README / Changes
Description
-----------
Exercices pour découvrir la programmation et les algorithmes.
Ceux-ci peuvent servir de base pour organiser un
`coding goûter <http://www.frenchtechtoulouse.com/coding-gouter-toulouse-apprendre-coder-en-samusant/>`_
Exercises to learn programming, algorithms for Coding Snacks.
Language: French.
@@ -39,5 +42,7 @@ Started in 2015/03.
Versions
--------
* **0.5 - 2015/??/??**
* **ajout:** ajout d'un code illustrant le tri à bulles sous Scratch (avec personnage animé)
* **0.1 - 2015/03/25**
* **new:** first version
* **nouveau:** première version
@@ -47,6 +47,7 @@ Sujets
:maxdepth: 1
parcours_echiquier
tri_scratch
Indices et solutions
@@ -56,6 +57,7 @@ Indices et solutions
:maxdepth: 1
parcours_echiquier_correction
tri_scratch_correction
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,123 @@
.. issue.
.. index:: énoncé, tri, scratch
.. _l-prog_tri:
Réaliser un tri sous Scratch
============================
A partir de 10 ans.
L'objectif de l'exercice est d'implémenter un tri avec Scratch
et ainsi de découvrir qu'un programme Scratch ne fonctionne pas
tout-à-fait pareil qu'un programme Python. La difficulté
est de faire en sorte que le tri soit accompagnée d'une animation avec
des personnages qui jouent à saute-mouton.
La mise en scène est très réduite car c'est un exercice plutôt solitaire
à moins de se partager un grand écran.
Trier un tableau sous scratch
+++++++++++++++++++++++++++++
.. s-tri_bulle_wiki:
L'algorithme à implémenter est le `tri à bulle <http://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles>`_
qui est abordé d'un point de vue algorithmique par cet :ref:`énoncé <s-tribulle>`
(et sa :ref:`correction <s-tri_bulle_sole>`). Je reproduis ici la description
de l'algorithme donnée par wikipedia : ::
procédure tri_bulle(tableau t)
n = longueur(t)
pour i allant de n-1 à 1 pas -1 faire
pour j allant de 1 à i pas 1 faire
si (t[j] > t[j+1]) alors
tmp = t[j]
t[j] = t[j+1]
t[j+1] = tmp
fin si
fin pour
fin pour
fin procédure
Tout d'abord on plante le décor avec le
tableau à trier :
.. image:: tri_bulle_debut.png
Les personnages qui vont jouer à saute-mouton :
.. image:: tri_bulle_perso.png
Et les voilà qui jouent à saute-mouton :
.. image:: tri_bulle_perso2.png
Pour cet exercice, il suffit de compléter le projet
:download:`bubble_sort0.sb2 <../../../../src/code_beatrix/scratchs/example_tri/bubble_sort0.sb2>`.
Les images ci-dessus sont extraites de ce projet. Il ne reste plus qu'à implémenter le
tri dans le code du premier personnage.
Le projet n'est pas vide. Chaque personnage saute et revient en arrière
lorsqu'on clique sur lui excepté le premier. Lorsqu'on clique dessus,
il replace tous les objets à leur position initiale.
.. image:: tri_bulle_tri.png
Avant de commencer, il faut expliquer une astuce qui permet de faire bouger les
personnages. Chacun à sa vie propre : en langage informatique, on dit
qu'ils ont chacun leur `thread <http://fr.wikipedia.org/wiki/Thread_%28informatique%29>`_.
Sous Scratch, il est facile de les faire rebondir, de détecter les collisions,
mais de les faire réagir avec un tableau... C'est plus difficile.
L'idée est de s'occuper de trier le tableau. Lorsque celui-ci change,
on envoie un message à tous les personnages et ceux-ci réagissent
ou non en le recevant. Par exemple, voici les deux actions
qu'un personnage effectue lorsqu'il reçoit les messages *avance50*, *recule50*
(50 étant la valeur du tableau à déplacer).
.. image:: tri_bulle_message.png
Chaque personnage s'attend à recevoir deux messages différents
pour chaque personnage car chacun représente une valeur différente
du tableau.
Trier un tableau sous scratch, version 2
++++++++++++++++++++++++++++++++++++++++
J'attendrai les prochaines versions de Scratch pour la réaliser.
L'inconvénient aujourd'hui est qu'a priori, on peut détecter qu'un personnage
en a touché un autre en particulier. On peut savoir si le chat
a touché le ballon. Mais s'il y a deux ballons, on ne peut pas
demander si le chat a touché un des deux ballons et demander
quel ballon a été touché. Quand cela sera possible... alors j'ajouterai
une seconde solution.
Solution
--------
Voir :ref:`l-prog_tri_sol`.
A quoi ça sert ?
----------------
Tous les langages de progammation (excepté Scratch) ont une fonction
qui trie les éléments d'un tableau. Alors pourquoi ?
Dans certaines configurations, il est préférable de reprogrammer son propre tri
car il sera plus rapide qu'une fonction toute faite simplement
parce qu'on a une information qu'on peut utiliser alors que la fonction
standard ne le peut pas.
Par exemple, si on doit trier un tableau dont 90% des valeurs sont égales à 0
et que toutes les autres valeurs sont strictement positives. On peut s'en servir
pour accélérer le tri.
@@ -0,0 +1,43 @@
.. issue.
.. index:: solution, tri, scratch
.. _l-prog_tri_sol:
Réaliser un tri sous Scratch (solution)
=======================================
A partir de 10 ans.
Trier un tableau sous scratch
+++++++++++++++++++++++++++++
La solution peut être trouvée dans le code du premier personnage du projet
:download:`bubble_sort.sb2 <../../../../src/code_beatrix/scratchs/example_tri/bubble_sort.sb2>`.
.. image:: tri_bulle_sol.png
Ce code est la traduction de l'algorithme
décrit par :ref:`wikipedia <s-tri_bulle_wiki>`.
On trouve les deux boucles, le test qui définit
quand deux éléments doivent être échangés, soit deux parties.
.. image:: tri_bulle_p1.png
La première envoie des messages aux personnages pour leur dire
de prendre les positions correspondant à celle du tableau une fois
celui-ci modifié.
.. image:: tri_bulle_p2.png
La seconde échange deux valeurs du tableau. En informatique, il n'existe pas
toujours de fonction toute prête pour échanger. Il faut alors le faire soi-même.
Echanger deux valeurs d'un tableau revient à échanger les contenus de deux tiroirs :
#. il en faut en troisième où on met d'abord le contenu du premier tiroir,
#. ensuite on déplace le contenu du second tiroir dans le premier,
#. enfin on remet contenu du troisième tiroir (en fait l'ancien premier) dans le second tiroir.
@@ -58,6 +58,8 @@ Comment faudrait-il faire ?
Les exercices suivant peuvent être fait à plusieurs ou seul en
plaçant les cartes à plat sur une table.
.. _s-tribulle:
**remettre de l'ordre**
@@ -75,6 +77,9 @@ cartes avec ses voisins si elles ne sont pas dans le bon ordre.
Ce tri correspond au `tri à bulles <http://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles>`_.
Pourquoi à votre avis ?
Une illustration de ce tri sous Scratch est
décrite au paragraphe :ref:`l-prog_tri`.
@@ -29,6 +29,8 @@ sont vite repérées.
Méthode systématique de tri
---------------------------
.. _s-tri_bulle_sole:
Avec mille carte, c'est plus difficile. Le premier tri proposé correspond aux tri à bulles.
Pour comprendre, il faut s'intéresser à la carte la plus haute.
@@ -37,7 +39,9 @@ Pour comprendre, il faut s'intéresser à la carte la plus haute.
Les cartes jouent à saute-mouton. Les petites passent en dessous, les plus grandes au-dessus.
Au final, tout le monde finit par trouver sa place.
Une illustration de ce tri sous Scratch est
décrite au paragraphe :ref:`l-prog_tri`
et sa solution :ref:`l-prog_tri_sol`.
View
@@ -50,7 +50,7 @@
subversion = 1
project_var_name = "code_beatrix"
sversion = "0.1"
sversion = "0.5"
versionPython = "%s.%s" % (sys.version_info.major, sys.version_info.minor)
path = "Lib/site-packages/" + project_var_name
readme = 'README.rst'
@@ -86,6 +86,7 @@
packages = find_packages('src', exclude='src')
package_dir = {k: "src/" + k.replace(".", "/") for k in packages}
package_data = {project_var_name + ".scratch.example_echiquier": ["*.sc2"],
project_var_name + ".scratch.example_tri": ["*.sc2"],
}
if os.path.exists(readme):
@@ -8,10 +8,10 @@
if sys.version_info[0] < 3:
raise ImportError("pyensae only works with Python 3")
__version__ = "0.1"
__version__ = "0.5"
__author__ = "Xavier Dupré"
__github__ = "https://github.com/sdpython/code_beatrix"
__url__ = "http://www.xavierdupre.fr/app/code_beatrix/helpsphinx/index.html"
__url__ = "http://lesenfantscodaient/"
__downloadUrl__ = "http://www.xavierdupre.fr/site2013/index_code.html#code_beatrix"
__license__ = "BSD License"
@@ -7,9 +7,10 @@
from .example_echiquier import check_echiquier
from .example_tri import check_tri
def check():
"""
run checking functions
"""
check_echiquier()
check_tri()
check_tri()
@@ -2,6 +2,7 @@
basic checking
"""
def check_echiquier():
"""
basic checkings
@@ -2,6 +2,7 @@
basic checking
"""
def check_tri():
"""
basic checkings
@@ -10,3 +11,6 @@ def check_tri():
f1 = os.path.exists(dirname, "bubble_sort.sb2")
if not os.path.exists(f1):
raise FileNotFoundError(f1)
f2 = os.path.exists(dirname, "bubble_sort0.sb2")
if not os.path.exists(f2):
raise FileNotFoundError(f2)
Binary file not shown.

0 comments on commit 652159d

Please sign in to comment.