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:
- Exceções para caso fosse digitado algo fora das opções de operação e nos números da operação;
- 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