Why is my code giving Undefined?

Asked

Viewed 99 times

-4

Every time I try to run this code the result is always undefined. Explain to me the errors of this code and also help me with the possible solution. inserir a descrição da imagem aqui

let tipo1 = prompt('')
let tipo2 = prompt('')
let tipo3 = prompt('')


let animais = ['aguia', 'pomba', 'homem', 'vaca', 'pulga', 'lagarta', 'sanguessuga', 'minhoca']
let tipo = ['vertebrado', 'ave', 'carnivoro', 'onivoro', 'mamifero', 'herbivoro', 'hematofago', 'invertebrado', 'inseto', 'anelideo']


//aguia
if (tipo1 == tipo[0] || tipo1 == tipo[1] || tipo1 == tipo[2]) {
    if (tipo2 == tipo[0] || tipo2 == tipo[1] || tipo2 == tipo[2]) {
        if (tipo3 == tipo[0] || tipo3 == tipo[1] || tipo3 == tipo[2]) {
            alert(animais[0])
        }
    }
}

//pomba
else if (tipo1 == tipo[0] || tipo1 == tipo[1] || tipo1 == tipo[3]) {
    if (tipo2 == tipo[0] || tipo2 == tipo[1] || tipo2 == tipo[3]) {
        if (tipo3 == tipo[0] || tipo3 == tipo[1] || tipo3 == tipo[3]) {
            alert(animais[1])
        }
    }
}

//homem 
else if (tipo1 == tipo[1] || tipo1 == tipo[3] || tipo1 == tipo[4]) {
    if (tipo2 == tipo[1] || tipo2 == tipo[3] || tipo2 == tipo[4]) {
        if (tipo3 == tipo[1] || tipo3 == tipo[3] || tipo3 == tipo[4]) {
            alert(animais[2])
        }
    }
}

//vaca
else if (tipo1 == tipo[1] || tipo1 == tipo[3] || tipo1 == tipo[5]) {
    if (tipo2 == tipo[1] || tipo2 == tipo[3] || tipo2 == tipo[5]) {
        if (tipo3 == tipo[1] || tipo3 == tipo[3] || tipo3 == tipo[5]) {
            alert(animais[3])
        }
    }
}

//pulga
else if (tipo1 == tipo[6] || tipo1 == tipo[7] || tipo1 == tipo[8]) {
    if (tipo2 == tipo[6] || tipo2 == tipo[7] || tipo2 == tipo[8]) {
        if (tipo3 == tipo[6] || tipo3 == tipo[7] || tipo3 == tipo[8]) {
            alert(animais[4])
        }
    }
}

//lagarta
else if (tipo1 == tipo[7] || tipo1 == tipo[5] || tipo1 == tipo[8]) {
    if (tipo2 == tipo[7] || tipo2 == tipo[5] || tipo2 == tipo[8]) {
        if (tipo3 == tipo[7] || tipo3 == tipo[5] || tipo3 == tipo[8]) {
            alert(animais[5])
        }
    }
}

//sanguessuga
else if (tipo1 == tipo[7] || tipo1 == tipo[9] || tipo1 == tipo[6]) {
    if (tipo2 == tipo[7] || tipo2 == tipo[9] || tipo2 == tipo[6]) {
        if (tipo3 == tipo[7] || tipo3 == tipo[9] || tipo3 == tipo[6]) {
            alert(animais[6])
        }
    }
}

//minhoca
else if (tipo1 == tipo[7] || tipo1 == tipo[9] || tipo1 == tipo[3]) {
    if (tipo2 == tipo[7] || tipo2 == tipo[9] || tipo2 == tipo[3]) {
        if (tipo3 == tipo[7] || tipo3 == tipo[9] || tipo3 == tipo[3]) {
            alert(animais[7])
        }
    }
}

  • Do not solve the problem this way, you will go crazy trying to find all combinations. There are much easier ways, for example BST. I suggest you create a new question by showing the problem, showing how it is doing and asking if there are easier ways to approach this type of problem.

