TP - Tri de crêpes☘
Téléchargez le fichier « à trous » TPG02.21.py
(clic droit -> [Enregistrer la cible du lien sous]) et enregistrez-le dans
ce dossier.
Consignes communes à chaque partie
Le programme principal contient un appel au module doctest :
##----- Programme principal et tests -----##
if __name__ == '__main__':
import doctest
doctest.testmod()
Il faudra aussi ajouter vos propres tests dans le «
main »
afin de vous entraîner à en réaliser.
Exposé du problème☘
Il s 'agit de trier une pile de crêpes afin qu'elles soient empilées de la plus large (en bas)
à la plus étroite (au-dessus). Pour cela, la seule opération autorisée est de retourner
la partie supérieure de la pile à l'aide d'une spatule, spatule que l’on peut placer sous l’une des crêpes.
Algorithme☘
-
On place la spatule sous la plus grande crêpe :

-
On retourne la partie supérieure :

-
On place la spatule sous la pile de crêpes :

-
On retourne la partie supérieure : la plus grande crêpe est dessous.

-
On considère la pile de crêpes restantes (c’est-à-dire toutes sauf celle qu’on vient de placer correctement). On place la spatule sous la plus grande crêpe de la pile restante.

-
On retourne la partie supérieure :

-
On place la spatule sous la pile de crêpes (hormis celles déjà triées) :

-
On retourne la partie supérieure : la plus grande crêpe est placée.

-
On recommence jusqu’à trier l’intégralité de la pile...

Partie 1 : Maximum jusqu'à☘
Complétez le corps de la fonction indice_du_maxi_jusqu_a() qui prend en paramètre un tableau tab et un indice i d'un élément de ce tableau.
Cette fonction renvoie l'indice de l'élément de plus grande valeur parmi les éléments tab[0], tab[1], ..., jusqu'à tab[i] inclus.
1 2 3 4 5 6 7 8 9 10 11 | |
Partie 2 : Renverser jusqu'à☘
L’algorithme de tri crêpe doit renverser l'ordre des valeurs contenues dans un tableau entre les indices 0 et i (inclus).
Avant de pouvoir le programmer, il faut identifier comment renverser un tableau jusqu'à un indice donné.
-
On considère le tableau tab ci-dessous :
Déterminez sur votre cahier le contenu detab=5 7 1 4 9 8 3 4 0 6 tabaprès avoir renversé la « plage »tab[0..7]. -
Pour préciser comment programmer cet algorithme de renversement partiel, on approfondit l’exemple précédent. Pour cela, on repart du tableau :
On veut renverser la « plage »tab=5 7 1 4 9 8 3 4 0 6 tab[0..7]. À chaque question, recopiez le tableau sur votre cahier et effectuez les opérations demandées.- Hachurez les éléments de tab qui ne doivent pas être pris en compte.
- Échangez le premier et le dernier élément de la « plage » à renverser.
- On passe à l’élément suivant, puis on échange.
- On poursuit, puis on échange.
- On poursuit, puis on termine.
-
On généralise l'exemple de la question précédente avec un indice
iquelconque.
Pour renversertab[0..i], il faut que :- l'élément d'indice
0soit échangé avec l'élément d'indice ...... - l'élément d'indice
1soit échangé avec l'élément d'indice ...... - etc...
- l'élément d'indice
k(avec 0 \leqslantk\leqslanti) soit échangé avec l'élément d'indice ......
- l'élément d'indice
-
Complétez le corps de la fonction
renverser_jusqu_a()qui prend en paramètre un tableautabet un indiceid'un élément de ce tableau.
Cette fonction à effet de bord renverse l'ordre des valeurs contenues dans le tableau tab entre les indices 0 et i (inclus) selon l’algorithme détaillé dans les questions précédentes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Partie 3 : Tri crêpes☘
-
Complétez le corps de la fonction
tri_crepes()qui prend en paramètre un tableautabet qui implémente l'algorithme de « tri crêpes » résumé ci-dessous :tab est un tableau ayant n éléments Pour i allant de n-1 à 1 j ← indice du maximum de tab[0..i] renverser tab[0..j] renverser tab[0..i] -
Dans le «
main», réalisez un plan de test des fonctions programmées dans ce TP avec le tableautabdonné en Partie 2, puis avec un tableau d’entiers générés aléatoirement et défini par compréhension.