Usando TAD Filas, crie um programa que gere a impressão de documentos enviados para uma impressora de rede. Os documentos são enviados e impressos de acordo com a ordem de chegada.
Neste programa, o utilizador deve ser capaz de realizar as seguintes operações:
•Enviar documento para a impressora;
• Cancelar a impressão;
•Listar documentos em espera;
•Imprimir documento;

Passo 1

Beleza, vamos lá! Você tem um exercício que pede para criar um programa usando o TAD Filas (tipo abstrato de dados fila) para gerenciar a impressão de documentos numa impressora de rede. A ideia é que os documentos sejam impressos na ordem em que chegam, tipo uma fila de supermercado. Para resolver isso, vamos precisar entender como funciona uma fila, como adicionar e remover elementos dela, e como implementar essas operações no nosso programa.

Passo 2

Primeiro, vamos entender o que é uma fila. Uma fila é uma estrutura de dados onde o primeiro que entra é o primeiro que sai, ou seja, segue a regra FIFO (First In, First Out). Isso é perfeito para gerenciar documentos na impressora, já que queremos que os documentos sejam impressos na ordem em que foram enviados.

Passo 3

Vamos começar criando uma classe para representar a fila. Em Python, podemos usar uma lista para isso, mas para ficar mais didático, vamos criar uma classe Fila com métodos para enfileirar (adicionar) e desenfileirar (remover) documentos.
class Fila:
    def __init__(self):
        self.itens = []

    def enfileirar(self, item):
        self.itens.append(item)

    def desenfileirar(self):
        if not self.vazia():
            return self.itens.pop(0)
        else:
            return None

    def vazia(self):
        return len(self.itens) == 0

    def listar(self):
        return self.itens
Aqui, enfileirar adiciona um documento no final da fila, desenfileirar remove o primeiro documento da fila, vazia verifica se a fila está vazia e listar retorna todos os documentos em espera.

Passo 4

Agora, vamos criar uma classe para representar os documentos. Cada documento pode ter um nome ou um identificador único.
class Documento:
    def __init__(self, nome):
        self.nome = nome

    def __str__(self):
        return self.nome
Isso facilita a identificação dos documentos quando listarmos ou cancelarmos a impressão.

Passo 5

Vamos agora criar a classe principal que vai gerenciar a impressora. Essa classe vai usar a nossa fila para gerenciar os documentos.
class Impressora:
    def __init__(self):
        self.fila = Fila()

    def enviar_documento(self, documento):
        self.fila.enfileirar(documento)
        print(f'Documento "{documento}" enviado para a impressora.')

    def cancelar_impressao(self, nome_documento):
        fila_atual = self.fila.listar()
        nova_fila = Fila()
        encontrado = False
        for doc in fila_atual:
            if doc.nome == nome_documento and not encontrado:
                encontrado = True
                print(f'Documento "{doc}" cancelado da fila de impressão.')
                continue
            nova_fila.enfileirar(doc)
        self.fila = nova_fila
        if not encontrado:
            print(f'Documento "{nome_documento}" não encontrado na fila.')

    def listar_documentos(self):
        documentos = self.fila.listar()
        if documentos:
            print("Documentos na fila de impressão:")
            for doc in documentos:
                print(f'- {doc}')
        else:
            print("A fila de impressão está vazia.")

    def imprimir_documento(self):
        documento = self.fila.desenfileirar()
        if documento:
            print(f'Imprimindo documento: {documento}')
        else:
            print("Não há documentos para imprimir.")
Aqui, a classe Impressora tem métodos para enviar documentos, cancelar impressões, listar documentos na fila e imprimir documentos. Note que, para cancelar uma impressão, percorremos a fila atual e criamos uma nova fila sem o documento que queremos cancelar.

Passo 6

Por último, vamos criar um menu simples para o usuário interagir com a impressora.
def menu():
    impressora = Impressora()
    while True:
        print("\n--- Menu da Impressora ---")
        print("1. Enviar documento para a impressora")
        print("2. Cancelar impressão")
        print("3. Listar documentos em espera")
        print("4. Imprimir documento")
        print("5. Sair")
        escolha = input("Escolha uma opção: ")

        if escolha == '1':
            nome = input("Digite o nome do documento: ")
            documento = Documento(nome)
            impressora.enviar_documento(documento)
        elif escolha == '2':
            nome = input("Digite o nome do documento a cancelar: ")
            impressora.cancelar_impressao(nome)
        elif escolha == '3':
            impressora.listar_documentos()
        elif escolha == '4':
            impressora.imprimir_documento()
        elif escolha == '5':
            print("Saindo do programa.")
            break
        else:
            print("Opção inválida. Tente novamente.")

