Приложение Codecademy FizzBuzz застряло на шаге 1

Вот мой код для урока Codecamedy FizzBuzz

var i;
for ( i = 1; i > 20; i++ ) {
  "hello"
  if ( i % 3 === 0 ) {
    if ( i % 5 === 0 ) {
      "FizzBuzz";
    }
    else {
      "Fizz";
    }
  }
  else if ( i % 5 === 0 ) {
    "Buzz";
  }
 else {
    i;
  }
}

Я пытаюсь сначала проверить, делится ли число (i) на 3 или нет. Если это так, я хочу проверить, делится ли оно также на 5. Если оба условия верны, я хочу, чтобы он сказал «FizzBuzz ". Если верно только первое условие, должно быть написано «Шипение». Затем, после определения того, что i не делится на 3, он должен проверить, делится ли i на 5, и показать «Buzz», если это так. При отсутствии всякой делимости он должен просто показывать число.

Как я и ожидал... это не работает должным образом. Какие ужасно неловкие ошибки я совершил?


person mrdavidjcole    schedule 10.01.2012    source источник


Ответы (8)


После рассмотрения всех других очень хороших ответов здесь:

Поскольку вы «застряли на шаге 1» с предоставленным вами кодом, я предполагаю, что вы сделали ту же ошибку, что и я, после перехода по вашей ссылке и прочтения инструкций. Шаг 1 на самом деле не требует от вас решения проблемы Fizzbuzz. Чтобы пройти этот шаг, вам нужно сделать что-то гораздо более простое. Прочтите еще раз (не очень хорошие) инструкции ;)

person Andreas    schedule 10.01.2012
comment
Ах ха! Другие ответы действительно хороши и были очень полезны. Но ты прав. Здесь я забегал вперед. Эти инструкции следует переформулировать. Я избавился от всего лишнего и прошел этот этап с честью. Спасибо. Вперед! - person mrdavidjcole; 10.01.2012

Во-первых, ваш цикл даже не отрывается от земли:

for ( i = 1; i > 20; i++ )

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

for ( i = 1; i <= 20; i++ )

"FizzBuzz";

это просто строковый литерал, который JavaScript игнорирует. Вам нужно как-то вывести эту строку:

console.log("FizzBuzz");

Также этот блок

else {
    i;
  }

тоже ничего не делает. Вы хотели отобразить числа, которые не делятся ни на 3, ни на 5?

else {
    console.log(i);
  }

И, аналогично, что должен делать "hello" в верхней петле?


С другой стороны, я вижу, что вы используете строгое равенство:

if ( i % 5 === 0 )

это очень, очень хорошая привычка. Оператор нестрогого равенства == будет выполнять все виды неявных преобразований, если вы не будете осторожны. Всегда используйте строгое равенство, если вы намеренно не хотите, чтобы эти неявные преобразования происходили.

person Adam Rackis    schedule 10.01.2012
comment
Также следите за тем, чтобы не регистрировать строку приветствия вверху. - person fivedigit; 10.01.2012
comment
@fivedigit - действительно. Я добавил примечание об этом. Может быть, это должно было быть оператором отладки, просто убедитесь, что программа жива? - person Adam Rackis; 10.01.2012
comment
Спасибо, Адам. Классный совет здесь. Оказывается, я слишком много делал для первого шага урока — см. комментарий Андреаса ниже. - person mrdavidjcole; 10.01.2012
comment
@mrdavidjcole - конечно. Что ж, когда вы доберетесь до следующих нескольких шагов, надеюсь, вышеизложенное будет полезно :) - person Adam Rackis; 10.01.2012
comment
Я только что закончил остальные уроки, и ваши комментарии были действительно полезны. Грасиас сеньор. - person mrdavidjcole; 10.01.2012

Ваша конкретная проблема заключается в том, что вы неправильно понимаете цикл for и что такие операторы, как "somestring" или i, на самом деле ничего не делают. То, что вы хотите сделать, это вывести его на консоль (или другой выходной поток какого-либо рода) - как это сделать, зависит от среды, в которой работает ваш Javascript, и от того, куда вы хотите, чтобы информация пошла.

Вы также можете помнить, что любое число, которое делится без остатка на три, и пять, кратно 15.

Таким образом, вы можете упростить свой код с помощью чего-то вроде:

for all numbers in range:
    if num is a multiple of 15:
        print "FizzBuzz"
        continue for loop

    if num is a multiple of 3:
        print "Fizz"
        continue for loop

    if num is a multiple of 5:
        print "Buzz"
        continue for loop

    print i

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

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


