0

ここから fizzbuzz プログラムを試しています: Why Can't Programmers.. Program?

「1 から 100 までの数字を表示するプログラムを作成してください。ただし、3 の倍数の場合は数字の代わりに「Fizz」と出力し、5 の倍数の場合は「Buzz」と出力します。3 と 5 の倍数の場合は「FizzBu​​zz」と出力します。 「。」

protected void btn1_Click(object sender, EventArgs e)
    {
        for (int i = 1; i < 101; i++)
        {
            if (i % 3 == 0 & i % 5 == 0)
            {
                Response.Write("fizzbuzz" + ",");
            }
            else if (i % 3 == 0)
            {
                Response.Write("fizz" + ",");
            }
            else if (i % 5 == 0)
            {
                Response.Write("buzz" + ",");
            }
            else
            {
                i = i + 0;
            }

            Response.Write(i +",");
        }

    }

次のような結果を生成できます。

1,2,フィズ,3,4,バズ,5,フィズ,6,7,8,フィズ,9,バズ,10,11,フィズ,12,13,14,フィズバズ,15,16,17,フィズ, 18,19,バズ,20,フィズ,21,22,23,フィズ,24,バズ,25,26,フィズ,27,28,29,フィズバズ,30,31,32,フィズ,33,34,バズ, 35、フィズ、36、37、38、フィズ、39など..

fizzという単語は印刷されましたが、3 を置き換えませんでした。fizzbuzzは印刷されましたが、15 を置き換えませんでした。

4

7 に答える 7

7

if 条件にヒットするかどうかに関係なくi、コードの最後にまだ印刷されています。

forループを具体的に見てください:

for (int i = 1; i < 101; i++)         
{             
if (i % 3 == 0 & i % 5 == 0)             
{                 
Response.Write("fizzbuzz" + ",");             
}             
else if (i % 3 == 0)             
{                 
Response.Write("fizz" + ",");             
}             
else if (i % 5 == 0)             
{                 
Response.Write("buzz" + ",");             
}             
else             
{                 
i = i + 0;             
}              
Response.Write(i +",");   //look here you print i
} 

したがって、最後の Response.Write(i + ","); を移動する必要があります。最後のelse状態で。このようなバグを見つける最も簡単な方法は、デバッガーを使用してプログラムをデバッグすることです。その後、出力が何であるかを簡単に確認できます。したがって、間違いなくデバッガーを使用し、ブレークポイント/ウォッチを設定して、何が起こるかを監視してください。コードは次のように変更する必要があります。

  for (int i = 1; i < 101; i++)         
    {             
    if (i % 3 == 0 & i % 5 == 0)             
    {                 
    Response.Write("fizzbuzz" + ",");             
    }             
    else if (i % 3 == 0)             
    {                 
    Response.Write("fizz" + ",");             
    }             
    else if (i % 5 == 0)             
    {                 
    Response.Write("buzz" + ",");             
    }             
    else             
    {                 
    Response.Write(i +",");   //look here you print i
    }              
    } 

i=i+1ループを削除すると、 fori をインクリメントすることで既にこれが処理されていることに注意してください。

編集

これが簡単かどうかはわかりませんが、ラムダを使用してこれを行う別の方法を次に示します。

            List<int> t;
            t = Enumerable.Range(1, 100).ToList();

            var fizzBuzz = t.Where(num => num % 3 == 0 && num % 5 == 0);
            var fizz = t.Where(num => num % 3 == 0);
            var buzz = t.Where(num => num % 5 == 0);
            var notFizzBuzz = t.Where(num => num % 3 != 0 && num % 5 !=0);

            //print fizzBuzz elements
            Console.WriteLine("Printing fizzBuzz elements...");
            foreach (int i in fizzBuzz)
                Console.WriteLine(i);

            //print fizz elements
            Console.WriteLine("Printing fizz elements...");
            foreach (int i in fizz)
                Console.WriteLine(i);

            //print buzz elements
            Console.WriteLine("Printing buzz elements...");
            foreach (int i in buzz)
                Console.WriteLine(i);

            //print other elements
            Console.WriteLine("Printing all others...");
            foreach (int i in notFizzBuzz)
                Console.WriteLine(i);
于 2011-04-13T12:29:19.000 に答える
1

これらの変更を試してください

protected void btn1_Click(object sender, EventArgs e)
{
    for (int i = 1; i < 101; i++)
    {
        if (i % 3 == 0 & i % 5 == 0)
        {
            Response.Write("fizzbuzz" + ",");
        }
        else if (i % 3 == 0)
        {
            Response.Write("fizz" + ",");
        }
        else if (i % 5 == 0)
        {
            Response.Write("buzz" + ",");
        }
        else
        {
            Response.Write(i +",");
        }           
    }
}

i = i + 0i の値に 0 を追加しているため、明らかに何もしません。

また、if/else ブロックの結果に関係なく、応答に数値を出力しているため (その後に配置されます)、else に移動する必要があります (つまり、if または else if が一致しなかった場合にのみ出力します。

于 2011-04-13T12:29:45.770 に答える
0
protected void btn1_Click(object sender, EventArgs e)
{
    for (int i = 1; i < 101; i++)
    {
        if (i % 3 == 0 & i % 5 == 0)
        {
            Response.Write("fizzbuzz" + ",");
        }
        else if (i % 3 == 0)
        {
            Response.Write("fizz" + ",");
        }
        else if (i % 5 == 0)
        {
            Response.Write("buzz" + ",");
        }
        else
        {
            i = i + 0; //this is totally useless
            Response.Write(i + ",");

        }

        //Response.Write(i +","); //This will always write the number, even if you wrote fizz or buzz
    }

}
于 2011-04-13T12:30:56.263 に答える
0

Response.Write(i +",");あなたの最後の他のものに移動します

于 2011-04-13T12:30:08.620 に答える
0

それの別の簡単な実装:

for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine((i % 3 == 0) ? ((i % 5 == 0) ? "FizzBuzz" : "Fizz") : ((i % 5 == 0) ? "Buzz" : i.ToString()));
        }
Console.ReadKey();
于 2017-09-11T15:17:21.957 に答える