寻找无限循环中要求的数字的算术平均值

Finding arithmetic mean of numbers asked in an infinite loop

我需要达到的条件是:

  1. 脚本在无限循环中要求输入 1 到 100 之间的数字(在提示中)
  2. 如果用户输入 NaN、空字符串或超出范围的数字,它会再次要求输入数字
  3. 如果用户按下取消键,显示一个警告,其中包含输入的数字数量及其算术平均值
  4. 我不会用数组!

这是我所拥有的,我知道我在这里遗漏了一些关键逻辑,有什么建议吗?

  while (true) {
    var userInput = prompt("Enter a number between 1 and 100:");
    var num = parseInt(userInput, 10);
    if (num >= 1 && num <= 100) {
      var nums = 0;
      nums += num;
      var counter = 0;
      counter++;
    } else if (userInpuft === null) {
      alert(nums / counter);
      alert(counter);
      break;
    }
  }

如果您不能使用数组,我想另一种方法是将值存储在对象中:

let counter = 0;
const nums = {};
while (true) {
  var userInput = prompt("Enter a number between 1 and 100:");
  var num = parseInt(userInput, 10);
  if (!(num >= 1 && num <= 100)) {
    // Invalid:
    continue;
  }
  nums[counter] = num;
  counter++;
  const allNumsSoFar = Object.values(nums);
  const mean = allNumsSoFar.reduce((a, b) => a + b) / allNumsSoFar.length;
  alert('Mean: ' + mean);
}

如果这也不允许,您可以跟踪到目前为止输入的数字总数和数量:

let numCount = 0;
let sumSoFar = 0;
while (true) {
  var userInput = prompt("Enter a number between 1 and 100:");
  var num = parseInt(userInput, 10);
  if (!(num >= 1 && num <= 100)) {
    // Invalid:
    continue;
  }
  numCount++;
  sumSoFar += num;
  const mean = sumSoFar / numCount;
  alert('Mean: ' + mean);
}

您可以考虑使用适当的模式而不是 prompt,因为 prompt 对用户非常不友好:

let numCount = 0;
let sumSoFar = 0;
const processNum = () => {
  var num = parseInt(input.value, 10);
  if (!(num >= 1 && num <= 100)) {
    // Invalid:
    return;
  }
  numCount++;
  sumSoFar += num;
  const mean = sumSoFar / numCount;
  output.textContent = 'Mean: ' + mean;
};
<div>Enter a number between 1 and 100:</div>
<input id="input"><button onclick="processNum()">submut</button>

<div id="output"></div>

可以逐步计算一组数字的平均值,而无需在任何地方保存所有数字。您只需要先前的平均值和已输入的数字计数。

考虑公式 mean = total/count。如果您知道 meancount,则可以将等式反转为 total = mean * count

当您获得新号码时,计数加 1,新号码将添加到总数中。所以公式是mean = (mean * (count - 1) + new_number)/count.

let count = 0;
let mean = 0;
while (true) {
  let input = prompt("Enter a number");
  if (input === null) {
    break;
  }
  new_number = parseFloat(input);
  if (!isNaN(new_number) && new_number >= 1 && new_number <= 100) {
    count++;
    mean = (mean * (count - 1) + new_number) / count;
    alert(`Count = ${count}, Mean = ${mean}`);
  }
}