Coleções dinâmicas

Quarta, 10 de junho de 2020

Atenção: Esta tarefa também será corrigida manualmente. Depois de terminada e corrigida automaticamente, você deve apresentar sua tarefa a um monitor em algum horário de atendimento. Você poderá pedir recorreção, mas o conceito da recorreção será no máximo B.

Agenda

Nesta tarefa você deve implementar um aplicativo de agenda em modo texto. O usuário do aplicativo pode criar um evento, alterar as informações de um evento, remover um evento e listar todos os eventos de um dia. As informações que um evento tem são: identificador, nome, descrição, data e hora.

Argumentos por linha de comando

A interação do usuário será feita passando argumentos pela linha de comando. Quando executamos um processo no sistema operacional, além do nome do programa, passamos algumas informações adicionais, como variáveis de ambiente e argumentos. Para acessar os argumentos em Python, podemos acessar a variável sys.argv, que é uma lista de strings com os argumentos. Por exemplo, o programa argumentos.py a seguir lista todos os argumentos passados na chamada.

import sys

def main():
   for i, argumento in enumerate(sys.argv):
      print(f"Argumento {i}: {argumento}")

main()

Uma execução possível é a seguinte.

user@notebook$ python3 argumentos.py argumento outro "argumento com espaços" -o
Argumento 0: argumentos.py
Argumento 1: argumento
Argumento 2: outro
Argumento 3: argumento com espaços
Argumento 4: -o

Os argumentos são úteis quando um programa puder executar uma série de atividades diferentes: assim como uma função recebe parâmetros, um programa pode receber argumentos e opções. Na prática, utilizamos um módulo que facilita o uso de argumentos. Por exemplo, podemos utilizar o argparse.

O argparse é um módulo da biblioteca padrão do Python que ajuda com a criação de interfaces de linha de comando amigáveis. Nós definimos os argumentos esperados e como eles devem ser formatados e deixamos que o argparse os trate fazendo todas as verificações necessárias.

A seguir, vamos ver um exemplo no qual temos um programa que calcula o logaritmo de um número. O usuário pode escolher a base, mas se não informar nenhuma, o programa deve utilizar a base 10.

Primeiro, precisamos definir um parser.

parser = argparse.ArgumentParser()

Em seguida, definimos cada um dos argumentos esperados. Abaixo, estamos definindo um argumento de posição chamado numero e um argumento opcional chamado base. Caso um valor para o segundo argumento não seja informado, ele receberá o valor padrão de 10.0.

parser.add_argument("numero", help="número para calcular o logaritmo.", type=float)
parser.add_argument("-b", "--base", help="base do logaritmo.", default=10.0, type=float)

Após definir os argumentos, transformamos os argumentos de acordo com o parser.

args = parser.parse_args()

Podemos então pegar os valores dos argumentos da seguinte forma:

resultado = math.log(args.numero, args.base)

Para o usuário ver a lista de parâmEtros e suas descrições, ele deve executar o programa com o parâmetro -h ou --help.

user@notebook$ python3 logaritmo.py -h

Para calcular o logaritmo do número 16 na base 2:

user@notebook$ python3 logaritmo.py 16 -b 2

Persistência de dados

Os eventos da agenda que esta tarefa manipulará devem ser guardados em um arquivo texto no formato CSV, de forma que as informações sejam persistentes entre as várias vezes que executamos o programa. Quando o usuário desejar realizar alguma operação sobre sua agenda, ele irá executar o aplicativo passando uma opção -a com o nome do arquivo CSV da agenda e passando como argumento do programa a ação correspondente para a agenda, inicializar, criar, alterar, remover ou listar.

Por exemplo, para inicializar uma nova agenda vazia, pode-se digitar

user@notebook$ python3 agenda.py -a agenda.csv inicializar
Uma agenda vazia `agenda.csv` foi criada!

O programa mostrará uma mensagem informando que a ação foi realizada. Com exceção da ação listar, você pode escolher a mensagem para o usuário que melhor entender. Para a ação listar, a saída deve ser compatível com os exemplos dos casos de teste.

Operações sobre a agenda

As operações sobre uma agenda existente são descritas a seguir.

Criar evento

Para criar um evento, o usuário irá executar o programa passando como argumento as informações do evento que deseja criar.

Um exemplo de uso:

user@notebook$ python3 agenda.py -a agenda.csv criar --nome "MC102" --descricao "Aula de laboratório" --data "01/06/2020" --hora "14:00"
Foi adicionado evento 3.

O identificador do evento é um número inteiro. Esse número é determinado pela seguinte regra. Se a agenda estiver vazia, então o evento criado terá identificador 1. Se não, então o identificador do novo evento será o maior identificador armazenado na agenda mais um.

Alterar evento

O usuário pode alterar informações de eventos criados. Para isso, ele informará por argumento qual evento e qual informação deja alterar.

Exemplo de uso:

user@notebook$ python3 agenda.py -a agenda.csv alterar --evento 1 --hora "16:00"
Alguma mensagem de retorno para o usuário.

Remover evento

Para remover um evento, o usuário deve informar qual evento deve ser removido.

Exemplo de uso:

user@notebook$ python3 agenda.py -a agenda.csv remover --evento 1
Alguma mensagem de retorno para o usuário.

Listar eventos

O usuário pode listar todos os eventos de um dia, para isso deve executar o programa informando por argumento a data. Os eventos são apresentados na ordem de criação.

Exemplo de uso:

user@notebook$ python3 agenda.py -a agenda.csv listar --data "13/06/2020"
Eventos do dia 13/06/2020
-----------------------------------------------
Evento 1 - MC102
Descrição: Aula de laboratório
Data: 01/06/2020
Hora: 16:50
-----------------------------------------------

Se não houver eventos no dia, então deve ser mostrada uma mensagem informando isso.

user@notebook$ python3 agenda.py -a agenda.csv listar --data "13/06/2020"
Não existem eventos para o dia 13/06/2020!

Documentação

Além de escrever um programa, você deverá criar um arquivo README.md documentando o seu programa. Nesse arquivo, você deverá descrever sucintamente (no mínimo 300 palavras e no máximo 500 palavras).

  1. O formato do seu arquivo CSV. Você deve deixar claro quais colunas o arquivo tem, se há cabeçalho e nomes, tipo de separadores, etc.

  2. A estrutura de dados que representa a agenda. Você deve explicar qual estrutura escolhida para representar a coleção de eventos e quais são os dados que representam um dado evento.