2017-01-10 4 views
0

Мне нужна помощь в завершении этой простой программы.Какие функции я использовал бы для завершения моей программы? Для петли и что еще?

Программа должна запрашивать у пользователя для базового числа и ряда факторов, и, при нажатии кнопки, программа должна отображать факторы, которые не имеют никакого остатка.

Вот пример:

First Factors Game 
     Base Number: ___ (user enters 100) 
    Number of Factors: ___ (user enters 3) 
    [Display Factors!] (user clicks button) 

     Results: 
    The first 3 factors of 100 
     are 1, 2, and 4. 

В приведенной выше программе, отображается 1, отображается 2, число 3 НЕ отображается потому, что (100% 3 == 0!), И 4, отображается. Он останавливается там, потому что пользователь вводил только 3 в число факторов.

Итак! Вот мой HTML:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Audition</title> 
    </head> 
    <body> 
     <h3>First Factors</h3> 
     <div id="container"> 
      <label>Base Number: </label> 
       <input id="baseNumber" type="text"> 
       <br> 
      <label>Number of Factors: </label> 
       <input id="numberOfFactors" type="text"> 
       <br> 
      <button onClick="displayFactors">Display Factors</button> 
     </div> 
     <div id="results"> 
      <p>The first <span id="numberOfFactorsResults"></span> factors 
      of <span id="baseNumberResults"></span> are </p> 
     </div> 
    </body> 
</html> 

А вот мой JavaScript:

function displayFactors() { 
    run(); 
} 

function run(){ 
    var x = parseInt(document.getElementById("baseNumber").value); 
    var y = parseInt(document.getElementById("numberOfFactors").value); 
    document.getElementById("baseNumberResults") = x; 
    document.getElementById("numberOfFactorsResults") = y; 

    /** So, we want to take the base number (entered by the user), divide 
     that base number by numbers leading up to the base number, 
     but only print the first such-and-such factors (number provided by 
     the user) with a remainder of 0. **/ 

Это где я озадачен. Я уверен, что мне нужно будет использовать for-loop с некоторыми вложенными операторами switch, и я знаю, что модуль в какой-то момент вступает в игру, но я не знаю, с чего начать. Какие циклы я бы использовал в этот момент? (Не могли бы вы также объяснить почему?)

Я не прошу вас закончить программу для меня (хотя вы тоже можете). Все, о чем я прошу, - это руководство (обратите внимание: шаги будут замечательными!), Выясняя, как это решить.

+0

Проблема заключается не в том, что «вы не знали, как заполнить часть JavaScript». Проблема в том, что вы не знали, как найти первые * n * факторы, подход к которым будет одинаковым на большинстве языков (по крайней мере, декларативных). Вкратце, это будет цикл от 1 до * m * (на самом деле вам нужно всего лишь прокрутить квадратный корень из * m *) и проверить, является ли каждый номер фактором или нет, что вы, кажется, уже знаете, как делать. Держите подсчет количества найденных факторов и остановитесь, что вы достигли максимума. Мне тяжело видеть, где вы можете застрять. –

+0

Вы правы, что вам понадобится петля. Я не знаю, почему вы думаете, что вам нужны какие-то свиты-заявления - что-то включить? Модуль вступит в игру так, как вы уже описали, проверяя, есть ли 'n% i === 0'. Зачем вам использовать какой-либо другой цикл, который начинается с одного и поднимается до максимально возможного фактора? –

ответ

0

Предположим, вы должны начать цикл в 1. Затем, если любое заданное число не является фактором (если оно имеет остаток), вы хотите сохранить цикл, но не увеличивать переменную цикла.

Я думаю, что это самая заметная часть этого - обычно, когда люди используют для циклов, есть переменная, которая увеличивается на каждой итерации цикла, но вы также хотите, чтобы вы изменяли другую переменную, когда вы находите коэффициент (или когда вы дойдете до самого числа, потому что, конечно, ничего выше, это может быть фактором его.)

var factors_found = 0; 
for (var i=1; i<number; i++) { 
    if (remainder == 0) { 
     factors_found++; 
     if (factors_found >= 3) { 
      break; 
     } 
    } 
} 

В этом случае цикл будет выходить, когда вы достигнете номер или когда вы найдете 3 фактора, что наступит первый.

Конечно, вы захотите сохранить эти факторы где-нибудь. Если вы используете массив, вы можете просто проверить длину этого массива, чтобы узнать, сколько вы нашли до сих пор.

+0

Вы имели в виду 'var i = 1' not' var i = 0'? –

+0

Да, спасибо, что заметили – libertyernie

1

поэтому я изменил ваш HTML так, чтобы входные данные были как входом номера HTML5, так и поэтому, чтобы исходный контейнер был изначально пуст и фиксировал некоторое форматирование.

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Audition</title> 
    </head> 
    <body> 
     <h3>First Factors</h3> 
     <div id="container"> 
      <label>Base Number: </label> 
       <input id="baseNumber" type="number"> 
       <br /> 
      <label>Number of Factors: </label> 
       <input id="numberOfFactors" type="number"> 
       <br /> 
      <button onClick="displayFactors();">Display Factors</button> 
     </div> 
     <div id="results"> 
     </div> 
    </body> 
</html> 

, как для сценария я бы следующим образом:

первого назначить входные и выходные элементы в DOM переменные:

var baseNumHldr = document.getElementById("baseNumber"); 
var numOfFactsHldr = document.getElementById("numberOfFactors"); 
var resultsHldr = document.getElementById("results"); 

в функции, вызываемой на разборе событий нажмите ваши входные значения (для простоты я не учитывал проверку и обработку ошибок), затем получайте свои факторы от вызова функции и, наконец, показывайте свои результаты.так как результаты добавляются скриптом, теги span необязательны и наличие факторов в качестве массива позволяет функции соединения выводить список, разделенный запятыми.

function displayFactors() { 
    var num = parseInt(baseNumHldr.value); 
    var cnt = parseInt(numOfFactsHldr.value); 
    var factors = getFactors(num, cnt); 
    resultsHldr.innerHTML = 
     "<p>The first " + cnt + "factors of " + num + " are " + factors.join() + "</p>"; 
} 

функция getFactors принимает два аргумента числа, чтобы быть разложен, NUM, и количество факторов, должны быть возвращены, CNT. функция создает массив для возврата длины cnt, предотвращая повторное изменение размера массива. цикл for будет работать от 1 до числа, если количество найденных факторов не соответствует требуемому счету, это достигается с использованием y в качестве индекса для массива результатов. когда значение x является коэффициентом входного числа x, будет присвоено y-индексу массива, y будет увеличено, и если x и y будут меньше входных параметров, цикл будет повторяться.

function getFactors(num, cnt){ 
    var factArray = new Array(cnt); 
    for (x = 1, y = 0; (x <= num) && (y < cnt); x++) { 
     if (num % x == 0) { 
      factArray[y] = x; 
      y++; 
     } 
    } 
    return factArray.filter(isDefined); 
} 

массив возврата в getFactors фильтруется isDefined функции ниже в случае, если счетчик входных коэффициентов превышает число реальных факторов, позволяющих простое соединение при отображении на выходе

function isDefined(val) { 
    return val !== undefined; 
} 

также не забудьте указать или включить скрипт в html