弹跳球:弹跳次数和加速距离

时间:2017-03-05 19:34:42

标签: javascript while-loop

我收到了一个有趣的JavaScript练习练习,我正在努力理解。下面的问题(截图)需要通过while循环来解决。

  

球的恢复系数,0到1之间的数字,表示当球击中刚性表面时保存多少能量。例如,系数为.9意味着弹跳球在每次弹跳后将升至其先前高度的90%。

     

编写程序以输入恢复系数和以米为单位的初始高度,并报告球在从其初始高度下降到高于10厘米的高度之前弹跳的次数。同时报告在此之前球的总行进距离。

     

网球,篮球,超级球和垒球的恢复系数分别为.7,.75,.9和.3。

我正在尝试使用下面的代码来完成此操作,但它只是挂起。

 function code1() {
  var heightM = getInputOne();
  var heightCm = heightM * 100;
  var coefficient = getInputTwo();
  var distance = getInputOne();
  var bounce = 0;

  while (heightCm >= 10) {
    bounce = bounce + 1;
    distance = distance + (heightM * coefficient * 2);
    heightCm = heightCm * coefficient;
  }
  console.log(bounce);
  console.log(distance);

}

以下是在其中调用的函数

// Return the text in the 'In 1:' box
function getInputOne() {
  var input = getElement("inOne");
  return input.value;
}

// Return the text in the 'In 2:' box
function getInputTwo() {
  var input = getElement("inTwo");
  return input.value;
}

任何有关此的帮助将不胜感激。另外,请告诉我其他数据可能有用。

1 个答案:

答案 0 :(得分:1)

有一些问题:

  • input.value属性读取的值是字符串,而不是数字。这会影响+运算符在以下表达式中的工作方式:

    distance = distance + (heightM * coefficient * 2);
    

    由于distance是一个字符串,+是串联,而不是加法。所以distance只会增长一串数字。

  • 虽然您在每次迭代中都会调整heightCm,但您不会对heightM执行相同操作。它保持原始值,因此距离计算错误。

  • 您应该检查coefficient的输入值是否在限制范围内。如果允许值为1或更大,那么计算出的高度将在循环的每次迭代中增加,这将使其挂起。

所以我会建议这段代码:

function getBounces(heightM, coefficient) {
  var distance = heightM; // avoid reading input twice
  var bounce = 0;

  while (heightM >= 0.10) { // just compare with meters...
    bounce = bounce + 1;
    heightM = heightM * coefficient;
    distance = distance + heightM * 2;
    if (bounce > 100) throw "error";
  }
  return [bounce, distance];
}

document.getElementById('calc').addEventListener('click', function() {
  var heightM = getInputOne();
  var coefficient = getInputTwo();
  if (coefficient >= 1 || coefficient < 0) {
    alert('invalid input for coefficient');
    return;
  }
  var result = getBounces(heightM, coefficient);
  outputResults(result[0], result[1]);
});


// Return the text in the 'In 1:' box
function getInputOne() {
  var input = document.getElementById("inOne");
  return +input.value; // add the + for conversion to number
}

// Return the text in the 'In 2:' box
function getInputTwo() {
  var input = document.getElementById("inTwo");
  return +input.value; // add the + for conversion to number
}

function outputResults(bounce, distance) {
  var output = document.getElementById("bounce");
  output.textContent = bounce;
  output = document.getElementById("dist");
  output.textContent = distance.toFixed(2);
}
Height: <input id="inOne">m<br>
Coefficient: <input id="inTwo"> (0 ... 0.99)<br>
<button id="calc">Calculate</button>
<br>
Bounces: <span id="bounce"></span><br>
Distance: <span id="dist"></span>m<br>