Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

pfcneves

Quebrando a cabeça com vetores e matrizes

Recommended Posts

Bom dia pessoal...
Antes de mais quero informar que não entendo quase nada de JavaScript, mas estou a esforçar-me para conseguir concluir uma disciplina de Fundamentos de Programação para a Web... está complicado o negócio.
Enfim, teoricamente este exercício deveria ser resolvido com o recurso a vetores e matrizes, mas eu não estou a ver como, porque o material fornecido pelo Prof é, para não variar, muito mais do que escasso, já para não dizer ridículo.
Mas, seja como for, a questão é a seguinte: Escreva um programa que peça ao usuário 10 números, calcule e mostre a média desses 10 números e mostre ainda quantos, desses números, são maiores que a média.
Tentei resolver usando um FOR, fazendo o seguinte:

var media = 0;   
var soma = 0;  
  
for(var i=1; i<=10; i=i+1)  
{  
  x = prompt("Digite o "+ i +"º número.");  
  soma += x;  
  media = soma/10;  
}  
{  
alert("A média dos números indicados é: " + media );   
}

Mas o resultado foi bem bizarro icon_smile.gif
Alguém pode dar uma luz a esta mente que está muito escura?
Desde já obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro vc precisa usar o array.. hehe

Veja como:

 

var numbers = [],
    i = 0;

for (i = 1; i <= 10; i++) {
  var x = prompt("Digite o "+ i +" numero:");
  numbers.push(x);
}

console.log(numbers);
note que agora numbers é um array com os 10 números.

Dai em diante, e outro lugar vc faz a média e decide mostrar os maiores e tal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelo retorno William...

 

Agora fiquei ainda mais perdido e fiz isto:

var numbers = [],
    i = 0;
var media = 0; 
var soma = 0;
	
	
for (i = 1; i <= 10; i++) {
  var x = prompt("Digite o "+ i +"º numero:");
  numbers.push(x);
}

console.log(numbers);
soma += x;
media = soma / 10;

{
alert("A média dos números indicados é: " + media ); 
}

Não era suposto serem somados todos os valores de X e ao dividi-los por 10 obteria a média desses números?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nops, pq vc não somou.

 

Agora q vc tem o array, vc precisa de outro loop para percorrer os itens dele e fazer a sua média.

 

 

Aperte Ctrl + Shift + J no teu Firefox ou Chrome, e veja a aba Console.

Lá vc verá os erros de sintaxe, e pq trocar "alert" por "console.log" é muito melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas tuas dicas... mas acho que necessito de uma luz mais forte...

 

Coloquei outro loop e tentei fazer a soma e consequentemente a média... o console não dá erro, mostra os números digitados, mas o resultado é zero...

var numbers = [],
    i = 0;
	soma = 0;
	media = 0;
	
for (i = 1; i <= 10; i++) {
  var x = prompt("Digite o "+ i +"º numero:");
  numbers.push(x);
}
console.log(numbers);

for (x; x <= 10; x++) {
	soma += numbers[x];
}
	media = soma / 10; 

document.write("A média dos números é: "+media);

Compartilhar este post


Link para o post
Compartilhar em outros sites

<script>

var numbers = [],

i = 0,

sum = 0,

avg = 0,

j = 10,

min = [],

max = [];

 

for (i = 1; i <= 10; i++) {

var x = parseFloat(prompt("Digite o "+ i +"º numero:"));

numbers.push(x);

 

sum += x;

}

avg = sum / 10;

 

while(j--) {

if (numbers[j] < avg) {

min.push(numbers[j]);

}

if (numbers[j] > avg) {

max.push(numbers[j]);

}

}

 

console.log('Numeros', numbers);

console.log('Media', avg);

console.log('Menores que a media', min);

console.log('Maiores que a media', max);

</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado William,

Funciona direitinho e vai mais além do que era pedido, mas foi bacana porque assim deu para eu conseguir entender um pouco melhor como funcionam as funções.

Já agora, só uma questão, vi que colocaste todos os nomes com abreviatura em inglês, isso é apenas para um entendimento "internacional" da estrutura ou existe outro motivo?

E outra coisa, a escolha do (j) para o loop que extrai os valores que estão acima e abaixo da média foi feita para seguir uma sequência alfabética ou tem outro motivo? Se eu necessitasse de outra variável para outros procedimentos seria lógico escolher a letra (l) ?

Mais uma vez, obrigado pela paciência.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @pfcneves,

 

Na verdade esse código é completamente experimental.

Em produção eu nunca faria assim. (uma coisa embaixo da outra, de forma procedural)

 

Está em inglês por convenção, sempre programamos em inglês.

Está abreviado por preguiça, eu deveria ter sido mais descritivo.

 

Refatorado, e "usável", ficaria assim:

 

<script>
function readNumbers(qnt) {
  var numbers = [];
  for (i = 1; i <= qnt; i++) {
    numbers.push(parseFloat(prompt("Digite o "+ i +"º numero:")));
  }
  return numbers;
}
function calcAverage(numbers) {
  var sum = 0,
      i = numbers.length;

  while(i--) {
    sum += numbers[i]
  }
  return sum/numbers.length;
}
function getLessThanAvg(numbers, avg) {
  var less = [],
      i = numbers.length;
  while(i--) {
    if (numbers[i] < avg) {
      less.push(numbers[i]);
    }
  }
  return less;
}
function getGreaterThanAvg(numbers, avg) {
  var greaters = [],
      i = numbers.length;
  while(i--) {
    if (numbers[i] > avg) {
      greaters.push(numbers[i]);
    }
  }
  return greaters;
}

var numbers = readNumbers(10),
    avg = calcAverage(numbers),
    min = getLessThanAvg(numbers, avg),
    max = getGreaterThanAvg(numbers, avg);


console.log('Numeros', numbers);
console.log('Media', avg);
console.log('Menores que a media', min);
console.log('Maiores que a media', max);
</script>
Note que agora cada "etapa" é uma função, e apartir da linha 40, eu começo a usar essa funções.

Faria assim, por questões de re aproveitamento de código, flexibilidade e "testabilidade".

Agora temos 4 funções isoladas que podem ser testadas e refatoradas separadamente.

 

 

Sobre as variáveis i,j normalmente, se usa i,j,k, e nunca mais do que isso.

Cada variavel deve ter o seu escopo. Eu poderia muito bem repetir o i lá em cima, mas como estava tudo no mesmo escopo, eu evitei isso e fui para o j.

Note que depois de refatorado, o i de uma função não enxerga o outro, então posso usar sem nenhuma preocupação o i novamente. E é assim que deve ser.

 

O caso de usar i,j,k seria para 3 loops encaixados, para percorrer matrizes tridimensionais. E existe uma "regra" em programação que diz, q se vc precisa de mais de 3 loops, então provavelmente vc está fazendo algo errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi William,

Acredita se quiseres, consegui entender mais nesta troca de mensagens que com o material que a faculdade forneceu que é escasso e muito confuso... e como é em EaD piora a coisa porque os tutores só respondem no dia seguinte.

Valeu mesmo... muito obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.