0

メイン関数から:

for (int i = 0; i <= squaresLength; i++)
    {
        cout << arraySquares[i] << endl;
    }
    cout<<endl;

関数定義:

   void evenSquares(int arrIn[], int lengthIn, int arrOut[], int& lengthOut)
{
    int i, j;
    for (i=0; i<lengthIn; i++)
    {
        if (((arrIn[i]*arrIn[i])%2)==0)
        {
            for (j=0; j<lengthIn; j++)
            {
                {
                    arrOut[j]=(arrIn[i]*arrIn[i]);
                }
            }

        }
    lengthOut=j;
    }

}

出力

25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
25600
0

この関数は私が知っている混乱です。arrIn の各要素の 2 乗を計算し、偶数の 2 乗を arrOut に格納し、lengthOut の新しい値を arrOut の偶数の 2 乗の数として設定することになっています。よろしくお願いいたします。

4

2 に答える 2

2

これはネストされたループを必要としません。入力配列を反復処理し、アイテムを出力配列に比例した速度で書き込む必要があるため、必要なループは 1 つだけで、arrOutの長さを注意深く追跡する必要があります。

偶然にも、 の代わりに長さ と に要素を追加するインデックスの両方jを使用できます。lengthOutarrOut

lengthOut = 0;

for (i = 0; i < lengthIn; i++)
{
    if ((arrIn[i] * arrIn[i]) % 2 == 0)
    {
        arrOut[lengthOut] = arrIn[i] * arrIn[i];
        lengthOut++;
    }
}

繰り返し計算をなくすことで、これを改善することもできます。

for (i = 0; i < lengthIn; i++)
{
    int square = arrIn[i] * arrIn[i];

    if (square % 2 == 0)
    {
        arrOut[lengthOut] = square;
        lengthOut++;
    }
}

また、最初のforループには、1 つずれているエラー<=があります<

for (int i = 0; i < squaresLength; i++)
{
    cout << arraySquares[i] << endl;
}
于 2013-04-10T20:56:53.707 に答える
0

問題は、最初の for サイクルで、偶数の正方形を見つけるたびに arrOut を lengthIn の のコピーで埋めることですarrIn[i]*arrIn[i]i2 番目の for で変更されていないことに注意してください。正しいコードは

int i,j,square;
j = 0;
for (i=0; i<lenghtIn; i++) {
    square = arrIn[i]*arrIn[i];
    if (square%2==0)
        arrOut[j++] = square;
}
lenghtOut = j;
于 2013-04-10T21:02:06.667 に答える