#javascript #loops #if-statement #dom
#javascript #циклы #if-statement #dom
Вопрос:
Мне трудно понять, почему мой код не будет работать. Это действительно простая программа, поэтому я уверен, что есть что-то, чего я не вижу или не вижу, но, похоже, я не могу понять это. Пожалуйста, помогите!
Что он должен делать: возьмите два числа и найдите следующее число, которое больше первого числа и также делится на второе число.
Что происходит: по сути, это просто замораживает мой компьютер, кажется, что цикл просто продолжает выполняться без остановки.
JS:
function divisibleBy(first, second) {
var firstNum = document.getElementById('firstNumber').value;
var secondNum = document.getElementById('secondNumber').value;
for (var i = firstNum 1; i > firstNum; i ) {
if (i % secondNum === 0) {
document.getElementById('result').innerHTML = i;
}
}
}
HTML:
<body>
<header>
<h1>Let's Do Some Math!</h1>
<h2>Type in <u>two</u> numbers and let's figure out the next <br>
number greater than those two numbers but with a catch...<br>
the number has to be <u>divisible</u> by the second number you choose.</h2>
</header>
<hr>
<ul>
<li>
<label for="firstNumber">First Number:</label>
<input type="number" id="firstNumber">
</li>
<li>
<label for="secondNumber">Second Number:</label>
<input type="number" id="secondNumber">
</li>
<li>
<button type="submit" onclick="divisibleBy();">GO</button>
</li>
</ul>
<h2 id="result"></h2>
<hr>
</body>
Комментарии:
1. В вашем
for
цикле вы продолжаете увеличиватьi
, делаяi
. И вы говорите ему продолжать работать, покаi > firstNum
. Это никогда не остановится. Может быть, вы хотели использоватьi <= secondNum
?2. Вместо этого я использовал цикл while и сделал firstNum % secondNum != 0, а затем увеличил i, спасибо за вашу помощь! @blex
Ответ №1:
Проблема: проблема в том, что ваше условие for-loop всегда true
выполняется, что приводит к бесконечному циклу, следовательно, страница не реагирует. А также в этом случае нет необходимости принимать аргумент для функции
Решение:
Эта проблема может быть решена математически, без циклов.
// BEST APPROCH
function divisibleBy() {
var firstNum = parseInt(document.getElementById('firstNumber').value);
var secondNum = parseInt(document.getElementById('secondNumber').value);
var result = secondNum*parseInt(firstNum/secondNum 1);
document.getElementById('result').innerHTML = resu<
}
Но если вам действительно нужно использовать цикл, вот решение, но имейте в виду, что в настройке для цикла ограничение почти идентично приведенному выше решению (или заданному условию as i <= firstNum*secondNum
, поскольку оно уже получило оператор break при попадании в решение)
// WORST APPROCH
function divisibleBy() {
var firstNum = parseInt(document.getElementById('firstNumber').value);
var secondNum = parseInt(document.getElementById('secondNumber').value);
for (var i = firstNum 1; i <= secondNum*(firstNum/secondNum 1); i ) {
if (i % secondNum === 0) {
document.getElementById('result').innerHTML = i;
break;
}
}
}
Но я рекомендую использовать do-While
цикл, который будет более удовлетворительным для этой проблемы, и игнорировать выполнение ненужных вычислений для ограничения i
в приведенном выше коде.
// BEST LOOP/SIMPLE APPROCH
function divisibleBy() {
var firstNum = parseInt(document.getElementById('firstNumber').value);
var secondNum = parseInt(document.getElementById('secondNumber').value);
do{
firstNum ;
}
while(firstNum%secondNum != 0)
document.getElementById('result').innerHTML = firstNum;
}
Ответ №2:
вы используете for (var i = firstNum 1; i > firstNum; i )
, и это условие всегда будет выполняться. из-за чего происходит бесконечный цикл.
попробуйте это :
for (var i = firstNum 1; ; i ) {
if (i % secondNum === 0) {
document.getElementById('result').innerHTML = I;
break;
}
}
Комментарии:
1. Этот цикл не выполнит назначение функции, когда будет предоставлен ввод, где значение
firstNumber
больше, чем2*second-number
для, например:firstNumber = 12
иsecondNumber = 4
цикл даже не запустится, как12<=2*4
будетfalse
.2. Теперь, когда вы думаете об этом, он просто даст ответ как
2*secondNum
и только в случае, когдаfirstNum
больше половиныsecondNum
. с дополнительным вычислением цикла.3. да, тогда мы можем удалить условие и использовать break