Escreva a função contem(array, numero) que nos diz se um array contém um determinado elemento. contem([1, 6, 7, 6], 7) true contem([1, 6, 7, 6], 6) true contem([], 7) false contem([8, 5], 7) false Escrevi assim function contem(elemento,numero){ var aux = 0; for(var i=0; i<10; i++){ if (numero === elemento[i]){ aux = elemento[i]; } } if (aux > 0 ) { return true; } } Porém está dando erro
Envie sua primeira dúvida gratuitamente aqui no Tira-dúvidas Profes. Nossos professores particulares estão aqui para te ajudar.
Olá Diogo,
Vou dividir a resposta em partes, e no final eu vou fazer algumas consideracões e dicas de melhoria de código, beleza?
1º ponto - Eu testei a sua função aqui e ela não apresenta erro de execução, e sim uma falha de algoritmo. Isso quer dizer que você precisará mudar algumas coisas no código para ele responder de forma esperada.
2º ponto - Basicamente seu algoritmo utiliza uma variável auxiliar 'aux' e itera sobre o array 'elemento' e quando acha o 'numero' você atribui este a sua variável auxiliar. Depois disso você faz uma verificação para ver se aux é maior que 0. Até esse ponto, o que você precisaria fazer é apenas colocar um else depois do if.
if(aux > 0) {
return true;
} else {
return false;
}
3º ponto - Porém, se 'aux' for um número menor ou igual a 0, você nunca vai encontrar esse número, pois 'aux' só procura por números maiores que 0. Uma das formas de se resolver isso seria simplesmente usar a variável 'aux' como uma booleana. Dessa forma o código ficaria assim:
var aux = false;
for(var i=0; i<10; i++){
if (numero === elemento[i]){
aux = true; // Se encontrar o elemento coloca true aqui.
}
}
if(aux) {
return true;
else {
return false;
}
4º ponto - Seu loop for só vai até 10. Caso eu passe um array com mais de 10 elementos seu código, ele não vai operar corretamente. Para isso vamos dizer que i irá iterar até que seja igual ao tamanho do array. Como fazer isso? Usando a propriedade 'length' que todo array tem.
for(var i=0; i<elemento.length; i++){ // Agora sua função pode receber arrays de qualquer tamanho que ela irá responder corretamente.
if (numero === elemento[i]){
aux = true;
}
}
5º ponto - Só com as soluções acima seu código já estaria rodando perfeitamente. Porém, para que seu código não tenha que ficar rodando o loop caso o array fosse muito grande, você pode colocar uma declaração 'break' para que seu loop for pare a execução assim que encontrar o número procurado.
for(var i=0; i<elemento.length; i++){
if (numero === elemento[i]){
aux = true;
break; // Dessa forma seu loop vai parar quando encontrar o elemento e ir direto para o retorno da função.
}
}
Veja como ficaria o código final com as modificações até agora:
function contem(elemento,numero){
var aux = false;
for(var i=0; i<elemento.length; i++){
if (numero === elemento[i]){
aux = true;
break;
}
}
if(aux) {
return true;
} else {
return false;
}
}
Bom é isso. Se quiser fazer rodar corretamente só usar o código acima. Porém..... Pode esse código pode ser drasticamente melhorado. Vamos ver como? Vou tentar colocar as melhorias em dois níveis: superficial e profunda.
MELHORIA SUPERFICIAL
1º ponto - Primeiramente, eu aconselho evitar ao máximo o uso da palavra-chave var para declarar variáveis. Principalmente por causa do hoisting (mas não somente por isso). Caso não saiba o que é hoisting eu tenho um vídeo no meu canal no YouTube (Brazilian Dev) onde eu explico. Ou você pode acessar uma fonte oficial que é o site MDN (https://developer.mozilla.org/pt-BR/docs/Glossario/Hoisting).
Então o que é recomendado no JavaScript moderno? Use sempre let e const. let para valores mutáveis e const para valores imutáveis (ou objetos e arrays). No caso específico do seu usaremos let porque estamos trabalhando com booleano, caso fosse array seria const.
let aux = false;
for(let i=0; i<10; i++)
2º ponto - Semanticamente o nome do seu primeiro parâmetro está incorreto. Se você está passando um array (ou seja, uma lista), então nada mais justo que usar um nome que demonstre isso no código. É muito importante atentar para que seu código seja legível e compreensível para que qualquer outra pessoa que pegue consiga entender o que você escreveu. Então vamos alterar o parâmetro 'elemento' para 'listaNumeros', blz?
function contem(listaNumeros,numero){
// código aqui...
}
3º ponto - No loop for você pode fazer tudo em uma linha usado a expressão ternária.
for(let i=0; i<listaNumeros.length; i++){
aux = numero === listaNumeros[i] ? true : false;
}
4º ponto - Em javaScript moderno podemos usar arrow functions que reduzem o tamanho de nossas funções e tem a capacidade de se acoplar ao escopo onde forem executadas (assunto avançado, apenas comentário). Arrow functions são declaradas usando uma seta '=>' e após declararmos, nesse caso, geralmente atribuimos a uma variável.
const contem = (listaNumeros,numero) => {
//código aqui....
}
5º ponto - Na verificação do valor encontrado (o if else) pode ser um ternário redundante, ou simplesmente o retorno da variável que já é booleana. Já que 'aux' é uma booleana e o valor que a função 'contem' precisar retornar é um booleano, então vamos ficar com a segunda opção.
return aux ? true : false; // redundante
return aux; // melhor assim =)
Resultado final da melhoria superficial:
const contem = (listaNumeros,numero) => {
let aux = false;
for(let i=0; i<listaNumeros.length; i++){
if(numero === listaNumeros[i]) {
aux = true;
break;
}
}
return aux;
}
MELHORIA PROFUNDA
Como é apenas avançado eu vou colocar apenas o código aqui explicando de forma bem superficial para que você possa se aprofundar na pesquisa.
const contem = (listaNumeros, numero) => listaNumeros.indexOf(numero) > -1 ? true : false;
Acima temos a forma simplificada de uma arrow function com um método de busca de array (indexOf) que retorna -1 caso não encontre o elemento, e o número do índice caso encontre. E com base nisso, é usado um ternário para retornar o booleano.
Então é isso Diego. Espero ter sanado suas dúvidas. Bons estudos.
Envie sua primeira dúvida gratuitamente aqui no Tira-dúvidas Profes. Nossos professores particulares estão aqui para te ajudar.
Pra resolver o problema, vc faz com q a função, inicialmente, verifique se a matriz é vazia
function contem(arr, valor) {
// Verifica se matriz é vazia, em cujo caso retornamos false para indicar que o valor não está contido nela
if (arr == []) return false
// Em seguida, percorremos a matriz item a item (usando o índice i e verificando se o item corresponde ao valor
for (i = 0; i < arr.length; i++)
// Se o item for igual, retornamos true
if (arr[i] == valor) return true
}
// Uma vez verificados todos os itens, e atingido o final da matriz, retornamos false, pois o valor não foi encontrado
return false
}
Envie sua primeira dúvida gratuitamente aqui no Tira-dúvidas Profes. Nossos professores particulares estão aqui para te ajudar.