CSE 210: Programação com Classes

S05 - Projeto: Programa de Introspecção

Visão Geral do Problema

Vivemos em um mundo acelerado, cheio de estresse e ansiedade. Cada um de nós pode se beneficiar ao reservar um tempo para atividades de introspecção, nas quais podemos refletir e relaxar.

A maioria das pessoas concordaria que deveríamos dedicar mais tempo à meditação, mas relativamente poucos o fazem. Pense por um momento em alguns motivos que você acha que impedem as pessoas de fazer isso. Algum programa ou aplicativo poderia ajudar com alguma dessas coisas?

Alguns dos problemas que você considerou podem ter incluído:

Embora possa não resolver todos os problemas que impedem as pessoas de dedicar mais tempo à reflexão, um ótimo programa pode ajudar as pessoas, fornecendo estrutura e instruções para orientá-las em vários exercícios.

Ideia de Solução

Considere um aplicativo que oferece três tipos diferentes de oportunidades de introspecção. Poderia dar alguma orientação e estrutura aos usuários nas seguintes atividades:

O aplicativo também pode ajudar o usuário a monitorar o tempo ou a frequência que ele gasta nessas atividades e fornecer lembretes e avisos gentis.

A interface de usuário de um programa como esse pode ser qualquer coisa, desde um site ou aplicativo móvel até um que seja executado em um relógio inteligente, e pode ser feita em muitos tipos diferentes de cores, formas e estilos. Aprender a desenvolver um programa para resolver problemas do mundo real é a parte mais crítica, então esta tarefa se concentrará nisso, em vez de criar uma interface chamativa.

Especificação

Escreva um programa que forneça as três atividades descritas acima. Ele deve ajudar a trabalhar essas atividades em estágios usando formas básicas de atraso (animação ou contagem regressiva).

Requisitos Funcionais

Seu programa deve fazer o seguinte:

  1. Ter um sistema de menu que permita ao usuário escolher uma atividade.
  2. Cada atividade deve começar com uma mensagem inicial que forneça o nome da atividade, uma descrição, e solicite e defina a duração da atividade em segundos. Em seguida, deve informar ao usuário para se preparar para começar, e então pausar por alguns segundos.
  3. Cada atividade deve terminar com uma mensagem final que informe ao usuário que ele fez um bom trabalho, fazer uma pausa, e depois informar a atividade que ele concluiu, a duração, e fazer uma pausa de alguns segundos antes de terminar.
  4. Sempre que o aplicativo for pausado, ele deve mostrar algum tipo de animação ao usuário, como um indicador de progresso (spinner), um cronômetro de contagem regressiva, ou pontos finais sendo exibidos na tela.
  5. A interface do programa deve permanecer fiel àquela exibida na demonstração em vídeo.
  6. Forneça atividades para reflexão, respiração e listagem, conforme descrito abaixo:
Atividade de Respiração
  1. A atividade deve começar com a mensagem inicial padrão e perguntar qual a duração desejada para a atividade.
  2. A descrição desta atividade deve ser algo como: "Esta atividade ajudará você a relaxar, inspirando e expirando lentamente. Limpe sua mente e concentre-se na sua respiração."
  3. Após a mensagem inicial, o usuário vê uma série de mensagens alternando entre "Inspire..." e "Expire...".
  4. Após cada mensagem, o programa deve pausar por alguns segundos e mostrar uma contagem regressiva.
  5. Ele deve continuar até atingir o número de segundos especificado pelo usuário para a duração.
  6. A atividade deve concluir com a mensagem de encerramento padrão para todas as atividades.