Вот эквивалентный код Javascript, упакованный в веб-страницу для тестирования:

<html><head></head><body><script type="text/javascript">
    var i;
    for (i = 1; i <= 20; i++) {
        if (i % 15 === 0) {
            document.write ("FizzBuzz<br>");
            continue;
        };  

        if (i % 3 === 0) {
            document.write ("Fizz<br>");
            continue;
        };  

        if (i % 5 === 0) {
            document.write ("Buzz<br>");
            continue;
        };  

        document.write (i + "<br>");
    }   
</script></body></html>

который выводит по желанию:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
person paxdiablo    schedule 10.01.2012
comment
Могу я спросить, что означает === 0 в цикле, например, if (i % 15 === 0) {..}? - person Michel; 18.01.2015

for ( i = 1; i > 20; i++ ) означает, что программа ничего не будет делать. Если вы ожидаете, что переменная i будет начинаться с 1 и заканчиваться 20, вы должны сделать это как for( i = 1; i <= 20; i++). И если вы хотите проверить какое-то число, которое вы хотите, вы должны использовать такую ​​функцию, как:

function TestFizzBuzz(num){
    ...
    ...
}
TestFizzBuzz(1);
TestFizzBuzz(990);
...
person acjialiren    schedule 10.01.2012

Что, если мы немного усложним задачу? 1) Запрещены операции деления или деления по модулю; 2) Цикл должен пропустить все ненужные итерации. Вот ответ:

int n3 = 3;
int n5 = 5;
int i = 3;
while (i <= 100)
{
    Console.Write(i.ToString() + " - ");

    if (i == n3)
    {
        Console.Write("fizz");

        n3 = n3 + 3;
    }

    if (i == n5)
    {
        Console.Write("buzz");

        n5 = n5 + 5;
    }

    Console.WriteLine();

    i = n3 < n5 ? n3 : n5;
}
person mik61    schedule 22.12.2014
comment
делить на 5 может быть еще проще. Просто проверьте, заканчивается ли оно на 5 или 0. Чтобы проверить, делится ли оно на 3, вы можете складывать каждое отдельное число, пока не получите 0, 3, 6 или 9. aaamath.com/div66_x3.htm - person jessehouwing; 22.12.2014
comment
Да, вы правы, эти хаки определенно ускорят код. Но мое решение является общим, оно будет нормально работать с любой заданной парой чисел. - person mik61; 23.12.2014

Мое решение:

var nums = new Array();

for (var i = 0; i < 20; i++){
    nums[i] = i + 1;
}

for (var i = 0; i < 20; i++){
    if((nums[i] % 5 == 0) && (nums[i] % 3 == 0)){
        console.log("FizzBuzz");
    }else if(nums[i] % 5 == 0){
        console.log("Buzz");
    }else if (nums[i] % 3 == 0){
        console.log("Fizz");
    }else{
        console.log(nums[i]);
    }
}
person dougparnoff    schedule 16.03.2015

Для краткости сделаем это одной строкой:

for (i=1;i<21;i++){console.log(i+": "+(i%3?(i%5?i:'Buzz'):(i%5?'Fizz':'FizzBuzz')));};
person connexo    schedule 20.05.2015

Цель состоит в том, чтобы напечатать «Fizz» для чисел, которые делятся на 3 (без остатка), «Buzz» на 5 и «FizzBuzz» на 3 и 5, иначе он должен напечатать число.

  • по модулю (%) возвращает оставшуюся часть деления, поэтому, если (x % y) возвращает 0, проверенное деление является целым
  • поскольку модуль может возвращать 0, нам нужно помнить истинные и ложные значения - 0 является ложным значением, поэтому нам нужно отменить тест, если мы хотим проверить, является ли число «действительно» 0

    например: !(3 % 3) => !(0) => !false => истина

for (var i = 1; i <= 20; ++i) {
  if (!(i % 3) && !(i % 5)) { // check if "i" is integral divisible by 3 & 5
    console.log("FizzBuzz");
  } else if (!(i % 3)) {      // else check if "i" is only integral divisible by 3
    console.log("Fizz");
  } else if (!(i % 5)) {      // else check if "i" is only integral divisible by 5
    console.log("Buzz");
  } else {
    console.log(i);           // else print the number
  }
}
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

person John    schedule 01.10.2015
comment
Пожалуйста, попробуйте добавить некоторые пояснения к вашему коду - это сделает его более полезным для ОП и будущих читателей. Особенно в этом случае, когда ОП не просто запрашивает работающий код, но на самом деле хочет знать, где исходный код пошел не так. - person Serlite; 02.10.2015