1
resposta

[Projeto] Calculadora de operações básicas

// Calculadora de operações básicas
Console.WriteLine("Calculadora de operações básicas.\n");

// solicitando os dados ao usuário 
double primeiroNumero = ValidarInformacao("Digite o primeiro número:");
double segundoNumero = ValidarInformacao("Digite o segundo número:");
char tipoDaOperacao = ValidarOperacao("Informe qual operação você deseja realizar (+, -, *, /):");

// Tratamento de divisão por zero
if (tipoDaOperacao == '/' && segundoNumero == 0)
{
    Console.WriteLine("Erro: Não é possível dividir por zero.");
    return;
}

// Calcula o resultado conforme o operador informado
// Usa switch expression para escolher a operação
double resultado = tipoDaOperacao switch
{
    '+' => primeiroNumero + segundoNumero,
    '-' => primeiroNumero - segundoNumero,
    '*' => primeiroNumero * segundoNumero,
    '/' => primeiroNumero / segundoNumero
};

// exibe o resultado no console
Console.WriteLine($"Resultado: {resultado}");

// funções para validar os dados necessários 
double ValidarInformacao (string msg)
{
    while(true)
    {
        Console.WriteLine(msg);
        string entrada = Console.ReadLine();

        if (double.TryParse(entrada, out double valorConvertido))
        {
            return valorConvertido;
        }
        
        Console.WriteLine("Apenas números são aceitos, tente novamente.\n");
    }
}

char ValidarOperacao (string msg)
{
    
    while (true)
    {
        Console.WriteLine(msg);
        string operador = Console.ReadLine();

        if (operador.Length == 1 && "+-*/".Contains(operador))
        {
            return operador[0];
        }

        Console.WriteLine("Operação inválida. Digite apenas +, -, * ou /.\n");
    }
}
1 resposta

Olá, José. Como vai?

Parabéns pelo código! Você aplicou conceitos de C# muito modernos e demonstrou uma excelente preocupação com a experiência do usuário ao criar funções de validação.

Gostaria de destacar alguns pontos extremamente positivos na sua implementação:

  • Switch Expression: O uso do switch expression (introduzido nas versões mais recentes do C#) deixa o código muito mais limpo e conciso do que o switch tradicional com case e break.
  • TryParse: Utilizar o double.TryParse é a melhor prática para evitar que o programa pare de funcionar (crash) caso o usuário digite um caractere inválido.
  • Modularização: Ao criar os métodos ValidarInformacao e ValidarOperacao, você aplicou o princípio DRY (Don't Repeat Yourself), o que torna o código fácil de manter.

Para complementar seu aprendizado, deixo uma pequena sugestão de segurança técnica:

No seu switch expression, o compilador do C# pode emitir um aviso dizendo que ele não é exaustivo. Isso acontece porque, embora você tenha validado o char antes, o switch tecnicamente precisa saber o que fazer se um caractere diferente chegar lá. Você pode adicionar um discard pattern (_) ao final para tratar qualquer eventualidade:

double resultado = tipoDaOperacao switch
{
    '+' => primeiroNumero + segundoNumero,
    '-' => primeiroNumero - segundoNumero,
    '*' => primeiroNumero * segundoNumero,
    '/' => primeiroNumero / segundoNumero,
    _ => 0 // Valor padrão caso caia em uma operação não mapeada
};

Outro ponto legal: você tratou a divisão por zero com um if logo antes do cálculo. Isso é ótimo! Em aplicações mais robustas, você também poderia tratar isso dentro da própria lógica do switch.

Continue com esse excelente nível de entrega e atenção aos detalhes!

Espero que possa ter lhe ajudado!