Atividade de Reflexão
  1. A atividade deve começar com a mensagem inicial padrão e perguntar qual a duração desejada para a atividade.
  2. A descrição desta atividade deve ser algo como: "Esta atividade ajudará você a refletir sobre momentos da sua vida em que você demonstrou força e resiliência. Isso ajudará você a reconhecer o poder que você tem e como pode usá-lo em outros aspectos da sua vida."
  3. Após a mensagem inicial, selecione a mensagem aleatória para exibir ao usuário, como:

    • Pense em uma ocasião em que você defendeu outra pessoa.
    • Pense em uma ocasião em que você fez algo realmente difícil.
    • Pense em uma ocasião em que você ajudou alguém necessitado.
    • Pense em uma ocasião em que você fez algo verdadeiramente altruísta.
  4. Após exibir a mensagem, o programa deve pedir para que o usuário reflita sobre questões relacionadas a essa experiência. Essas perguntas devem ser retiradas de uma lista como a seguinte:

    • Por que essa experiência foi significativa para você?
    • Você já fez algo assim antes?
    • Como você começou?
    • Como você se sentiu quando terminou?
    • O que tornou esse momento diferente de outras vezes em que você não teve tanto sucesso?
    • Qual é a sua coisa favorita sobre essa experiência?
    • O que você pode aprender com essa experiência que se aplica a outras situações?
    • O que você aprendeu sobre si mesmo por meio dessa experiência?
    • Como você pode manter essa experiência em mente no futuro?
  5. Após cada pergunta, o programa deve pausar por alguns segundos antes de passar para a próxima. Enquanto o programa estiver pausado, ele deverá exibir uma espécie de indicador de progresso (spinner).
  6. Ele deve continuar mostrando perguntas aleatórias até atingir o número de segundos especificado pelo usuário para a duração da atividade.
  7. A atividade deve concluir com a mensagem de encerramento padrão para todas as atividades.
Atividade de Listagem
  1. A atividade deve começar com a mensagem inicial padrão e perguntar qual a duração desejada para a atividade.
  2. A descrição desta atividade deve ser algo como: "Esta atividade ajudará você a refletir sobre as coisas boas da sua vida, fazendo com que você liste o máximo de coisas que puder em uma determinada área."
  3. Após a mensagem inicial, selecione a mensagem aleatória para exibir ao usuário, como:

    • Quem são as pessoas que você aprecia?
    • Quais são seus pontos fortes pessoais?
    • Quem são as pessoas que você ajudou esta semana?
    • Quando você sentiu o Espírito Santo neste mês?
    • Quem são alguns dos seus heróis pessoais?
  4. Depois de exibir a mensagem, o programa deve fazer uma contagem regressiva de alguns segundos para que o usuário comece a pensar nela. Então, isso deve incentivá-lo a continuar listando itens.
  5. O usuário lista quantos itens puder até atingir a duração especificada por ele no início.
  6. A atividade exibe o número de itens que foram inseridos.
  7. A atividade deve concluir com a mensagem de encerramento padrão para todas as atividades.

Requisitos de Design

Além disso, seu programa deve:

  1. Use herança tendo uma classe separada para cada tipo de atividade com uma classe base para conter quaisquer atributos ou comportamentos compartilhados.
  2. Evite duplicar código em classes onde ele poderia ser colocado em uma classe base.
  3. Siga os princípios de encapsulamento e abstração tendo variáveis membro privadas e colocando itens relacionados na mesma classe.

Simplificações

Para os requisitos básicos, você não precisa se preocupar com o seguinte:

  1. Seu programa não precisa rastrear nenhuma estatística, como quantas vezes ou com que frequência o usuário realizou uma atividade.
  2. Ao receber perguntas ou mensagens aleatórias, você pode simplesmente escolher qualquer uma da lista. Você não precisa se preocupar se ela já foi escolhida ou mesmo se as mensagens forem todas exibidas.

Demonstrando Criatividade e Indo Além dos Requisitos

Atender aos requisitos básicos torna seu programa elegível para receber 93% da nota máxima. Para receber 100% na tarefa, você precisa demonstrar criatividade e superar esses requisitos.

Aqui estão algumas ideias que você pode considerar:

Relate o que você fez para superar os requisitos adicionando uma descrição disso em um comentário no arquivo Program.cs.

Demonstração em Vídeo

