Módulo 15 - Projeto final: o Gerenciador de Tarefas

Guardar as tarefas: a estrutura de dados

8 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 08/07/2026

O que você vai aprender

  • Modelar cada tarefa como um dicionário com campos nomeados.
  • Guardar a coleção de tarefas numa lista de dicionários.
  • Escrever a função de adicionar uma tarefa nova.
  • Escrever a função de listar todas as tarefas.

Cada tarefa é um registro

A primeira grande decisão do gerenciador é como guardar uma tarefa, e ela ilustra tudo que você aprendeu sobre estruturas. Uma tarefa não é uma informação só: ela tem uma descrição (comprar pão) e um estado (pendente ou concluída), e pode ganhar mais campos depois, como prazo ou prioridade. Guardar informações nomeadas que descrevem uma única coisa é exatamente o papel do dicionário: cada tarefa vira um dicionário com as chaves descrição e estado. Assim, tarefa[descrição] dá o texto e tarefa[estado] dá a situação, de forma clara e expansível. Modelar o dado assim, com campos nomeados, é bem melhor do que tentar espremer descrição e estado em duas listas paralelas, uma solução que embola e quebra fácil.

Decidido que cada tarefa é um dicionário, falta guardar o conjunto delas. Aqui a escolha é a lista, e por bons motivos: as tarefas têm uma ordem (a de chegada, por exemplo), a coleção cresce e encolhe conforme o usuário adiciona e conclui, e você vai querer percorrer todas para listar. Tudo isso é território da lista. A combinação final, portanto, é uma lista em que cada item é um dicionário, a famosa lista de dicionários. Esse é o formato mais comum para representar dados do mundo real, de uma agenda de contatos a uma planilha de vendas: a lista guarda as linhas em ordem, e cada dicionário guarda os campos daquela linha. Reconhecer que o gerenciador pede essa estrutura é aplicar, num caso real, o faro de escolher a estrutura certa que o curso treinou.

Uma lista vertical de três cartões, cada um um dicionário de tarefa. O primeiro cartão mostra descrição comprar pão, estado concluída; o segundo, descrição pagar conta, estado pendente; o terceiro, descrição estudar lógica, estado pendente. Um rótulo à esquerda indica a lista (a ordem) e um rótulo em um cartão indica o dicionário (os campos).
A estrutura do gerenciador: uma lista (a ordem das tarefas) de dicionários (os campos de cada tarefa).

As funções de adicionar e listar

Com a estrutura definida, as duas primeiras funções saem quase sozinhas. Adicionar uma tarefa é montar um dicionário novo com a descrição informada e o estado pendente, e acrescentá-lo à lista. Listar as tarefas é percorrer a lista com um laço e mostrar cada uma de forma legível, numerando para o usuário poder se referir a elas depois. Repare como cada função faz uma coisa só, tem um nome honesto e opera sobre a estrutura compartilhada: é o código limpo em ação. E note que o estado pendente entra automaticamente na criação, porque uma tarefa recém-adicionada nunca nasce concluída, uma pequena regra de negócio embutida na função, no lugar certo.

função adicionarTarefa(tarefas, descricao)
  novaTarefa <- { "descricao": descricao, "estado": "pendente" }
  adicione(novaTarefa, tarefas)
fim

função listarTarefas(tarefas)
  numero <- 1
  para cada tarefa em tarefas faça
    escreva(numero, ". [", tarefa["estado"], "] ", tarefa["descricao"])
    numero <- numero + 1
  fim
fim
// exemplo de saída:
// 1. [concluída] comprar pão
// 2. [pendente] pagar conta

Adicionar cria um dicionário pendente e o põe na lista; listar percorre a lista mostrando cada tarefa numerada.

🎮 Jogo da aula

O que a lista guarda?

Acompanhe as operações sobre a lista de tarefas e escolha quantas tarefas PENDENTES existem no fim.

tarefas <- lista vazia
adicionarTarefa(tarefas, "comprar pão")
adicionarTarefa(tarefas, "pagar conta")
adicionarTarefa(tarefas, "estudar")
// a segunda tarefa é marcada como concluída
tarefas[1]["estado"] <- "concluída"
// quantas continuam pendentes?

A força da estrutura certa

Vale reparar quanto trabalho a estrutura certa já economizou. Como cada tarefa é um dicionário, acrescentar um campo novo no futuro (um prazo, uma prioridade) é só adicionar uma chave, sem mexer no resto. Como a coleção é uma lista, percorrer, contar e numerar as tarefas usa os padrões que você domina desde o básico. Mudar o estado de uma tarefa específica é acessar seu dicionário na lista e trocar uma chave, uma linha. Nada disso seria tão limpo com uma escolha ruim de estrutura, como listas paralelas de descrições e estados, que obrigariam a manter os índices sincronizados na mão e quebrariam ao primeiro descuido. A lição do módulo de estruturas de dados se confirma na prática: escolher bem a estrutura no início é o que torna todas as operações seguintes fáceis. Com as tarefas guardadas e as funções de adicionar e listar prontas, o esqueleto começa a ganhar vida. Falta dar ao usuário o poder de consultar e concluir, com a devida validação, o assunto da próxima aula.

Teste rápido

Por que cada tarefa do gerenciador é modelada como um dicionário, e a coleção como uma lista?

Perguntas frequentes

Por que uma tarefa é um dicionário e não só um texto?
Porque uma tarefa tem mais de uma informação: a descrição e o estado (pendente ou concluída), e pode ganhar outras depois. O dicionário guarda esses campos nomeados juntos, de forma clara e expansível. Um texto solto guardaria só a descrição e não teria onde pôr o estado.
O que é uma lista de dicionários?
É uma lista em que cada item é um dicionário. Representa uma tabela de registros: a lista mantém a ordem das linhas, e cada dicionário guarda os campos (colunas) de uma linha. É o formato mais comum para dados do mundo real, de agendas a planilhas, e é a estrutura do gerenciador de tarefas.
Por que a coleção de tarefas é uma lista e não um conjunto ou dicionário?
Porque as tarefas têm ordem (a de chegada), podem se repetir em descrição e você percorre todas para listar. Isso é território da lista. Um conjunto descartaria a ordem e não permitiria duplicadas; um dicionário faria sentido se você buscasse cada tarefa por uma chave única, o que não é o caso principal aqui.
Por que a tarefa nova já nasce com estado pendente?
Porque uma tarefa recém-adicionada logicamente ainda não foi feita. Embutir esse estado inicial na função de adicionar é colocar a regra no lugar certo: quem adiciona não precisa lembrar de informar o estado, e nunca cria uma tarefa concluída por engano. É uma pequena regra de negócio bem posicionada.
Como eu adicionaria um campo novo, como prazo?
Bastaria incluir a chave prazo no dicionário da tarefa ao criá-la, e usá-la onde precisar. Como cada tarefa é um dicionário, campos novos entram sem quebrar o resto. Essa facilidade de expandir é uma das vantagens de ter escolhido o dicionário para modelar a tarefa.
Por que não usar duas listas paralelas, uma de descrições e outra de estados?
Porque isso obriga a manter os índices das duas listas sincronizados na mão: a descrição na posição 3 tem que casar com o estado na posição 3. Um descuido desalinha tudo e vira bug. A lista de dicionários mantém cada tarefa inteira num item só, sem esse risco. É a estrutura mais segura e clara.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.