2 answers

2


Running your code, I did not get the error reported.

Either way, you’re complicating the code for nothing. One of the errors was to put all the classifications in the same array, and with that you got lost in the various possible combinations to be tested.

But actually the information follows a hierarchy, so a way to organize it would be:

let classificacao = {
    'vertebrado': {
        'ave': {
            'carnívoro': 'águia',
            'onívoro': 'pomba'
        },
        'mamífero': {
            'onívoro': 'homem',
            'herbívoro': 'vaca'
        }
    },
    'invertebrado': {
        'inseto': {
            'hematófago': 'pulga',
            'herbívoro': 'lagarta'
        },
        'anelídeo': {
            'hematófago': 'sanguessuga',
            'onívoro': 'minhoca'
        }
    }
};
let filo = prompt(`Filo (${Object.keys(classificacao).join(', ')})`);
if (classificacao[filo]) {
    let classe = prompt(`Classe (${Object.keys(classificacao[filo]).join(', ')})`);
    if (classificacao[filo][classe]) {
        let alimentacao = prompt(`Tipo de alimentação (${Object.keys(classificacao[filo][classe]).join(', ')})`);
        if (classificacao[filo][classe][alimentacao]) {
            alert(`Animal encontrado: ${classificacao[filo][classe][alimentacao]}`);
        } else {
            alert('Não foi encontrado nenhum animal com essas características');
        }
    } else {
        alert(`Opção inválida: ${classe}`);
    }
} else {
    alert(`Opção inválida: ${filo}`);
}

That is, the object classificacao has 2 keys, "vertebrate" and "invertebrate". Each of them, in turn, has its respective animal classes (which in turn, has each animal according to its diet).

Therefore, I will read the data one by one, checking if there is such a classification and only proceed if there is one. If it doesn’t exist, I already show an error message and I don’t even read the other information.

I also put in the text of prompt existing options, to make it easier for the user (so he knows the options available to type).

-2

Technically it ran. As you have a continuous if Else if it has any kind of eagle it will enter the if, not running the other if.

Example:

    tipo1 = 'vertebrado'
        tipo2 = 'mamifero'
        tipo3 = 'herbivoro'
     //como tipo1 == tipo[0] retorna true, ele executa o bloco 
        if (tipo1 == tipo[0] || tipo1 == tipo[1] || tipo1 == tipo[2]) {
//como tipo2 == tipo[0] || tipo2 == tipo[1] || tipo2 == tipo[2] retorna false, ele para de executar aqui
            if (tipo2 == tipo[0] || tipo2 == tipo[1] || tipo2 == tipo[2]) {
                if (tipo3 == tipo[0] || tipo3 == tipo[1] || tipo3 == tipo[2]) {
                    alert(animais[0])
                }
            }
        }

//mas como ele executou o bloco do if, ele não testará os demais animais
        //pomba
        else if 

To solve this, test each thing at once ['vertebrate', 'invertebrate'], ['bird', 'mamifero', 'insect', 'anelide'] and ['carnivore', 'omnivore', 'herbivore', 'hematophagus']

Also I suggest using a function and switch for cleaner code.

  • Another problem of your code is that if it does not deal with repeated types. Type test1 = Tipo2 = type3 = 'vertebrate'

  • Thanks for the help, I just didn’t understand much when you put ['vertebrate', 'invertebrate'], ['bird', 'mamifero', 'insect', 'anelideo'] and ['carnivoro', 'onivoro', 'herbivore', 'hematophagus']

  • It is that I find it better to make the selection by steps First step ['vertebrate', 'invertebrate'] Second step ['ave','mamifero','insect','anelide'] Third step ['carnivorous', 'onivorous', 'herbivore', 'hematophagus'] you are able to determine the animal

Browser other questions tagged

You are not signed in. Login or sign up in order to post.