Percursos
/
Python
Python
/
Exercícios
/
Buffer Circular
Buffer Circular

Buffer Circular

Fácil

Instruções

Um buffer circular, buffer cíclico ou buffer em anel é uma estrutura de dados que usa um único buffer de tamanho fixo, como se estivesse ligado de ponta a ponta.

Um buffer circular começa vazio e com um determinado comprimento predefinido. Por exemplo, este é um buffer de 7 elementos:

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

Imagina que se escreve um 1 no meio do buffer (a localização inicial exata não importa num buffer circular):

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

Imagina agora que são acrescentados mais dois elementos, o 2 e o 3, que ficam depois do 1:

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

Se depois forem removidos dois elementos do buffer, são removidos os valores mais antigos que estão dentro dele. Os dois elementos removidos, neste caso, são o 1 e o 2, ficando o buffer apenas com o 3:

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

Se o buffer tiver 7 elementos, fica completamente cheio:

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

Quando o buffer está cheio, é gerado um erro que avisa o cliente de que novas escritas ficam bloqueadas até que fique uma fenda livre.

Quando o buffer está cheio, o cliente pode optar por sobrescrever os dados mais antigos com uma escrita forçada. Neste caso, são acrescentados mais dois elementos, o A e o B, que sobrescrevem o 3 e o 4:

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

O 3 e o 4 foram substituídos por A e B, o que faz do 5 o dado mais antigo do buffer. Por fim, se forem removidos dois elementos, o que seria devolvido é o 5 e o 6, dando origem ao buffer:

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

Como há espaço disponível, se o cliente voltar a usar a sobrescrita para guardar C e D, será usado o espaço onde o 5 e o 6 estavam guardados anteriormente, e não a posição do 7 e do 8. O 7 continua a ser o elemento mais antigo e o buffer volta a estar cheio.

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

Personalizar e lançar exceções

Por vezes, é necessário personalizar e raise exceções no teu código. Quando o fazes, deves incluir sempre uma mensagem de erro significativa que indique qual é a origem do erro. Isto torna o teu código mais legível e ajuda bastante a depurar.

Podes criar exceções personalizadas através de novas classes de exceção (vê classes para mais detalhes), que são, tipicamente, subclasses de Exception.

Nas situações em que sabes que a origem do erro será derivada de um determinado tipo de exceção, podes optar por herdar de um dos built in error types sob a classe Exception. Mesmo ao lançar o erro, deves continuar a incluir uma mensagem significativa.

Este exercício em particular pede que cries duas exceções personalizadas. Uma exceção a ser lançada/"thrown" quando o teu buffer circular estiver cheio, e outra para quando estiver vazio. Os testes só passam se personalizares as exceções adequadas, as lançares com raise e incluíres mensagens de erro adequadas.

Para personalizar uma built-in exception, cria uma class que herde dessa exceção. Quando lanças a exceção personalizada com uma mensagem, escreve a mensagem como argumento do tipo 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")

Fonte

WikipediaO link abre numa nova janela ou separador
Editar via GitHub A ligação abre numa nova janela ou separador
Python Exercism

Estás pronto para começar Buffer Circular?

Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.

Mergulha a fundo em Buffer Circular!

Neste vídeo, vamos ver o Buffer Circular: o que é, onde é usado e diferentes implementações, incluindo filas, arrays estáticos e dinâmicos, estruturas de dados imutáveis e uma divertida implementação baseada em agentes.