Article image

GT

Guilherme Torres24/08/2023 17:36
Compartilhe

Calculadora básica com Dart

    Boa tarde pessoal!

    Hoje venho contar uma pequena trajetória para o desenvolvimento de uma calculadora via terminal, feita com a linguagem Dart, linguagem qual estou tendo a oportunidade de aprender com o Santander Bootcamp 2023 - Mobile com Flutter.

    Por mais que de Flutter e Mobile não tenha nada rs, a base deles é o Dart, então resolvi me desafiar para desenvolver com ele para ter alguns problemas, resolvê-los e me aperfeiçoar. O mais divertido foi ir desenvolvendo ela, e em paralelo assistindo as aulas, pois todas as minhas dúvidas de como fazer, iam sendo respondidas.

    Então vamos lá:

    Primeira versão

    A primeira versão foi feita junto ao professor Danilo. Quando vi que a aula seria para desenvolver uma calculadora, resolvi iniciar antes da aula e caso surgisse alguma dúvida, via uma parte da aula para aprender.

    O que eu não esperava era que seria tão no inicio rs. "Como faço para ter o input do usuário no terminal?", então fui ver a aula e descobri que era da seguinte forma:

    var input = stdin.readLineSync(encoding: utf8);
    
    Onde o 'stdin' é a entrada padrão do programa. Ela é usada para receber dados da linha de comando ou da entrada do usuário.
    O 'readLineSync()' é uma função usada para ler uma linha de entrada do usuário. O método readLineSync() pausa o programa e aguarda que o usuário insira uma linha de texto, e o 'encoding: utf8' é um parâmetro opcional para a função readLineSync(). O "utf8" aqui refere-se à codificação de caracteres.

    Então o código já estava assim:

    import 'dart:convert';
    import 'dart:io';
    
    var typeExpression;
    var typeExpressionToInt;
    
    void main(List<String> arguments) {
    print("Bem vindo a calculadora Dart");
    print("Que tipo de operação você deseja fazer com 2 números?");
    
    
    print("Digite a numeração da sua escolha:\n1- Soma\n2- Subtração\n3- Divisão\n4- Multiplicação");
    
    
    typeExpression = stdin.readLineSync(encoding: utf8);
    typeExpressionToInt = int.parse(typeExpression);
    }
    

    Acima foi o que fiz junto a aula, depois pausei e fiz os próximos passos:

    print("Digite o primeiro número:");
    var n1 = stdin.readLineSync(encoding: utf8);
    n1ToDouble = double.parse(n1 ?? "0.0");
    
    print("Digite o primeiro número:");
    var n1 = stdin.readLineSync(encoding: utf8);
    n1ToDouble = double.parse(n1 ?? "0.0");
    

    Depois de testar com prints para ver se o valor estava sendo atribuído corretamente, parti para as operações:

    if (typeExpressionToInt == 1) {
      result = "O resultado da soma é ${n1ToDouble + n2ToDouble}";
    } else if (typeExpressionToInt == 2) {
      result = "O resultado da subtração é ${n1ToDouble - n2ToDouble}";
    } else if (typeExpressionToInt == 3) {
      result = "O resultado da divisão é ${n1ToDouble / n2ToDouble}";
    } else if (typeExpressionToInt == 4) {
      result = "O resultado da multiplicação é ${n1ToDouble * n2ToDouble}";
    }
    

    Fui ver um pouco mais das aulas, e aí o professor usou 'switch' no lugar do 'if', no fim ficou assim:

    switch (typeExpressionToInt) {
      case 1:
        result = "O resultado da soma é ${n1ToDouble + n2ToDouble}";
        break;
      case 2:
        result = "O resultado da subtração é ${n1ToDouble - n2ToDouble}";
        break;
      case 3:
        result = "O resultado da divisão é ${n1ToDouble / n2ToDouble}";
        break;
      case 4:
        result = "O resultado da multiplicação é ${n1ToDouble * n2ToDouble}";
        break;
    }
    

    E para imprimir os resultados, um simples print:

    print(result);
    

    Tudo funcionava (quase) perfeitamente, mas existia muitos possíveis erros e um código muito amador.

    Isso me incomodou e então parti para as melhorias:

    1. Exceções para caso fosse digitado algo fora das opções de operação e nos números da operação;
    2. Funções para melhor organização.

    Segunda Versão

    Demorou bastante para eu relembrar das funções recursivas, foram muitas perguntas para o ChatGPT e rush nas aulas para ver se falava algo que me ajudasse na solução. Por sorte o professor apresentou elas e depois o 'try' e 'catch', então consegui desenvolvê-lás.

    Essa foi a função para tratar o input do tipo de operação:

    void choiceMathOperation() {
    print(
        "Digite a numeração da sua escolha:\n1- Soma\n2- Subtração\n3- Divisão\n4- Multiplicação");
    
    
    typeExpression = stdin.readLineSync(encoding: utf8);
    
    
    try {
      typeExpressionToInt = int.parse(typeExpression);
    } catch (e) {
      print('Essa opção não existe. Tente novamente.');
      choiceMathOperation(); // Recursividade
    }
    
    
    if (typeExpressionToInt == 1 ||
        typeExpressionToInt == 2 ||
        typeExpressionToInt == 3 ||
        typeExpressionToInt == 4) {
    } else {
      print('Essa opção não existe. Tente novamente.');
      choiceMathOperation(); // Recursividade
    }
    }
    

    E então transformei tudo em função, fazendo o tratamento de erros e a recursividade:

    void choiceFirstNumber() {
    print("Digite o primeiro número:");
    var n1 = stdin.readLineSync(encoding: utf8);
    
    
    try {
      n1ToDouble = double.parse(n1 ?? "0.0");
    } catch (e) {
      print("Apenas números são permitidos, tente novamente.");
      choiceFirstNumber(); // Recursividade
    }
    }
    
    
    void choiceSecondNumber() {
    print("Digite o segundo número:");
    var n2 = stdin.readLineSync(encoding: utf8);
    
    
    try {
      n2ToDouble = double.parse(n2 ?? "0.0");
    } catch (e) {
      print("Apenas números são permitidos, tente novamente.");
      choiceFirstNumber(); // Recursividade
    }
    }
    

    Para as operações de fato:

    sum(number1, number2) {
    result = "O resultado da soma é ${number1 + number2}";
    return result;
    }
    
    
    sub(number1, number2) {
    result = "O resultado da subtração é ${number1 - number2}";
    return result;
    }
    
    
    mult(number1, number2) {
    result = "O resultado da multiplicação é ${number1 * number2}";
    return result;
    }
    
    
    div(number1, number2) {
    result = "O resultado da divisão é ${number1 / number2}";
    return result;
    }
    

    E no fim a minha main(), ficou assim:

    import 'dart:convert';
    import 'dart:io';
    
    
    var n1;
    var n2;
    var result;
    var typeExpression;
    var typeExpressionToInt = 0;
    double n1ToDouble = 0;
    double n2ToDouble = 0;
    
    void main(List<String> arguments) {
    print("Bem vindo a calculadora Dart");
    print("Que tipo de operação você deseja fazer com 2 números?");
    
    
    choiceMathOperation();
    
    
    choiceFirstNumber();
    
    
    choiceSecondNumber();
    
    
    switch (typeExpressionToInt) {
      case 1:
        sum(n1ToDouble, n2ToDouble);
        break;
      case 2:
        sub(n1ToDouble, n2ToDouble);
        break;
      case 3:
        div(n1ToDouble, n2ToDouble);
        break;
      case 4:
        mult(n1ToDouble, n2ToDouble);
        break;
    }
    
    
    print("-----------------------------------");
    print(result);
    }
    

    Um código limpo, onde eu achei bem auto-explicativo, intuitivo e o melhor: Funcional!

    Obrigado por ler até aqui, fico grato. Espero ter despertado interesse, e caso já tenha pensado em uma melhora para esse código, fique a vontade para comentar, ou então fazer um fork no meu repositório do gitHub torressg/DartCalculator

    Compartilhe
    Comentários (0)