0

エッジのリストから行列を作成するコードを書いています。

ただし、上記のコードを実行すると、入力データにない「ファントムエッジ」が発生し、プログラムの残りの部分が台無しになります。エッジは、マトリックスでは9,2、要素コード形式では8,1です。

マトリックス内のすべての要素は、事前に0に初期化されます。

マトリックスに関連する入力データは次のとおりです。

1 2
1 8
2 8
3 5
3 1
4 5
4 6
5 2
5 9
6 4
6 8
7 4

7 10
8 4
8 6
9 4
9 5
10 7
10 3

入力を処理する関数は次のとおりです。

void displayMatrix(int **matrix, int numberVertices){                           //function displays the matrix

        int i, j;

        for(i=0; i<numberVertices; i++)                                         //go through eveyr element
        {
                for(j=0; j<numberVertices; j++)
                {
                        printf("%d ", matrix[i][j]);                            //print element
                }
                printf("\n");
        }

        printf("\n\n");
}


void inputMatrix(FILE *fp, int ** matrix)                                       //file places value 1 into matrix if edge exists for the adjacency matrix
{
        int e1, e2;

        while(!feof(fp))                                                        //continue to the end of the file
        {
                fscanf(fp, "%d %d", &e1, &e2);                                  //get pairs
                e1 = e1 - 1;                                                    //adjust the edges for array use
                e2 = e2 - 1;
                matrix[e1][e2] = 1;                                             //place value 1 into appropriate location in adjacency matrix
        }

        fclose(fp);                                                             //close the file connection
}

0 1 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 0
1 0 0 0 1 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 1 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 1
0 0 0 1 0 1 0 0 0 0
0 *1 0 1 1 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0

*入力データではなく、存在してはならないエントリ

4

3 に答える 3

2

問題は、必要以上に1回ループしているためfscanf、最初の変換の前に失敗し、前回の読み取りからの状態のままe1になることです。e2結局のところ、最後のエントリはとにe1設定されて10いるe2ので3、にe1なり9、にe2なり、ファントムエッジ2が発生します。

この追加のループの原因は、ループ条件が思ったとおりに機能しないためです。feofファイルの終わりフラグが設定されているかどうかを確認します。これは、ファイルの終わりで読み取ろうとした場合にのみ設定できます。読み取る前にファイルの終わりをチェックしているので、実際には次の反復までこれを取得していないため、追加の時間をループします。適切な修正は非常に簡単です。fscanf結果が。になるまで続行しEOFます。

    while (fscanf(fp, "%d %d", &e1, &e2) != EOF)
    {
            matrix[e1 - 1][e2 - 1] = 1;                  
    }
于 2012-09-17T05:39:18.400 に答える
1

コメントで指摘されているように、のエラーをテストしていませんfscanf

10 3特に、おそらく改行が検出されたために、読み取った後、まだファイルの終わりに到達していません。

ただし、次回fscanfはゼロを返します。次に、これらの値(読み取られなかった値)から1を引いて、を取得します9 2

これを行うことにより、2つの整数が読み取られたことを確認できます。

if( 2 != fscanf(fp, "%d %d", &e1, &e2) ) break;
于 2012-09-17T05:39:44.490 に答える
0

あなたはこれを試すことができます:

fscanf(fp, "%d %d\n", &e1, &e2);

最後の2桁を終えると、もう1つあり\n、ループを続行する必要があります。これにより問題が発生します。

于 2012-09-17T05:58:53.537 に答える