if __name__ == "__main__":
    menu()
Esse menu permite que o usuário escolha entre enviar um documento, cancelar uma impressão, listar os documentos em espera, imprimir o próximo documento ou sair do programa.

Resposta

Aqui está o programa completo que implementa as funcionalidades usando o TAD Filas:
class Fila:
    def __init__(self):
        self.itens = []

    def enfileirar(self, item):
        self.itens.append(item)

    def desenfileirar(self):
        if not self.vazia():
            return self.itens.pop(0)
        else:
            return None

    def vazia(self):
        return len(self.itens) == 0

    def listar(self):
        return self.itens

class Documento:
    def __init__(self, nome):
        self.nome = nome

    def __str__(self):
        return self.nome

class Impressora:
    def __init__(self):
        self.fila = Fila()

    def enviar_documento(self, documento):
        self.fila.enfileirar(documento)
        print(f'Documento "{documento}" enviado para a impressora.')

    def cancelar_impressao(self, nome_documento):
        fila_atual = self.fila.listar()
        nova_fila = Fila()
        encontrado = False
        for doc in fila_atual:
            if doc.nome == nome_documento and not encontrado:
                encontrado = True
                print(f'Documento "{doc}" cancelado da fila de impressão.')
                continue
            nova_fila.enfileirar(doc)
        self.fila = nova_fila
        if not encontrado:
            print(f'Documento "{nome_documento}" não encontrado na fila.')

    def listar_documentos(self):
        documentos = self.fila.listar()
        if documentos:
            print("Documentos na fila de impressão:")
            for doc in documentos:
                print(f'- {doc}')
        else:
            print("A fila de impressão está vazia.")

    def imprimir_documento(self):
        documento = self.fila.desenfileirar()
        if documento:
            print(f'Imprimindo documento: {documento}')
        else:
            print("Não há documentos para imprimir.")

def menu():
    impressora = Impressora()
    while True:
        print("\n--- Menu da Impressora ---")
        print("1. Enviar documento para a impressora")
        print("2. Cancelar impressão")
        print("3. Listar documentos em espera")
        print("4. Imprimir documento")
        print("5. Sair")
        escolha = input("Escolha uma opção: ")

        if escolha == '1':
            nome = input("Digite o nome do documento: ")
            documento = Documento(nome)
            impressora.enviar_documento(documento)
        elif escolha == '2':
            nome = input("Digite o nome do documento a cancelar: ")
            impressora.cancelar_impressao(nome)
        elif escolha == '3':
            impressora.listar_documentos()
        elif escolha == '4':
            impressora.imprimir_documento()
        elif escolha == '5':
            print("Saindo do programa.")
            break
        else:
            print("Opção inválida. Tente novamente.")

if __name__ == "__main__":
    menu()
Como usar o programa:
  1. Enviar documento para a impressora: Escolha a opção 1 e digite o nome do documento que deseja enviar. Ele será adicionado ao final da fila.
  2. Cancelar impressão: Escolha a opção 2 e digite o nome do documento que deseja cancelar. O programa irá remover o primeiro documento com esse nome da fila.
  3. Listar documentos em espera: Escolha a opção 3 para ver todos os documentos que estão na fila de impressão.
  4. Imprimir documento: Escolha a opção 4 para imprimir o próximo documento na fila (o que está na frente).
  5. Sair: Escolha a opção 5 para encerrar o programa.
Exemplo de execução:
--- Menu da Impressora ---
1. Enviar documento para a impressora
2. Cancelar impressão
3. Listar documentos em espera
4. Imprimir documento
5. Sair
Escolha uma opção: 1
Digite o nome do documento: Relatório.pdf
Documento "Relatório.pdf" enviado para a impressora.

--- Menu da Impressora ---
1. Enviar documento para a impressora
2. Cancelar impressão
3. Listar documentos em espera
4. Imprimir documento
5. Sair
Escolha uma opção: 3
Documentos na fila de impressão:
- Relatório.pdf

--- Menu da Impressora ---
1. Enviar documento para a impressora
2. Cancelar impressão
3. Listar documentos em espera
4. Imprimir documento
5. Sair
Escolha uma opção: 4
Imprimindo documento: Relatório.pdf
Esse programa simples utiliza o conceito de fila para garantir que os documentos sejam impressos na ordem correta, além de permitir operações como enviado, cancelamento e listagem dos documentos.

Exercícios relacionados