-2

やや些細な問題が手元にあります。そのため、カウンター c が for ループをインクリメントするのを止めようとしています。池が空いている場合にのみ、池のスポットを埋めようとしています。すでに別の魚 (白または赤) でいっぱいになっている場合は、カウンターを増やしたくありません。池のスポット (または要素) が満たされると、再び満たすことはできません。したがって、最終的には白身魚が 500 匹、赤身魚が 5 匹になるはずです。

この問題にアプローチするために間違った条件文を使用しているように感じます。カウンターがインクリメントされると、メソッド placeFish を呼び出した while ステートメントも同様に白または赤のカウンターをインクリメントしますが、これは私がやりたいことではありません。白/赤の魚の合計量が 500 でも 5 でもありませんが、理想的には増加させたくない場合に while カウンターが増加しているため、むしろ少なくなります。

for ステートメントの使用は正しいですか? しばらく試してみましたが、うまくいかなかったようです。

public static void fishes (int[][] pond) {
            //pond has dimensions [50][50] in a different method that call fishes
            //every element in the 2D array pond is already set to value 0
    int whitefish = 500;
    int redfish= 5;
    int whitefishvalue = 1
    int redfishvalue = 2
    int white = 0;
    int red = 0;
    while (white < whitefish)
    {
        placeFish (pond, whitefishvalue);
        white++;
    }
    while (red < redfish) 
    {
        placeFish (pond redfishvalue);
        redd++;
    }
}

public static void placeFish(int[][] pond, int newFish) {
    int a = random.nextInt(pond.length);
    int b = random.nextInt(pond[0].length);
            int spot = 0;

    for (int c = 0; c < 1; c++)
    {
        if (pond [a][b] == spot)
        {
            pond[a][b] = newFish;
            c++;
                    //How to stop c++ from incrementing?
        }
    }
}
4

3 に答える 3

2
for (int c = 0; c < 1; c++) {
    if (pond [a][b] == spot) {
        pond[a][b] = newFish;
        c++; //How to stop c++ from incrementing?
    }
}

このループで実際にc2 回インクリメントしますが、これは意図したものではないと思います。最初の場所は最初の行にあります。for一般的に次のように書かれたループを覚えておいてください

for (initialize; condition; increment) {
    // stuff goes here
}

whileループと同等です

initialize;
while (condition) {
    // stuff goes here
    increment;
}

したがって、ループの各反復の終わりに、自動的にインクリメントされますc

インクリメントする他の場所cは、ifステートメントの本文です。それはpond[a][b] == spot. したがって、これが当てはまる反復では、このステートメントで 1 回、ループの最後でc1 回、合計 2 回インクリメントします。if

それ以外の場合は、一度だけインクリメントしたいと思いますよpond[a][b] == spotね?もしそうなら、それは簡単な修正です: すべてのループ反復の最後に実行されるインクリメント ステートメントを削除するだけです。

for (int c = 0; c < 1;) {
    // stuff goes here
}

そうすれば、ifステートメントにインクリメント行が 1 つだけ残ります。


ところで、for反復が 1 回しかないループを使用しても意味がないことに注意してください。

于 2012-10-27T02:20:43.280 に答える
2

あなたが何をしようとしているのか正確にはわかりませんが、これはあなたが望んでいることだと思います...これは配列をランダムに検索してスポットを探し、スポットを見つけると停止し、魚を配置しますそこの。

public static void placeFish(int[][] pond, int newFish) {
    int spot = 0;
    int a;
    int b;

    do
    {
        a = random.nextInt(pond.length);
        b = random.nextInt(pond[0].length);
    } while (pond [a][b] != spot);

    pond[a][b] = newFish;
}
于 2012-10-27T02:17:26.073 に答える
0

あなたの言い回しは非常に紛らわしいですが、 for ループを毎回インクリメントしたくないと思いますか?

for (int c = 0; c < 1;) //It's not necessary to put an increment there.  You can in fact write a loop like for(;;) and escaping it via break
{
    if (pond [a][b] == spot)
    {
        pond[a][b] = newFish;
        c++;
                //How to stop c++ from incrementing?
    }
}
于 2012-10-27T02:21:49.197 に答える