0

プログラムは、0 で囲まれた 12x24 の行列を出力することになっています。中央に 1 があり、(1,1) の位置に 2 があります。どの部分で M[row][col] を初期化するかわかりません。 =2; どこに置いても、2が最初の場所に出力されないため、何か提案はありますか?

int main()
{
    int M[N/2][N];
    int ROWS, COLS, row, col;
    int r, c;
    ROWS = sizeof(M) / sizeof(M[0]);
    COLS = sizeof(M[0]) / sizeof(M[0][0]);
    fill(M, ROWS, COLS, 1, 1);
    row=1;
    col=1;
    for(r=0; r< ROWS; r++)
    {
        for(c=0; c < COLS; c++)
        { 
            if (r==0||r ==ROWS-1)
            {
                M[ROWS][COLS]=0;
            }
            else if(c==0||c==COLS-1)
            {
                M[ROWS][COLS]=0;
            }
            else {
                M[ROWS][COLS]=1;    
            }

            cout<< M[ROWS][COLS];
        }

        cout << endl;

    }

    print(M, ROWS, COLS);
    return 0;
}
4

2 に答える 2

1

ROWSループ内でandCOLSを配列インデックスとして使用していることに気付きましたfor...おそらくループ変数randを使用するつもりcでした。

また、通常の変数に大文字の名前を使用するのは悪い形式と見なされます... C の慣例は、マクロにのみ大文字の識別子を使用することです。

于 2013-03-18T18:22:30.230 に答える
0

M[1][1]=2; と書いたらきっと。行 cout<<M[ROWS][COLS] の直前に、必要な出力が表示されます。そのようにするのはばかげています。なぜなら、その単一の位置 (M[1][1]) を同じ値に繰り返し (正確には 288 回) 割り当てることになるからです。ただし、M の間違った値を出力することはできません。 [1][1] 何かを印刷するたびに正しい値に設定した場合。もちろん、それを行うためのより良い方法があります。

プログラムが実行するアクションを明確に分離する方がはるかに良いでしょう。実際に実行する必要があるのは次の 2 つです。

  1. 配列を初期化します。
  2. 配列の内容を出力します。

これらの各アクションは、異なる関数で実行する必要があります。つまり、1 つの関数を 1 回呼び出して配列全体を初期化し、別の関数を 1 回呼び出して配列全体を出力します。このようにして、セルが印刷される前に、配列内のすべてのセルが正しい値に設定されます。

これを行うと、コード内で M[1][1]=2 を設定する適切な場所を簡単に見つけることができるため、正しい出力が表示されます。

これは、配列を使用してさらに何かを行うために後で拡張される演習であると想定しているため、そもそも配列を使用することが理にかなっています。その場合、ある時点で配列を再度印刷する必要がある可能性が非常に高く、配列を印刷するだけで他に何もしない関数を作成したことを非常に嬉しく思います。

于 2014-03-31T02:55:16.903 に答える