Parcours
/
Python
Python
/
Exercices
/
Tampon circulaire
Tampon circulaire

Tampon circulaire

Facile

Instructions

Un tampon circulaire, aussi appelé tampon cyclique ou tampon en anneau, est une structure de données qui utilise un unique tampon de taille fixe comme s'il était relié de bout en bout.

Au départ, un tampon circulaire est vide et possède une longueur prédéfinie. Par exemple, voici un tampon de 7 éléments :

[ ][ ][ ][ ][ ][ ][ ]

Supposons qu'un 1 soit écrit au milieu du tampon (l'emplacement de départ exact n'a pas d'importance dans un tampon circulaire) :

[ ][ ][ ][1][ ][ ][ ]

Supposons ensuite que deux éléments supplémentaires, 2 et 3, soient ajoutés à la suite du 1 :

[ ][ ][ ][1][2][3][ ]

Si on retire ensuite deux éléments du tampon, ce sont les valeurs les plus anciennes qu'il contient qui sont retirées. Les deux éléments retirés, ici, sont 1 et 2, ce qui ne laisse dans le tampon qu'un 3 :

[ ][ ][ ][ ][ ][3][ ]

Si le tampon contient 7 éléments, il est alors complètement plein :

[5][6][7][8][9][3][4]

Quand le tampon est plein, une erreur est levée pour avertir le client que les écritures suivantes sont bloquées jusqu'à ce qu'un emplacement se libère.

Quand le tampon est plein, le client peut choisir d'écraser les données les plus anciennes au moyen d'une écriture forcée. Dans ce cas, deux éléments supplémentaires, A et B, sont ajoutés et écrasent le 3 et le 4 :

[5][6][7][8][9][A][B]

3 et 4 ont été remplacés par A et B, ce qui fait désormais de 5 la donnée la plus ancienne du tampon. Enfin, si on retire deux éléments, ce sont 5 et 6 qui sont renvoyés, ce qui donne le tampon suivant :

[ ][ ][7][8][9][A][B]

Comme de la place est disponible, si le client utilise à nouveau l'écrasement pour stocker C et D, c'est l'emplacement où 5 et 6 étaient stockés auparavant qui sera utilisé, et non celui de 7 et 8. 7 reste l'élément le plus ancien et le tampon est de nouveau plein.

[C][D][7][8][9][A][B]

Personnaliser et lever des exceptions

Il est parfois nécessaire de personnaliser et de raise des exceptions dans le code. Quand tu le fais, pense toujours à inclure un message d'erreur explicite qui indique l'origine de l'erreur. Cela rend le code plus lisible et facilite grandement le débogage.

Les exceptions personnalisées peuvent être créées au moyen de nouvelles classes d'exceptions (voir classes pour plus de détails), qui sont généralement des sous-classes de Exception.

Lorsque tu sais que la source de l'erreur sera dérivée d'un certain type d'exception, tu peux choisir d'hériter de l'un des built in error types sous la classe Exception. Lorsque tu lèves l'erreur, pense quand même à inclure un message explicite.

Cet exercice en particulier te demande de créer deux exceptions personnalisées. Une exception à lever/« lancer » lorsque ton tampon circulaire est plein, et une autre pour le cas où il est vide. Les tests ne passeront que si tu personnalises les exceptions adéquates, que tu lèves ces exceptions avec raise et que tu inclus des messages d'erreur appropriés.

Pour personnaliser une built-in exception, crée une class qui hérite de cette exception. Quand tu lèves l'exception personnalisée avec un message, écris ce message comme argument du type exception :

# subclassing the built-in BufferError to create BufferFullException
class BufferFullException(BufferError):
    """Exception raised when CircularBuffer is full.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

        
# raising a BufferFullException
raise BufferFullException("Circular buffer is full")

Source

WikipediaLe lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Python Exercism

Prêt à commencer Tampon circulaire ?

Inscris-toi sur Exercism pour apprendre et maîtriser Python avec 17 concepts146 exercices, et un vrai mentorat humain, le tout gratuitement.

Analyse approfondie de Tampon circulaire !

Dans cette vidéo, on s'intéresse au tampon circulaire : ce qu'il est, où il est utilisé et différentes implémentations, notamment les files, les tableaux statiques et dynamiques, les structures de données immuables et une implémentation amusante à base d'agents.