====== L'entrepôt et le robot cariste ======
{{:nsi:tds:cariste.png?nolink&200 |}}
Cet exercice permet de réviser les fondamentaux de la programmation.
On utilise une animation représentant un robot qui manipule des caisses dans un entrepôt.
Je vous fourni le fichier {{ entrepot.py |}} qui permet à l'animation de fonctionner. Vous n'avez pas besoin de connaître ou comprendre le détail du contenu de ce fichier. Il vous suffit de savoir comment vous en servir.
===== Le module =====
==== Exemple d'utilisation ====
Pour résoudre un problème, vous allez définir un script python, par exemple ''%%script.py%%''. Ce script initialise l'animation et fait déplacer une caisse au robot.
On utilise souvent le mot //script// pour désigner un programme dans le cas de langages interprétés comme Python. L'idée est que l'intégralité du programme tient en un fichier très simple qui tiendrait sur une feuille de papier. On n'utiliserait pas le terme //script// pour un gros programme.
# script.py
from entrepot import robot, docks
robot.set_speed(10)
docks.set_sortie(9)
docks.set_caisses([2, 3, 2, 0, 0, 0, 5])
robot.prendre()
robot.droite()
robot.poser()
robot.fin()
Pour que cela fonctionne vous **devez** enregistrer votre script et placer ''entrepot.py'' dans le même dossier que ''script.py''.
==== Explications ====
* **ligne 2 :** on importe les objets ''robot'' et ''docks'' du module fourni. ''robot'' représente le robot et ''docks'' l'ensemble des compartiments.
* **lignes 4-6 :** on définit les propriétés de l'entrepôt en indiquant comment sont réparties les caisses, où est la rampe de sortie...
* **lignes 8-10 :** le robot fait ce qu'il a à faire...
* **ligne 12 :** cette ligne permet de maintenir l'affichage de l'animation quand le programme est fini.
==== Les commandes disponibles ====
=== Concernant le robot ===
robot.position # donne la position du robot
robot.gauche() # déplace le robot d'un compartiment à gauche
robot.droite() # déplace le robot d'un compartiment à droite
robot.prendre() # le robot prend l'éventuelle caisse située en-dessous de lui
robot.poser() # le robot pose la caisse qu'il tient dans le compartiment
robot.set_speed(10) # définit la vitesse d'animation. Ajustez selon la puissance du PC
=== Concernant les docks ===
docks.taille # nombre de compartiments
docks.sortie # position du dock de sortie, -1 s'il n'y en a pas
docks.occupation(i) # nombre de caisses dans le compartiment i
# compartiment courant si i pas précisé
docks.est_plein(i) # indique si le compartiment est complètement rempli
# compartiment courant si i pas précisé
docks.est_vide(i) # indique si le compartiment est vide
# compartiment courant si i pas précisé
docks.est_sortie(i) # indique si le compartiment est une rampe de sortie
# compartiment courant si i pas précisé
=== Aide ===
En console, après une première exécution, vous pourrez écrire :
>>> help(docks)
Vous verrez alors s'afficher l'aide indiquant toutes les fonctions utiles concernant ''docks''. Idem pour ''robot''.
===== Les problèmes =====
Les problèmes suivants sont progressifs.
Si vous implémentez une fonction dans l'un des problème, elle pourra resservir dans un autre.
Si vous avez déjà de bonnes notations de programmation, il est très probable que vous produisiez dès le début un programme pouvant répondre à plusieurs problèmes. C'est très bien. Les problèmes sont très découpés pour permettre à tous une progression en douceur.
==== Problème 1 ====
# problème 1
from entrepot import robot, docks
robot.set_speed(10)
docks.set_sortie(9) # rampe de sortie dans le compartiment 9
docks.set_caisses([1]) # 1 caisse dans le compartiment 0
# amener la caisse à la rampe de sortie
==== Problème 2 ====
# Problème 2
from entrepot import robot, docks
robot.set_speed(10)
docks.set_sortie(9)
docks.set_caisses([5]) # 5 caisses dans le compartiment 0
# amener les 5 caisses à la rampe de sortiesortie.
> Dans cette nouvelle version du problème, on peut bien sûr faire 5x la même chose que dans le problème 1, mais l'utilisation d'une boucle serait plus judicieuse.
==== Problème 3 ====
# Problème 3
from entrepot import robot, docks
from random import randrange # pour générer entier à aléatoire
robot.set_speed(10)
docks.set_sortie(9)
docks.set_caisses([randrange(1, 5)]) # nombre de caisses aléatoire dans le compartiment 0
# amener les N caisses à la rampe de sortie
> À présent, au moment de programmer, on ne sait pas combien il y aura de caisses dans le compartiment 0. Il faut donc programmer de façon plus générale.
> Pensez à exécuter votre programme plusieurs fois pour voir s'il fonctionne pour différentes situations.
==== Fonction 1 ====
La suite nécessite de savoir ce qu'est une fonction. Vous pouvez poursuivre si vous savez déjà, sinon il faudra y revenir plus tard dans le cours.
Écrire une fonction ''%%aller_au_compartiment(i)%%'' qui fait aller le robot au compartiment ''%%i%%'', quelque soit le compartiment où il se trouve actuellement.
==== Problème 4 ====
# Problème 4
from entrepot import robot, docks
robot.set_speed(10)
docks.set_sortie(9)
docks.set_caisses([0, 2, 3])
# amener toutes les caisses à la rampe de sortie
==== Problème 5 ====
# Problème 5
from entrepot import robot, docks
from random import randrange
robot.set_speed(10)
docks.set_sortie(9)
docks.set_caisses([randrange(5) for i in range(4)]) # état des compartiments aléatoire...
# amener toutes les caisses à la rampe de sortie
==== Problème 6 ====
Pour résoudre ce problème, il sera préférable que vous écriviez les fonctions suivantes :
* ''%%compartiment_max()%%'' qui renvoie le numéro de compartiment contenant le plus de caisses.
* ''%%compartiment_min()%%'' qui renvoie le numéro de compartiment contenant le moins de caisses.
# Problème 6
from entrepot import robot, docks
from random import randrange # pour générer entier à aléatoire
robot.set_speed(10)
docks.set_max(10) # augmente la capacité des compartiments
docks.set_caisses([randrange(10) for i in range(20)])
# égaliser la hauteur des caisses dans les compartiments
> Attention, pas de rampe de sortie dans cet exercice. On déplace les caisses d'un compartiment à l'autre afin d'égaliser les hauteurs.