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

Buscar, filtrar e concluir com validação

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

O que você vai aprender

  • Marcar uma tarefa como concluída com validação de que ela existe.
  • Filtrar as tarefas por estado (mostrar só as pendentes).
  • Buscar uma tarefa pela descrição.
  • Aplicar cláusulas de guarda para tratar entradas inválidas.

Concluir uma tarefa com segurança

Marcar uma tarefa como concluída parece trivial, mas é onde a robustez entra em cena. O usuário informa o número da tarefa que quer concluir, e esse número é um dado de fora, então não se confia nele. E se ele digitar um número que não existe na lista, como 9 numa lista de 3 tarefas? E se digitar letras, ou zero, ou um negativo? Sem cuidado, o programa tentaria acessar uma posição inexistente e quebraria, o erro de execução do módulo de robustez. A solução é a cláusula de guarda: antes de mexer na lista, valide o número. Se ele não for um número válido, ou estiver fora da faixa das tarefas, avise o usuário com uma mensagem clara e não faça nada. Só quando o número passa na validação é que você acessa a tarefa na lista e muda seu estado para concluída, com a garantia de que a operação faz sentido.

função concluirTarefa(tarefas, numeroDigitado)
  se numeroDigitado não é um número então
    escreva("Informe o número da tarefa")
    retorne
  fim
  indice <- numeroDigitado - 1   // usuário vê 1, lista guarda 0
  se indice < 0 ou indice >= tamanho(tarefas) então
    escreva("Não existe tarefa com esse número")
    retorne
  fim
  // aqui a tarefa existe com certeza:
  tarefas[indice]["estado"] <- "concluída"
  escreva("Tarefa concluída!")
fim

Duas guardas validam o número antes de mexer na lista. Só depois a tarefa é acessada e concluída, sem risco de quebra.

Um fluxo do concluir tarefa. O número digitado passa por dois portões de guarda: é um número? e está na faixa das tarefas? Entradas ruins (letras, número 9 numa lista de 3) são barradas com mensagens. Só o número válido chega à lista, onde a tarefa correspondente tem o estado trocado para concluída.
As guardas barram o número inválido na porta; só o válido chega à lista para concluir a tarefa, sem quebra.

Filtrar as pendentes e buscar por descrição

Duas operações que dão inteligência ao gerenciador são filtrar e buscar, e as duas reaproveitam padrões que você domina. Filtrar para mostrar só as tarefas pendentes é percorrer a lista com um laço e, para cada tarefa, uma decisão: se o estado é pendente, mostre; senão, pule. É o padrão de contar sob condição, agora aplicado a mostrar sob condição. Buscar uma tarefa por um pedaço da descrição é a busca linear do módulo 10 aplicada a texto: percorra as tarefas e, para cada uma, verifique se a descrição contém o termo procurado, lembrando de padronizar a caixa para que a busca por pao encontre Pão, exatamente o cuidado do módulo de strings. As duas operações mostram o curso inteiro convergindo: laços, decisões, busca e manipulação de texto trabalhando juntos numa função útil.

função listarPendentes(tarefas)
  para cada tarefa em tarefas faça
    se tarefa["estado"] = "pendente" então
      escreva("- ", tarefa["descricao"])
    fim
  fim
fim

função buscarTarefa(tarefas, termo)
  termoMin <- minusculas(termo)
  achou <- falso
  para cada tarefa em tarefas faça
    se minusculas(tarefa["descricao"]) contém termoMin então
      escreva("Encontrada: ", tarefa["descricao"])
      achou <- verdadeiro
    fim
  fim
  se não achou então escreva("Nenhuma tarefa com esse termo") fim
fim

Filtrar é percorrer com decisão; buscar é a busca linear em texto, padronizando a caixa para não errar por maiúscula.

🎮 Jogo da aula

A validação que faltou

Esta função conclui uma tarefa pelo número, mas quebra se o usuário digitar um número que não existe. Toque na linha onde faltou uma cláusula de guarda antes.

O curso inteiro convergindo numa função

Pare um instante para apreciar o que aconteceu nesta aula. A função de concluir usou dicionário (a tarefa), lista (a coleção), acesso por índice, cláusula de guarda, validação de entrada e tratamento de caso de borda, tudo numa dúzia de linhas. A de filtrar juntou laço e decisão. A de buscar somou busca linear, manipulação de texto e padronização de caixa. Nenhum desses conceitos foi inventado agora; todos vieram dos módulos anteriores, e aqui eles se combinam com naturalidade para resolver um problema real. É esse o significado profundo de um projeto final: ele revela que você não colecionou tópicos soltos, e sim construiu um repertório que se articula. Um programador experiente não pensa vou usar o conceito X agora; ele simplesmente resolve o problema, e as ferramentas certas vêm à mão porque estão integradas no seu jeito de pensar. Você está começando a chegar lá. Na última aula, montamos o programa completo e olhamos para o próximo passo da sua jornada.

Teste rápido

Na função que busca uma tarefa pela descrição, por que padronizar a caixa (deixar tudo em minúsculas) antes de comparar?

Perguntas frequentes

Por que validar o número da tarefa antes de concluí-la?
Porque o número vem do usuário, um dado de fora que não se confia. Se ele digitar um número inexistente, letras ou um negativo, acessar a lista sem checar quebraria o programa. As cláusulas de guarda validam o número primeiro e tratam o caso inválido com uma mensagem, evitando o erro de execução.
Por que o índice é o número digitado menos um?
Porque o usuário vê as tarefas numeradas a partir de 1 (mais natural para pessoas), mas a lista guarda a partir do índice 0. Então a tarefa que o usuário chama de 1 está no índice 0, a 2 no índice 1, e assim por diante. Subtrair um faz a ponte entre a numeração humana e a da lista.
Como o gerenciador filtra só as tarefas pendentes?
Percorrendo a lista com um laço e, para cada tarefa, uma decisão: se o estado é pendente, mostra; senão, pula. É o padrão de agir sob condição dentro de um laço. O mesmo esqueleto serviria para filtrar as concluídas, bastando trocar a condição.
Buscar no gerenciador usa busca binária?
Não: usa busca linear, porque as tarefas não estão ordenadas por descrição e a lista costuma ser pequena. A busca percorre as tarefas verificando se a descrição contém o termo. A busca binária exigiria ordenar por descrição e valeria a pena só com muitíssimas tarefas, o que não é o caso de uma lista pessoal de afazeres.
Por que a busca ignora maiúsculas e minúsculas?
Para achar o que o usuário quer sem exigir que ele acerte a caixa. Como P e p são diferentes para o computador, uma busca por pao não acharia Pão sem cuidado. Padronizar tanto o termo quanto a descrição para minúsculas antes de comparar resolve, deixando a busca amigável, como o usuário espera.
Quantos conceitos do curso essas funções usam?
Muitos, juntos. Concluir usa dicionário, lista, índice, guarda, validação e caso de borda. Filtrar usa laço e decisão. Buscar usa busca linear, texto e padronização de caixa. Nenhum é novo; o valor do projeto é ver os conceitos se combinarem com naturalidade para resolver um problema real.

Fontes

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