image

Acesse bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Article image

GT

Guilherme Torres24/08/2023 17:36
Compartilhe
Nexa - Análise Avançada de Imagens e Texto com IA na AWSRecomendados para vocêNexa - Análise Avançada de Imagens e Texto com IA na AWS

Calculadora básica com Dart

  • #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
Recomendados para você
Microsoft Certification Challenge #3 DP-100
Decola Tech 2025
Microsoft AI for Tech - Copilot Studio
Comentários (0)
Recomendados para você