Приложение Codecademy FizzBuzz, застрявшее на шаге 1 - PullRequest
2 голосов
/ 10 января 2012

Вот мой код для Урока Codecamedy's 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».Если только первое условие верно, оно должно сказать «Fizz».Затем, после определения, что i не делится на 3, он должен проверить, делится ли i на 5 и показать «Buzz», если это так.В случае отсутствия делимости, он должен просто показать число.

Как я и ожидал ... он не работает, как ожидалось.Какие ужасно смущающие ошибки я допустил?

Ответы [ 10 ]

8 голосов
/ 10 января 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 )

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

3 голосов
/ 27 января 2014
for (var i = 1; i <= 20; i++) {
    if (i % 15 === 0) {
        console.log("FizzBuzz");
    }
    else if (i % 3 === 0) {
        console.log("Fizz");
    }
     else if (i % 5 === 0) {
        console.log("Buzz");
    }
    else{
    console.log(i);
    };
} 
3 голосов
/ 10 января 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
2 голосов
/ 10 января 2012

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

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

1 голос
/ 22 декабря 2014

Что если мы сделаем вещи немного сложнее?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;
}
1 голос
/ 10 января 2012

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

function TestFizzBuzz(num){
    ...
    ...
}
TestFizzBuzz(1);
TestFizzBuzz(990);
...
0 голосов
/ 01 октября 2015

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

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

    например:! (3% 3) =>! (0) =>! False => true

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>
0 голосов
/ 21 июля 2015
  for(var i =1; i<=20; i++){
  if(i % 15 === 0){
      console.log("FizzBuzz");
  }
  else  if(i % 5 === 0){
      console.log("Buzz");
  }

    else  if(i % 3 === 0){
      console.log("Fizz");
  }
  else{
       console.log(i);
      }

    };
0 голосов
/ 20 мая 2015

Просто ради краткости, давайте сделаем это в одну строку:

for (i=1;i<21;i++){console.log(i+": "+(i%3?(i%5?i:'Buzz'):(i%5?'Fizz':'FizzBuzz')));};
0 голосов
/ 16 марта 2015

Мое решение:

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]);
    }
}
...