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).