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

Cara no curso a funçao `return (base * altura)/2` nao estava escrita com os parenteses e eu vou dar uma olhada e tentar entender esse codigo que voce me forneçeu para adiquirir mais logica obg !!!
Nesse caso específico o parênteses não faz diferença porque a multiplicação e divisão tem a mesma precedência e acabam sendo executados na ordem correta.