Sobre js

JavaScript Geral

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

Foto de Diego S.
Diego perguntou há 4 anos

Sabe a resposta?

Ganhe 10 pts por resposta de qualidade
Responder dúvida
2 respostas
1
votos
1 usuário votou nessa resposta como útil.
Professor Paulo R.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 4 anos
Melhor resposta
Essa foi a melhor resposta, escolhida pelo autor da dúvida

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 uma dúvida gratuitamente

Envie sua primeira dúvida gratuitamente aqui no Tira-dúvidas Profes. Nossos professores particulares estão aqui para te ajudar.

0
votos
Nenhum usuário votou nessa resposta como útil.
Professor Angelo C.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 4 anos

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
}

Professores particulares de JavaScript

+ Ver todos
Encontre professor particular para te ajudar nos estudos
R$ 150 / h
Paulo R.
Rio de Janeiro / RJ
Paulo R.
4,3 (6 avaliações)
Horas de aulas particulares ministradas 7 horas de aula
Tarefas resolvidas 4 tarefas resolvidas
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
JavaScript - Estrutura Condicional e operadores lógicos. Expressões lógicas. JavaScript - Back-End JavaScript Básico
Graduação: Análise e Desenvolvimento de Sistemas (UNICARIOCA)
Desenvolvedor de Sistemas Fullstack. Aulas de JavaScript/Nodejs, Programação, Informática Geral, HTML, CSS.
R$ 70 / h
Vinícius B.
Santo André / SP
Vinícius B.
5,0 (13 avaliações)
Horas de aulas particulares ministradas 21 horas de aula
Tarefas resolvidas 5 tarefas resolvidas
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
JavaScript - Estrutura Condicional e operadores lógicos. Expressões lógicas. JavaScript - Estrutura de Repetição Condicional JavaScript - Back-End
MBA: Business Intelligence (Faculdade Descomplica)
Te ensino a programar. Professor de programação, com 5 anos de atuação em .net, sql, entity framework, scrum etc.
R$ 50 / h
Gustavo A.
Campina Grande / PB
Gustavo A.
5,0 (2 avaliações)
Horas de aulas particulares ministradas 7 horas de aula
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
JavaScript - Estrutura Condicional e operadores lógicos. Expressões lógicas. JavaScript Básico JavaScript - CSS
Graduação: Engenharia da Computação (IFPB - Campus Campina Grande )
Desenvolvedor web python e javascript. Acompanhamento particular em python, html,css e javascript