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.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Guardar as tarefas: a estrutura de dados.
Os objetivos desta aula. 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.
Veja o essencial, parte por parte.
Cada tarefa é um registro. Cada tarefa tem vários dados (descrição, estado), então é um dicionário, não um valor solto.
As funções de adicionar e listar. Com a estrutura definida, as duas primeiras funções saem quase sozinhas.
A força da estrutura certa. Vale reparar quanto trabalho a estrutura certa já economizou.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.
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 contaAdicionar 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.