O vídeo a seguir demonstra como esse programa deve funcionar:

Link direto: ▶️Demonstração do Programa de Introspecção (5 minutos)

Ajuda com o Código

Você pode achar o código a seguir útil neste projeto:

Pausando

No vídeo de demonstração, você pode ver o programa pausando por um certo período. Isso pode ser feito com o método Thread.Sleep(), que recebe um inteiro como o número de milissegundos para o "thread de execução" atual entrar no modo soneca ou pausar.

O exemplo a seguir mostra como fazer o computador esperar 1 segundo (1000 milissegundos):


Console.WriteLine("Vou dormir por um segundo...");

Thread.Sleep(1000);

Console.WriteLine("Estou de volta!!");
Exibição de Animações

Para exibir uma animação, como o indicador de progresso (spinner) ou o cronômetro de contagem regressiva, você precisa fazer o computador pausar por um período e, em seguida, substituir o caractere anterior por um novo. Isso pode ser feito escrevendo o caractere de retrocesso "\b", que funciona como se estivesse pressionando o botão de seta para a esquerda. Depois, você pode escrever um novo caractere por cima dele.

Como o caractere de retrocesso funciona como se estivesse pressionando o botão de seta para a esquerda, em vez de um retrocesso (backspace), ele não apaga o caractere na tela. Com isso em mente, é comum escrever "\b \b", que se move para a esquerda, escreve um espaço em branco sobre o caractere anterior e depois se move para a esquerda novamente, para que esteja pronto para o novo caractere.

O exemplo a seguir mostra como substituir um caractere após meio segundo:


Console.Write("+");

Thread.Sleep(500);

Console.Write("\b \b"); // Apague o caractere +
Console.Write("-"); // Substitua-o pelo caractere -

Se esse código estivesse em um loop, ele continuaria exibindo e substituindo caracteres.

Trabalhando com Tempo

A linguagem C# tem uma poderosa biblioteca de Data e Hora. Pode ser útil obter a hora atual, adicionar alguns segundos a ela e, então, verificar se a hora atual é menor que a nova hora.

Isso pode ser feito com a classe DateTime. Um objeto com a hora atual pode ser obtido com DateTime.Now. Então, ele tem métodos como .AddSeconds(numeroDeSegundos) e funciona com o operador menor que < como seria de se esperar.

O trecho de código a seguir mostra um exemplo:


DateTime horaInicial = DateTime.Now;
DateTime horaFinal = horaInicial.AddSeconds(5);

Thread.Sleep(3000);

DateTime horaAtual = DateTime.Now;
if (horaAtual < horaFinal)
{
    Console.WriteLine("Ainda não chegamos ao nosso tempo futuro...")
}

O vídeo a seguir mostra como usar esses trechos de código para obter animações de exibição simples.

Link Direto: ▶️Exibição de Animações (12 minutos)

Design

Você trabalhará com seu grupo para criar um design para este programa. Então, cada um escreverá o código do programa individualmente.

Design Final (não abra até depois da reunião de design)

Para fins de referência, aqui está uma cópia do design que foi criado durante a atividade de design.

Para entender as decisões que levaram a esse design, certifique-se de percorrer a atividade de design passo a passo antes de usar esse design para iniciar seu código.

Diagrama de classe do programa de Introspecção

Desenvolver o Programa

No repositório do curso, encontre o projeto Introspeccao na pasta semana05 e escreva seu programa lá.

Envio

  1. Desenvolva o programa usando o princípio de herança conforme descrito acima.
  2. Não se esqueça de descrever tudo o que você fez para superar os requisitos nos comentários do arquivo Program.cs.
  3. Confirme (commit) e envie (push) seu código-fonte para o GitHub.
  4. Verifique se você consegue ver seu código atualizado no GitHub.
  5. No Canvas, envie um link para seu repositório GitHub. No comentário de envio, descreva qualquer coisa que você tenha feito para mostrar criatividade e superar os requisitos básicos.