-2

私は CS の新入生で、2 次元配列を理解するのに苦労しています。現在、一度に1行ずつ印刷しようとしています。

これは私のコードです

#include <stdio.h>

#define N 3

int main(void)

{
    int array[N][N], i, j, rows[N], cols[N];


    for(i=0;i<N;i++)
    {
        printf("Enter row %d: ", i+1);
        for(j=0;j<N;j++)
        scanf("%d", &array[i][j]);
    }
    printf("The 5 rows you entered are: \n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%d", array[i][j]);
            printf("\n");
        }
    }
    printf("\n");
    return 0;
}

プログラムを印刷したい:

1 2 3
1 2 3
1 2 3

を追加すると、次の\nように出力されます。

1\n
2\n
3\n
1\n
2\n
3\n
1\n
2\n
3\n

\n が画面に出力されているものと想像してください。コードが出力するものを表現しようとしています。このボックスに、入力した内容を正確に印刷するのに苦労しています。実際にコマンド画面に表示されている内容を表すために、Enter キーを何度も押すことはできません。

なし/nで印刷されます

123123123

また、行と列を追加しようとしています。私は何とかコードを見つけ、1 行を除いてほとんどを理解しました。これがコードです。

#include <stdio.h>

int main(void)
{
    int i, j, array[5][5], rows[5],cols[5];

    for(i=0;i<5;i++)
    {
        printf("Enter row %d: ", i+1);
        for(j=0;j<5;j++)
            scanf("%d", &array[i][j]);
    }
    **for(i=0;i<5;rows[i]=cols[i]=0,i++);**
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            rows[i]=rows[i]+array[i][j];
            cols[j]=cols[j]+array[i][j];
        }
    }
    printf("\nRow Totals:    ");
        for(i=0;i<5;i++)
    printf("%d\t", rows[i]);
    printf("\nColumn Totals: ");
    for(i=0;i<5;i++)
        printf("%d\t", cols[i]);
    printf("\n");

    return 0;
}

for(i=0;i<5;rows[i]=cols[i]=0,i++);
私が理解していない行です。まず、がよくわかりませんrows[i]=cols[i]=0,i++。2 つ目は、セミコロンが後に続く理由がわかりません。for ステートメントでセミコロンが使用されていないと思ったのですが、この行がないと、またはセミコロンがないとプログラムが正しく動作しません。このコード行なしで使用しようとすると、クレイジーな答えが得られます。配列の要素が0に設定されておらず、このコード行が配列の要素を0に設定しているためだと思います。 Cに比較的慣れていない人にとってより理解しやすい別のコード行はありますか? そして、セミコロンを使用する理由を説明してください。

4

3 に答える 3

4

プログラムを出力したい: 1 2 3\n 1 2 3\n 1 2 3\n

行う:

for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
    {
        printf("%d", array[i][j]);

    }
    printf("\n");
}


**for(i=0;i<5;rows[i]=cols[i]=0,i++);** 

確かに構文エラーです。ステートメントをマークするために ** を追加したと思います。でも、

for(i=0;i<5;rows[i]=cols[i]=0,i++);

有効な C ステートメントです。for ループは次の形式に分割できます。

for(initilization;condition;increment)

セミコロンは for ループの 3 つの部分を区切ります。あなたの場合、for ループのインクリメント部分は、以下のようにコンマを使用して複数のステートメントにさらに分割されます。

for(initialization;condition;do something useful here, update condition variable);

このコードの目的は、実際に合計を求める前に、行と列の合計をゼロに初期化することです。インクリメント部分のコンマに注意してください。複数のステートメントを追加できます。同様に、カンマを使用して、複数の初期化または複数の条件を指定できます。

for ループの後のセミコロンはシーケンス ポイントです。ここで、for ループのステートメント/複合ステートメントがないことに注意してください。平易で単純な言語では、セミコロンは for ループに何もしないように指示します。ただし、行と列の合計を、それ自体がスマートな for ループ内で間接的にゼロに初期化します。

使い方が単純でないことは明らかです。この種のステートメントを理解していない場合は、優れた C プログラミングの本を読むことをお勧めします。

于 2016-04-13T03:19:19.480 に答える
2

for ループには 4 つの部分があります。おそらく、次のようなループに慣れているでしょう:

for (int i = 0; i < 10; i++)
{
    printf("Hello!");
}

また

for (int i = 0; i < 10; i++)
    printf("Hello!");

最初の部分 (セットアップ) である "int i = 0" は、ループの開始時に実行されます。2 番目の部分 (テスト式) の "i < 10" は条件で、各反復の前にチェックされ、false と評価された場合はループを終了します。3 番目の部分 (インクリメント) である "i++" は、各反復の最後に実行され、評価されません。4 番目の部分 (本文) は、2 番目の部分の後、3 番目の部分の前に続きます。

for ループのセットアップ セクションとインクリメント セクションでは、コンマを使用して複数のステートメントを区切ることができます。true または false に評価する必要があるため、テスト式でコンマを使用しても意味がありません。また、セミコロンのみを使用できるため、本文にコンマを使用しても意味がありません。

ループ自体を使用して作業を実行できない理由はありません。あなたが提供した例では:

 for(i=0;i<5;rows[i]=cols[i]=0,i++);

ループが何をしているのかは既に理解しています (rows 配列と cols 配列のすべての値を 0 に設定します)。これは、ループの本体ではなく、ループのインクリメント部分で実行しているだけです。また、代入操作が代入される値に評価されるという事実も利用しています。したがって、「cols[i] = 0」は「0」に評価され、rows[i] が割り当てられます。

ただし、for ループは常に次のステートメントを本体として扱います。ループに何もしないように伝えたい場合は、ループの後に空のステートメント (前に何もないセミコロン) を配置して、他に何もしないことを認識させる必要があります。

セミコロンを削除すると、次の行がループの本体であると見なされ、次の動作が得られます。

for(i=0;i<5;rows[i]=cols[i]=0,i++)
{
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            rows[i]=rows[i]+array[i][j];
            cols[j]=cols[j]+array[i][j];
        }
    }
}

問題の実際の解決策については、sjsam の回答を使用してください。

于 2016-04-13T03:40:28.753 に答える
1

出力ロジックの微調整

printf("The %d rows you entered are: \n", N);
for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
    {
        if (j != 0)
        {
            putc(' '); /* add space if we are not the first column */
        }
        printf("%d", array[i][j]);
    }
    putc ('\n'); /* new line after each row is complete */
}
printf("\n");
于 2016-04-13T08:41:42.777 に答える