2 codigos para resolver o mesmo problema
Fala turma
estava estudando as funçoes em js e em determinado momento do curso foi dado a mim um problema para resolver e tinha a resoluçao disponivel mas eu nao queria olhar ela pois iria perder a graça
enfim as regras eram simples eu tinha que criar uma calculadora geometricas usando funçoes tipo essa function calcularAreaDoTriangulo()
nao poderia fazer de outra forma entao antes de olhar a resoluçao tentei fazer do meu jeito
meu codigo abaixo:
let opçao = ``
do{
opçao = prompt(`
CALCULADORA GEOMETRICA
1 = area do triangulo
2 = area do retangulo
3 = area do quadrado
4 = area do trapezio
5 = area do circulo
6 = sair...
`)
switch(opçao){
case `1`:
let baseTriangulo = Number(prompt(`Digite a base do triangulo`))
let alturaTriangulo = Number(prompt(`Digite a altura do triangulo`))
function calcularAreaDoTriangulo(){
let resultadoDoTriangulo = (baseTriangulo * alturaTriangulo)/2
return resultadoDoTriangulo
}
alert(calcularAreaDoTriangulo())
break
case `2`:
let baseRetangulo = Number(prompt(`Digite a base do retangulo`))
let alturaRetangulo = Number(prompt(`Digite a altura do retangulo`))
function calcularAreaDoRetangulo(){
let resultadoDoRetangulo = baseRetangulo * alturaRetangulo
return resultadoDoRetangulo
}
alert(calcularAreaDoRetangulo())
break
case `3`:
let ladoDoQuadrado = Number(prompt(`Digite o lado do quadrado`))
function calcularLadoDoQuadrado(){
let resultadoDoQuadrado = ladoDoQuadrado*2
return resultadoDoQuadrado
}
alert(calcularLadoDoQuadrado())
break
case `4`:
let baseMaiorDoTrapezio = Number(prompt(`Digite a base maior do trapezio`))
let baseMenorDoTrapezio = Number(prompt(`Digite a base menor do trapezio`))
let alturaDoTrapezio = Number(prompt(`Digite a altura do trapezio`))
function calcularAreaDoTrapezio(){
let resultadoDoTrapezio = (baseMaiorDoTrapezio + baseMenorDoTrapezio)*alturaDoTrapezio/2
return resultadoDoTrapezio
}
alert(calcularAreaDoTrapezio())
break
case `5`:
let raioDoCirculo = Number(prompt(`Digite o raio do circulo`))
function calcularRaioDoCirculo(){
let raio = Math.pow(raioDoCirculo,2)
let pi = 3.14
let resultadoDoCirculo = pi * raio
return resultadoDoCirculo
}
alert(calcularRaioDoCirculo())
}
}while(opçao !== `6`)
codigo do curso abaixo:
function calcularAreaTriangulo(){
const base = prompt(`Digite a base do triangulo`)
const altura = prompt(`Digite a altura do triangulo`)
return base * altura
}
function calcularAreaRetangulo(){
const base = prompt(`Digite a base do retangulo`)
const altura = prompt(`Digite a altura do retangulo`)
return base * altura
}
function calculaLadoQuadrado(){
const lado = prompt(`Digite o lado do quadrado`)
return lado*lado
}
function calcularAreaTrapezio(){
const baseMaior = Number(prompt(`Informe a base maior`))
const baseMenor = Number(prompt(`Informe a base menor`))
const altura = prompt(`Informe a altura`)
return (baseMaior + baseMenor)*altura/2
}
function calcularRaioCirculo(){
const raio = prompt(`Informe o raio do circulo`)
return 3.14 * raio * raio
}
function exberMenu(){
return prompt(`
1 = calcular area do triangulo
2 = calcular area do retangulo
3 = calcular lado do quadrado
4 = calcular area do trapezio
5 = calcular raio do circulo
6 = sair
`)
}
function executar(){
let opçao = ``
do{
opçao = exberMenu()
let resultado
switch(opçao){
case `1`:
resultado = calcularAreaTriangulo()
break
case `2`:
resultado = calcularAreaRetangulo()
break
case `3`:
resultado = calculaLadoQuadrado()
break
case `4`:
resultado = calcularAreaTrapezio()
break
case `5`:
resultado = calcularRaioCirculo()
break
case `6`:
alert(`Saindo...`)
break
default:
alert(`Opçao invalida`)
break
}
if(resultado){
alert(`Resultado: ${resultado}`)
}
}while(opçao !== `6`)
}
executar()
Bom olhando esses dois codigos lembrei de uma coisa que li em um livro de logica de programaçao "Nao existe so uma forma de resolver um problema" e foi isso que eu pensei
poderiam me falar se estou certo?
obrigado turma !!!
Só uma coisa, não sei se foi erro ao copiar o código do curso, mas a área do triângulo está errada:
function calcularAreaTriangulo(){
const base = prompt(`Digite a base do triangulo`)
const altura = prompt(`Digite a altura do triangulo`)
return base * altura
}
Deveria ser return (base * altura) / 2
.
De qualquer forma, sim, sempre tem várias maneiras de fazer. Eu só questiono na sua solução, se era realmente necessário criar as funções dentro de cada case
. Se for pra ser assim, era melhor nem ter as funções e fazer tudo direto. Por exemplo:
case `1`:
let baseTriangulo = Number(prompt(`Digite a base do triangulo`))
let alturaTriangulo = Number(prompt(`Digite a altura do triangulo`))
alert((baseTriangulo * alturaTriangulo) / 2);
break;
E uma preocupação que vc teve foi converter para número, que não foi feito no código do curso. Claro que o JavaScript converte os valores automaticamente e na maioria das vezes "funciona", mas enfim, eu ainda prefiro fazer a conversão, como vc fez, e ainda acrescentaria uma validação.
Se for pra ter algo mais flexível, poderia ter um mapeamento entre as opções e as respectivas funções (também arrumei os nomes de algumas, como calculaLadoQuadrado
e calcularRaioCirculo
, que acho que deveriam ser respectivamente calcularAreaQuadrado
e calcularAreaCirculo
):
// lê e converte para número, pede para digitar de novo se for inválido
function lerNumero(msg) {
while (true) {
const numero = parseFloat(prompt(msg));
if (isNaN(numero)) {
alert('Não foi digitado um número válido');
} else {
return numero;
}
}
}
function calcularAreaTriangulo() {
const base = lerNumero('Digite a base do triangulo');
const altura = lerNumero('Digite a altura do triangulo');
return (base * altura) / 2;
}
function calcularAreaRetangulo() {
const base = lerNumero('Digite a base do retangulo');
const altura = lerNumero('Digite a altura do retangulo');
return base * altura;
}
function calcularAreaQuadrado() {
const lado = lerNumero('Digite o lado do quadrado');
return lado * lado;
}
function calcularAreaTrapezio() {
const baseMaior = lerNumero('Informe a base maior');
const baseMenor = lerNumero('Informe a base menor');
const altura = lerNumero('Informe a altura');
return (baseMaior + baseMenor) * altura / 2;
}
function calcularAreaCirculo() {
const raio = lerNumero('Informe o raio do circulo');
return 3.14 * raio * raio;
}
// cada opção tem um texto do menu e a respectiva função que é executada
const opcoes = {
'1': ['calcular área do triângulo', calcularAreaTriangulo],
'2': ['calcular área do retângulo', calcularAreaRetangulo],
'3': ['calcular área do quadrado', calcularAreaQuadrado],
'4': ['calcular área do trapézio', calcularAreaTrapezio],
'5': ['calcular área do círculo', calcularAreaCirculo]
};
const opcaoSair = '6';
// constrói a mensagem com base nas opções
let mensagem = '';
for (const [opcao, [msg, _]] of Object.entries(opcoes)) {
mensagem += `${opcao} - ${msg}\n`;
}
mensagem += `${opcaoSair} - Sair`;
while (true) {
const opcao = prompt(mensagem);
if (opcao == opcaoSair) {
alert('Saindo');
break;
} else if (opcao in opcoes) {
alert(`resultado: ${opcoes[opcao][1]()}`); // executa a respectiva função
} else {
alert('opção inválida');
}
}
Assim fica mais fácil adicionar, remover ou até mesmo trocar funcionalidades: basta mudar o objeto opcoes
. O while
continua igual, independente da quantidade de opções - aliás, eu prefiro assim: um loop infinito, que só é interrompido se a opção de sair for escolhida. E repare que para a opção eu não converto para número, pois o objeto opcoes
poderia ter textos como opções.
Outra opção é mudar um pouco o objeto opcoes
para deixar mais claro o que é cada valor:
const opcoes = {
'1': { textoMenu: 'calcular área do triângulo', funcao: calcularAreaTriangulo },
'2': { textoMenu: 'calcular área do retângulo', funcao: calcularAreaRetangulo },
'3': { textoMenu: 'calcular área do quadrado', funcao: calcularAreaQuadrado },
'4': { textoMenu: 'calcular área do trapézio', funcao: calcularAreaTrapezio },
'5': { textoMenu: 'calcular área do círculo', funcao: calcularAreaCirculo }
};
const opcaoSair = '6';
// constrói a mensagem com base nas opções
let mensagem = '';
for (const [opcao, value] of Object.entries(opcoes)) {
mensagem += `${opcao} - ${value.textoMenu}\n`;
}
mensagem += `${opcaoSair} - Sair`;
while (true) {
const opcao = prompt(mensagem);
if (opcao == opcaoSair) {
alert('Saindo');
break;
} else if (opcao in opcoes) {
alert(`resultado: ${opcoes[opcao].funcao()}`); // executa a respectiva função
} else {
alert('opção inválida');
}
}
Ah, e também coloquei ponto-e-vírgula no final das linhas. Pode parecer "frescura", e sei que o JavaScript "aceita" o código sem ponto e vírgula e "funciona", mas isso evita algumas situações bizarras que podem ocorrer se você não usá-los, como essa e essa (veja mais sobre isso aqui).