2

これがCodecamedyのFizzBu​​zzレッスンの私のコードです

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で割り切れるかどうかを確認します。両方の条件が当てはまる場合は、「FizzBu​​zz "。最初の条件のみが真の場合、「Fizz」と表示されます。次に、iが3で割り切れないと判断した後、iが5で割り切れるかどうかを確認し、その場合は「バズ」を表示する必要があります。すべての除算に失敗すると、数値が表示されるだけです。

思った通り...期待通りに動作しません。私が犯したひどく恥ずかしい間違いは何ですか?

4

10 に答える 10

8

まず、ループが開始されていません。

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

中間条件が最初はfalseであるため、一度も繰り返されません。私はあなたが意味したと思います:

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

"FizzBuzz";

JavaScriptが無視している単なる文字列リテラルです。どういうわけかこの文字列を出力する必要があります:

console.log("FizzBuzz");

また、このブロック

else {
    i;
  }

また、何もしていません。3でも5でも割り切れない数値を表示したいですか?

else {
    console.log(i);
  }

そして、同様のメモ"hello"で、トップループで何をすることになっていますか?


もっと前向きなことに、あなたは厳密な等式を使用しているようです。

if ( i % 5 === 0 )

これは非常に良い習慣です。注意しないと、非厳密な等式演算子==はあらゆる種類の暗黙的な変換を行います。 これらの暗黙的な変換を意図的に行わせたくない場合を除いて、常に厳密な等式を使用してください。

于 2012-01-10T02:27:26.163 に答える
3

あなたの特定の問題は、あなたがループに対して間違った感覚を持っていること、forそしてステートメントが実際に何もしない"somestring"か、または何もしないことです。あなたがしたいのは、コンソール(またはある種の他の出力ストリーム)を出力することです-これを行う方法は、Javascriptが実行されている環境と情報の行き先によって異なります。i

また、3と5の両方で均等に割り切れる数は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

ループ内の複数の出口または再開ポイントについて不平を言う人もいますが、スパゲッティコードを避けるために、そのガイドラインの背後にある理由を理解していないため、無視しても問題ありません。

1ページにすべての制御フローを表示できるコード(上記の11行など)は、特に一貫した処理を行うと、スパゲッティコードにすることはできません。


テスト用にWebページにパッケージ化された同等の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
于 2012-01-10T02:37:56.417 に答える
3
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);
    };
} 
于 2014-01-27T05:34:19.473 に答える
2

ここで他のすべての非常に良い答えを検討した後:

あなたはあなたが提供したコードで「ステップ1で立ち往生している」ので、あなたはあなたのリンクをクリックして指示を読んだ後に私がしたのと同じ間違いをしたと思います。ステップ1では、Fizzbuzzの問題を解決するように実際に求められるわけではありません。このステップを通過するには、もっと簡単なことをするだけです。(あまり良くない)指示をもう一度読んでください;)

于 2012-01-10T02:51:46.733 に答える
1

for ( i = 1; i > 20; i++ )プログラムが何もしないことを意味します。i変数が1で始まり、20で終わることを期待する場合は、のように行う必要がありますfor( i = 1; i <= 20; i++)。また、必要な数をテストする場合は、次のような関数を使用する必要があります。

function TestFizzBuzz(num){
    ...
    ...
}
TestFizzBuzz(1);
TestFizzBuzz(990);
...
于 2012-01-10T02:43:42.663 に答える
1

物事をもう少し難しくするとどうなりますか?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;
}
于 2014-12-22T11:19:35.603 に答える
0

私の解決策:

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]);
    }
}
于 2015-03-16T16:03:50.703 に答える
0

簡潔にするために、1行で実行しましょう。

for (i=1;i<21;i++){console.log(i+": "+(i%3?(i%5?i:'Buzz'):(i%5?'Fizz':'FizzBuzz')));};
于 2015-05-20T08:41:11.597 に答える
0
  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);
      }

    };
于 2015-07-21T09:50:51.033 に答える
0

目標は、3で割り切れる数(休符なし)の「Fizz」、5の「Buzz」、3と5の「FizzBu​​zz」を印刷することです。それ以外の場合は、数値を印刷する必要があります。

  • モジュロ(%)は除算の残りを返すため、(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>

于 2015-10-01T19:29:44.730 に答える