1
resposta

[Projeto] HORA DA PRÁTICA

Me distanciei um pouco das atividades propostas da hora da prática XD
Estou aberto para conselhos e dicas de como fazer um código mais eficiente etc... :)
Em resumo, o código me permite fazer um Login, cadastrar nome e nota de aluno e acessar a média das notas.
Segue o código:

using System;
using System.Linq;
Dictionary<string, List> Alunos = new Dictionary<string, List>();
Dictionary<string, int> Login = new();

void TelaInicial()
{
Console.WriteLine(@"
██████╗░░█████╗░██████╗░████████╗░█████╗░██╗░░░░░  ██████╗░███████╗  ███╗░░██╗░█████╗░████████╗░█████╗░░██████╗
██╔══██╗██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗██║░░░░░  ██╔══██╗██╔════╝  ████╗░██║██╔══██╗╚══██╔══╝██╔══██╗██╔════╝
██████╔╝██║░░██║██████╔╝░░░██║░░░███████║██║░░░░░  ██║░░██║█████╗░░  ██╔██╗██║██║░░██║░░░██║░░░███████║╚█████╗░
██╔═══╝░██║░░██║██╔══██╗░░░██║░░░██╔══██║██║░░░░░  ██║░░██║██╔══╝░░  ██║╚████║██║░░██║░░░██║░░░██╔══██║░╚═══██╗
██║░░░░░╚█████╔╝██║░░██║░░░██║░░░██║░░██║███████╗  ██████╔╝███████╗  ██║░╚███║╚█████╔╝░░░██║░░░██║░░██║██████╔╝
╚═╝░░░░░░╚════╝░╚═╝░░╚═╝░░░╚═╝░░░╚═╝░░╚═╝╚══════╝  ╚═════╝░╚══════╝  ╚═╝░░╚══╝░╚════╝░░░░╚═╝░░░╚═╝░░╚═╝╚═════╝░");
Console.WriteLine("\nDigite a opção desejada:");
Console.WriteLine(@"
1 - Cadastrar usuário
2 - Cadastrar aluno e notas do aluno
3 - Acessar média do aluno
4 - Sair
");
int opcaoEscolhida = int.Parse(Console.ReadLine()!);
switch (opcaoEscolhida)
{
case 1: CadastrarUsuario();
break;
case 2: CadastrarAluno();
break;
case 3: AcessarMediaAluno();
break;
case 4: Console.WriteLine("Até mais!");
break;
default: Console.WriteLine("Opção inválida");
break;
}
}
void CadastrarUsuario()
{
Console.Clear();
Console.WriteLine("CADASTRO DE USUÁRIO\n");
Console.Write("Digite seu usuário: ");
string usuario = Console.ReadLine()!;
Console.Write("Digite sua senha (apenas números): ");
int senha = int.Parse(Console.ReadLine()!);
Console.WriteLine("\nUsuário cadastrado com sucesso!");
Login.Add(usuario, senha);
Thread.Sleep(1000);
Console.Clear();
TelaInicial();

}
void CadastrarAluno()
{
Console.Clear();
LoginSenha();
Console.Clear();
Console.WriteLine("CADASTRO DE ALUNO\n");
Console.Write("Digite o nome de um aluno para cadastrar: ");
String NomeDoAluno = Console.ReadLine()!;
if (!Alunos.ContainsKey(NomeDoAluno))
{
Alunos.Add(NomeDoAluno, new List());
}
Console.Write($"Quantas notas você deseja cadastrar para {NomeDoAluno}? ");
if (int.TryParse(Console.ReadLine(), out int quantidade))
{
for (int i = 1; i <= quantidade; i++)
{
Console.Write($"Digite a nota {i}: ");

        if (double.TryParse(Console.ReadLine(), out double nota))
        {
            Alunos[NomeDoAluno].Add(nota);
        }
        else
        {
            Console.WriteLine("Valor inválido! Esta nota será ignorada.");
            i--;
        }
    }
}

Console.WriteLine($"\nCadastro de {NomeDoAluno} finalizado com {Alunos[NomeDoAluno].Count} notas.");
Thread.Sleep(2000);
Console.Clear();
TelaInicial();

}
void AcessarMediaAluno()
{
Console.Clear();
LoginSenha();
Console.Clear();
Console.WriteLine("MÉDIA DO ALUNO");
Console.Write("Digite o nome do aluno para acessar sua média de notas: ");
String AlunoDigitado = Console.ReadLine()!;
if (Alunos.ContainsKey(AlunoDigitado))
{
double media = Alunos[AlunoDigitado].Average();
Console.Write($"A média do {AlunoDigitado} é: {media} ");
Console.WriteLine("\nAperte qualquer tecla para voltar ao menu principal.");
Console.ReadKey();
Console.Clear();
TelaInicial();

}
else
{
    Console.WriteLine("Aluno não encontrado!");
    Thread.Sleep(1000);
    Console.Clear();
    TelaInicial();
}

}
void LoginSenha()
{
Console.WriteLine("FAÇA O LOGIN");
Console.Write("\nDigite seu usuário: ");
String usuario = Console.ReadLine()!;
if (Login.ContainsKey(usuario))
{
Console.Write("Digite sua senha: ");
int senha = int.Parse(Console.ReadLine()!);
if (Login[usuario] == (senha))
{
Console.WriteLine("Login realizado com sucesso!");
}
else
{
Console.WriteLine("Senha não encontrada!");
Thread.Sleep(700);
Console.Clear();
TelaInicial();
}
}
else
{
Console.WriteLine("Usuário não encontrado! ");
Thread.Sleep(700);
Console.Clear();
TelaInicial();
}
}

TelaInicial();

1 resposta

Olá Jordan, tudo bem?

Ficou muito legal sua implementação! Fugir um pouco do roteiro ajuda demais a fixar os conceitos. Gostei bastante de como você usou o Dictionary para gerenciar usuários e alunos simultaneamente, e o uso do .Average() do LINQ deixou o cálculo da média bem elegante. Uma dica para os próximos passos: tente substituir a chamada recursiva do menu (TelaInicial() chamando Cadastrar() que chama TelaInicial()) por um laço while. Isso evita o acúmulo de memória na pilha (Stack) e deixa o programa mais robusto. Parabéns pelo projeto!

Atualmente estou terminando o curso de programação em python, e aprendi o uso de repetições e loops com o professor Fabrício Carrara, dessa forma, seguem dicas aprandidas aqui mesmo no Alura:

Para o seu código ficar ainda mais "pro", aqui estão 3 pontos de melhoria:

  1. Cuidado com a Recursão Infinita No seu código, a função TelaInicial chama CadastrarUsuario, que no final chama TelaInicial de novo. Isso cria uma "pilha" de funções que nunca fecham. Se o usuário usar o programa por muito tempo, ele pode dar um erro de StackOverflow.

Como resolver: Use um laço while (opcao != 4) dentro da sua função principal.

  1. Consistência na Validação (TryParse) Você usou int.TryParse para a quantidade de notas (muito bom!), mas usou int.Parse na senha e no menu. Se o usuário digitar uma letra sem querer onde deveria ser um número, o programa vai "crashar".

Dica: Sempre que o input vier do teclado (Console.ReadLine), o TryParse é seu melhor amigo para evitar que o programa feche sozinho.

  1. O tipo da Senha Você definiu a senha como int. Na prática, senhas quase sempre são tratadas como string.

Por quê? Porque senhas podem começar com zero (ex: 00123), e se for um int, o sistema vai salvar apenas 123.

Exemplo de como ficaria a estrutura com Loop:

C#
bool exibirMenu = true;
while (exibirMenu)
{
        Console.WriteLine("1 - Cadastrar...");
// ... restante do menu

string opcao = Console.ReadLine()!;
switch (opcao)
    {
            case "1": 
                    CadastrarUsuario(); // A função faz o que deve e volta pra cá
                    break;
            case "4": 
                    exibirMenu = false;
                    break;
            default:
                    Console.WriteLine("Opção inválida");
                    break;
    }
}

Espero ter ajudado, abraço.