Skip to content

Commit

Permalink
ajout l'implémentation scratch du tri à bulles
Browse files Browse the repository at this point in the history
  • Loading branch information
sdpython committed Mar 31, 2015
1 parent 4f4f04e commit 652159d
Show file tree
Hide file tree
Showing 20 changed files with 196 additions and 7 deletions.
9 changes: 7 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@



.. _l-README:

Expand All @@ -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.
Expand All @@ -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
2 changes: 2 additions & 0 deletions _doc/sphinxdoc/source/programmation/index_programmation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Sujets
:maxdepth: 1

parcours_echiquier
tri_scratch


Indices et solutions
Expand All @@ -56,6 +57,7 @@ Indices et solutions
:maxdepth: 1

parcours_echiquier_correction
tri_scratch_correction



Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
123 changes: 123 additions & 0 deletions _doc/sphinxdoc/source/programmation/tri_scratch.rst
Original file line number Diff line number Diff line change
@@ -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.

43 changes: 43 additions & 0 deletions _doc/sphinxdoc/source/programmation/tri_scratch_correction.rst
Original file line number Diff line number Diff line change
@@ -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.
5 changes: 5 additions & 0 deletions _doc/sphinxdoc/source/sanso_algo/tri.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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**

Expand All @@ -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`.




Expand Down
6 changes: 5 additions & 1 deletion _doc/sphinxdoc/source/sanso_algo/tri_solution.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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`.



Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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):
Expand Down
4 changes: 2 additions & 2 deletions src/code_beatrix/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
3 changes: 2 additions & 1 deletion src/code_beatrix/scratchs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
1 change: 1 addition & 0 deletions src/code_beatrix/scratchs/example_echiquier/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
basic checking
"""


def check_echiquier():
"""
basic checkings
Expand Down
4 changes: 4 additions & 0 deletions src/code_beatrix/scratchs/example_tri/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
basic checking
"""


def check_tri():
"""
basic checkings
Expand All @@ -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.