CSE 210: Programação com Classes

S02 - Projeto: Programa de Diário

Visão Geral do Problema

Muitas pessoas reconhecem o valor de manter um diário para registrar eventos importantes, e muitas até definem isso como uma meta. E, ainda assim, muito poucas pessoas realmente seguem adiante e mantêm um diário consistente.

Pense consigo mesmo por um momento: Quais são alguns motivos pelos quais as pessoas não cumprem seu objetivo de manter um diário? Algum programa ou aplicativo poderia ajudar com alguma dessas coisas?

Alguns dos motivos que você pensou podem incluir os seguintes:

Embora não resolva todos os problemas das pessoas, um ótimo programa ou aplicativo pode ajudar a remover algumas dessas barreiras. Por exemplo, um aplicativo pode lhe dar um lembrete em um determinado horário do dia ou fornecer um link direto para seu documento.

Considere o último desafio mencionado acima, o de se sentir sobrecarregado porque parece que você precisa escrever sobre todos os eventos do dia. Isso parece ser um grande problema para muitas pessoas. Um aplicativo poderia ajudar com isso?

Ideia de Solução

E se o aplicativo Diário mostrasse às pessoas uma pergunta simples para responder todos os dias? Ele também poderia registrar a resposta em algum lugar para elas e até mesmo adicionar elementos como a data automaticamente.

Esses recursos podem ajudar a resolver alguns dos desafios que impedem as pessoas de manter um diário e podem ser incluídos em um aplicativo móvel ou em uma página da web. A interface em si não é tão crítica, mas é importante reconhecer a capacidade de um programa de ajudar a resolver um problema real.

Especificação do Programa

Aqui está a frase reformulada para maior clareza e fluidez:

Nesta tarefa, você desenvolverá um programa para ajudar as pessoas a registrar os eventos do seu dia. O programa fará perguntas, salvará as respostas juntamente com as perguntas e a data correspondente em um arquivo.

Requisitos Funcionais

O programa deverá conter os seguintes recursos:

  1. Escrever um novo registro – Mostre ao usuário uma pergunta aleatória (de uma lista que você criar) e salve a resposta, a pergunta e a data como um Registro.
  2. Exibir o diário – Percorra todos os registros no diário e exiba-os na tela.
  3. Salvar o diário em um arquivo – Solicite ao usuário um nome de arquivo e salve o diário atual (a lista completa de registros) nesse local de arquivo.
  4. Carregar o diário a partir de um arquivo – Solicite ao usuário um nome de arquivo e, em seguida, carregue o diário (uma lista completa de registros) desse arquivo. Isso deve substituir todos os registros atualmente armazenados no diário.
  5. Ter um menu que permita ao usuário escolher essas opções
  6. Sua lista de perguntas deve conter pelo menos cinco perguntas diferentes. Não se esqueça de adicionar suas próprias perguntas à lista, mas as seguintes são alguns exemplos para ajudar você a começar:
    • Quem foi a pessoa mais interessante com quem interagi hoje?
    • Qual foi a melhor parte do meu dia?
    • Como vi a mão do Senhor em minha vida hoje?
    • Qual foi a emoção mais forte que senti hoje?
    • Se eu pudesse fazer uma coisa hoje, o que seria?
  7. Sua interface geralmente deve seguir o padrão mostrado na demonstração em vídeo abaixo.

Requisitos de Design

Além disso, seu programa deve:

  1. Conter classes para os principais componentes do programa.
  2. Conter pelo menos duas classes além da classe Program.
  3. Demonstrar o princípio da abstração usando variáveis membro e métodos adequadamente.

Simplificações

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

  1. Salvar seu arquivo como .csv exige que você manipule vírgulas e aspas no conteúdo adequadamente. Neste ponto, você pode ignorar isso e apenas escolher um símbolo para um separador que você acha que provavelmente não aparecerá no conteúdo (como | ou ~ ou ~|~).
  2. Você não precisa armazenar a data como um objeto DateTime C# real na sua classe ou no arquivo. Você pode simplesmente armazená-lo como uma string.

Demonstrando Criatividade e Indo Além dos Requisitos

Atender aos requisitos básicos torna seu programa elegível para receber 93%. Para receber 100% na tarefa, você precisa demonstrar criatividade e ir além desses requisitos.

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

Relate o que você fez para ir além dos 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 Diário (3 minutos)

Ajuda com o Código

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

Lendo Arquivos de Texto em C#

A maneira mais fácil de ler um arquivo de texto em C# é ler o arquivo inteiro em uma matriz de strings (uma por linha) usando a função System.IO.File.ReadAllLines(). Então, você pode percorrer cada string como faria com qualquer lista.

À medida que você percorre cada string, você pode dividi-la com base em um caractere separador e obter as partes necessárias pelo índice delas.

A seguir mostramos um exemplo de leitura de um arquivo e divisão das strings.


string nomeDoArquivo = "arquivo.txt";
string[] linhas = System.IO.File.ReadAllLines(nomeDoArquivo);

foreach (string linha em linhas)
{
    string[] partes = linha.Split(",");

    string primeiroNome = partes[0];
    string sobrenome = partes[1];
}

Há muitas outras maneiras de trabalhar com arquivos em C#, algumas das quais seriam mais eficientes se o arquivo fosse muito grande e você não quisesse armazená-lo todo na memória de uma vez. Mas essa abordagem funcionará bem para este projeto.

Escrevendo Arquivos de Texto em C#

Você pode criar ou escrever um arquivo de texto em C# usando uma classe chamada System.IO.StreamWriter. Ao criar um objeto desta classe, você pode usar os métodos Write() e WriteLine()da mesma forma que os métodos Console.Write(), exceto que eles gravarão as strings no arquivo em vez escrever no Console.

Para garantir que o arquivo seja fechado e limpo adequadamente quando você terminar, a melhor prática é colocar o objeto StreamWriter em um bloco using. Isso funciona da mesma forma que um bloco with em Python e garante que os recursos sejam limpos quando você sai dessa área do código.

O seguinte mostra um exemplo de como escrever texto em um novo arquivo


// Não se esqueça de colocar isso no topo, para que o C# saiba onde encontrar a classe StreamWriter
using System.IO; 

...

string nomeDoArquivo = "meuArquivo.txt";

using (StreamWriter arquivoSaida = new StreamWriter(nomeDoArquivo))
{
    // Você pode adicionar texto ao arquivo com o método WriteLine
    arquivoSaida.WriteLine("Esta será a primeira linha do arquivo.");
    
    // Você pode usar $ e incluir variáveis como com Console.WriteLine
    string cor = "Azul";
    arquivoSaida.WriteLine($"Minha cor favorita é {cor}");
}
Trabalhando com Datas em C#

C# tem uma classe chamada DateTime, que é usada para trabalhar com datas e horas do dia.

Você pode obter um objeto que representa o dia e a hora atuais com DateTime.Now. Então, ele tem vários métodos que são úteis, como ToShortDateString().


DateTime horaAtual = DateTime.Now;
string dataTexto = horaAtual.ToShortDateString();
Ainda tem dificuldade para ler e gravar arquivos?

O vídeo a seguir mostra o desenvolvimento de um programa que lê e grava uma lista de objetos em um arquivo de maneira semelhante à que você precisará fazer no seu programa:

Lembre-se: Nunca clique em "Depurar Assim Mesmo".

Se houver um erro no seu programa e você tentar executá-lo, o VS Code informará que não é possível criar uma nova versão do programa para execução. Mas ele pode encontrar uma versão antiga da última vez que construiu o programa com sucesso. Se você clicar em "Depurar Assim Mesmo", a versão antiga será executada.

Usando "Depurar Assim Mesmo", você estará executando um programa diferente do seu código atual. Isso causa muita confusão, porque você pode fazer alterações no seu código, mas o programa não mostra as alterações.

Para evitar essas armadilhas, você nunca deve clicar em "Depurar Assim Mesmo", em vez disso, clique em “Anular" e rastreie seus erros, ou clique em “Exibir Erros" para ir diretamente até eles.

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 Diário

Desenvolver o Programa

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

Envio

  1. Desenvolva o programa usando o princípio de Abstração conforme descrito acima.
  2. Não se esqueça de descrever tudo o que você fez para ir além dos requisitos nos comentários do arquivo Program.cs.
  3. Confirme (commit) seu código-fonte e envie-o (push) 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 exceder os requisitos básicos.

Trabalhando com Outras Pessoas

Neste curso, os estudantes são incentivados a ajudar e ensinar uns aos outros. Mas tenha em mente que o objetivo é que você aprenda a escrever esses programas sozinho, não simplesmente entregar um programa que funciona.

Como o objetivo é que você aprenda a escrever esses programas sozinho, você NÃO deve copiar e colar nenhum código de outro estudante ou de um repositório que encontrar online. Da mesma forma, você NÃO deve olhar o código dele e digitá-lo diretamente de uma imagem ou do que você vê na tela. Essa é uma violação do Código de Honra da Universidade, resultando em nota 0 na tarefa ou reprovação na disciplina e não ajudará você a aprender.

Em vez disso, quando você receber ajuda de outra pessoa, você deve tentar entender o princípio do que ela está fazendo e, então, usar isso para ajudá-lo a escrever seu próprio código.

Se você obtiver ajuda de uma página na internet, inclua um link para essa página nos seus comentários.

Caso tenha alguma dúvida sobre isso, por favor, converse com seu instrutor.