Aula Prática 8 - tipos estruturados de informação, Ficheiros e Exceções

Os objetivos desta aula são os seguintes: continuar a exercitar a utilização de tipos estruturados de informação, leitura e escrita de ficheiros e utilização de exceções. Após a realização da aula, o estudante deverá:

  • ficar mais familiarizado com a noção de tuplo, lista e dicionário
  • saber ler e escrever num ficheiro de texto
  • saber lidar com exceções
  • saber introduzir pré-condições

1. Considerando o exercício da agenda telefónica da aula passada, adicione opções para ler e escrever o conteúdo da agenda num ficheiro.

Uma agenda é composta por contactos telefónicos, em que cada contacto telefónico tem os atributos nome, telefone, email principal (opcional). Deverá definir a classe de objetos Agenda deve permitir todas as operações seguintes.

  1. Adicionar um contacto à agenda
  2. Listar os contactos existentes
  3. ...
  4. ...
  5. ...
  6. ...
  7. Escrever a lista telefónica para um ficheiro (gravar)
  8. Ler a lista telefónica de um ficheiro (ler)

Escreva um programa que apresenta o menu anterior ao utilizador e, consoante a sua escolha faz a operação correspondente. O programa termina quando o utilizador introduzir a opção 0.

Caso o ficheiro de leitura não exista, deve informar o utilizador.

In [77]:
class Contact:

    def __init__(self, name, number, email = ""):
        self.__name = name
        self.number = number
        self.email = email

    @property
    def name(self):
        return self.__name

    def __str__(self):
        return "{},{},{}".format(self.name, self.number, self.email)
    
    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return False
        return self.name == other.name and self.number == other.number


class Agenda:

    def __init__(self):
        self.__contacts = []

    def add(self, c):
        self.__contacts.append(c)

    def listar(self):
        for c in self.__contacts:
            print(c)

    def gravar(self, file_name):
        f = open(file_name, 'w')
        for c in self.__contacts:
            f.write(str(c) + "\n")
        f.close()
    
    def ler(self, file_name):
        f = open(file_name, 'r')
        for line in f:
            name, number, email = line.strip().split(",")
            c = Contact(name, number, email) 
            self.__contacts.append( c )
        f.close()        
In [74]:
c1 = Contact("Maria Joana", 9999999, "joana@me.com")
c2 = Contact("Jararé Titó", 5555555, "jacare@lago.br")
In [75]:
# teste da classe agenda            
a = Agenda()
a.add(c1)
a.add(c2)
print("=== Contactos na agenda ===")
=== Contactos na agenda ===
In [76]:
a.listar()
Maria Joana,9999999,joana@me.com
Jararé Titó,5555555,jacare@lago.br
In [69]:
a.ler("contactos.txt")
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-69-c8426fec4bff> in <module>
----> 1 a.ler("contactos.txt")

<ipython-input-65-ee274537570b> in ler(self, file_name)
     39 
     40     def ler(self, file_name):
---> 41         f = open(file_name, 'r')
     42         for line in f:
     43             name, number, email = line.strip().split(",")

FileNotFoundError: [Errno 2] No such file or directory: 'contactos.txt'
In [70]:
a.gravar("contactos.txt")
In [72]:
opcao = ""
while opcao != "0":
    print("Menu:")
    print("1. Adicionar um contacto à agenda")
    print("2. Listar os contactos existentes")
    print("7. Escrever a lista telefónica para um ficheiro (gravar)")
    print("8. Ler a lista telefónica de um ficheiro (ler)")
    opcao = input("Qual a sua opcao: ")
    if opcao == "2":
        a.listar()
    elif opcao == "7":
        a.gravar("contactos.txt")
    elif opcao == "8":
        try:
            a.ler("contactos.txt")
        except:
            print("Não é possivel ler o ficheiro")
Menu:
1. Adicionar um contacto à agenda
2. Listar os contactos existentes
7. Escrever a lista telefónica para um ficheiro (gravar)
8. Ler a lista telefónica de um ficheiro (ler)
Maria Joana,9999999,joana@me.com
Jararé Titó,5555555,jacare@lago.br
Menu:
1. Adicionar um contacto à agenda
2. Listar os contactos existentes
7. Escrever a lista telefónica para um ficheiro (gravar)
8. Ler a lista telefónica de um ficheiro (ler)
Menu:
1. Adicionar um contacto à agenda
2. Listar os contactos existentes
7. Escrever a lista telefónica para um ficheiro (gravar)
8. Ler a lista telefónica de um ficheiro (ler)
Maria Joana,9999999,joana@me.com
Jararé Titó,5555555,jacare@lago.br
Maria Joana,9999999,joana@me.com
Jararé Titó,5555555,jacare@lago.br
Menu:
1. Adicionar um contacto à agenda
2. Listar os contactos existentes
7. Escrever a lista telefónica para um ficheiro (gravar)
8. Ler a lista telefónica de um ficheiro (ler)

2. Pretende-se desenvolver um programa que permita gerir uma fila de espera de uma repartição pública.

O funcionamento que se pretende para a repartição é o seguinte:

  • Quando um utente entra na repartição, é-lhe pedido o seu número do bilhete de identidade. Este número é depois dado pelo funcionário que opera o sistema ao programa a desenvolver para inserção na fila de espera. Para isso o funcionário selecciona a opção apropriada do programa;
  • Quando a (única) cabina de atendimento fica livre, o operador do sistema selecciona no programa a opção de retirar o número do bilhete de identidade do utente há mais tempo à espera, sendo esse número mostrado ao operador (que depois o anuncia) e retirado da fila de espera gerida pelo programa;
  • O operador pode também simplesmente ver qual o número do bilhete de identidade do próximo utente a ser atendido, sem para isso precisar de o retirar da fila de espera. Para tal deve seleccionar no programa uma opção apropriada;
  • Podem estar à espera na sala um máximo de 12 (por exemplo) utentes. Se entrar o 13º utente, o programa deve-se recusar a inseri-lo na fila de espera.

Desenvolva a classe fila de espera de modo a que o funcionamento acima seja possível. Na construção de um objeto deste tipo deve ser fornecido ao construtor o número máximo de pessoas admitido.

In [ ]: