0

たくさんの行を含むテキスト ファイルがあります。何を扱っているかを示すために、ここにいくつかの行をコピーして貼り付けます。

1 16.07.2011 kl。17.00 OB - FCN 2 - 0 6.965
1 17.07.2011 kl. 14.00 FCM - SIF 1 - 2 5.370

2 2011.07.23 kl. 17.00 SIF - BIF 0 - 1 4.173
2 23.07.2011 kl. 19.00 FCK - OB 2 - 2 14.774
3 30.07.2011 kl. 17.00 AGF - OB 2 - 2 11.312
3 30.07.2011 kl. 19.00 FCK - FCN 2 - 0 11.076

while (fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %lf\n", &runde, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10)
    int prev_goal = goal1 + goal2;
    int current;
    if(prev_goal > current) {
    printf("Runde %d var den mest målrige med %d mål\n", runde, prev_goal);
   }

値をさまざまな変数に取得しますが、各ラウンドの結果を追加して、どのラウンドが最も多くのゴールを持っているかを確認するにはどうすればよいですか? アドバイスをいただければ幸いです。ありがとうございました :)

4

3 に答える 3

1

@Benが提案したように、どのラウンドに最も多くのゴールがあったかだけを気にし、テキストファイルをメモリに保存する必要はないと仮定します。

その場合は、次のようなことができます。

int i, maxGoals = 0, roundWithMostGoals = 0;

for (i = 0; fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %lf\n", &runde, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10; ++i)
{
    if (maxGoals < goal1 + goal2)
    {
        roundWithMostGoals = runde;
        maxGoals = goal1 + goal2;
    }
}

// Edit:
printf("The largest number of goals was %d, scored in round %d", maxGoals, roundWithMostGoals);

このコードには問題があります。ゴール数が最大のラウンドが 2 つある場合は、最初のラウンドのみが出力されます。

これを回避するには、2 回ループする必要がありますが、これは理想的ではありません。このデータをすべてメモリにロードする、他の提案されたアプローチのいずれかを使用することをお勧めします。

ただし、最適ではないと思いますが、上記のような修正されたソリューションを次に示します。

int i, maxGoals = 0, roundWithMostGoals = 0;

// Find the maximum number of goals that was scored in any one round.
for (i = 0; fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %lf\n", &runde, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10; ++i)
{
    if (maxGoals < goal1 + goal2)
    {
        maxGoals = goal1 + goal2;
    }
}

printf("The largest number of goals scored was %d.\n", maxGoals);
printf("The largest number of goals was scored in\n");

// TODO: Reposition the file stream back to the beginning or close it and then reopen it again.
// XXX Code Here XXX

// Loop through again getting all the rounds with the maximum number of goals.

for (i = 0; fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %lf\n", &runde, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10; ++i)
{
    if (maxGoals == goal1 + goal2)
    {
        printf("\tRound %d\n", runde);
    }
}

しかし、これは2回ループするようになり、問題に対する最良の解決策ではありません.

于 2012-11-25T23:42:01.697 に答える
0

いくつかの配列を作成する必要があります。

int goal1Array[]
int goal2Array[]
int listLength = 0;

次に、目標を読み込んで、それらを配列に追加できます (追加する数を必ず記録してください)。

goal1Array[9] = goal1;
listLength++;

注: 動的メモリ管理を行う必要があります。c配列などを検索します。

最後に、このリストをループして比較できます。

for (i = 0; i < listLength; i++) {
    /*compare stuff*/
}

これは、これをメモリエラーなしでコンパイルするためにいくらかの努力を払う必要がある一般的なアドバイスです。

幸運を。

于 2012-11-25T23:35:00.823 に答える
0

各チームの int を持つ int の配列を作成します。それらは、各チームの合計になります。

次に、チームの名前で team1 とteam2の名前を strcmp します。次に、関連する goalSum に目標を追加します。

int goalSum[3];
goalSum[0] = 0;goalSum[1] = 0;goalSum[2] = 0


while (fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %lf\n", &runde, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10)
{

    //comparisions for the first team
    if(strcmp(team1,"nameofteam0")==0)
    {
            ++goalSum[0];
    }
    if(strcmp(team1,"nameofteam1")==0)
    {
            ++goalSum[1];
    }
    if(strcmp(team1,"nameofteam2")==0)
    {
            ++goalSum[2];
    }
    //comparisions for the second team
    if(strcmp(team2,"nameofteam0")==0)
    {
            ++goalSum[0];
    }
    if(strcmp(team2,"nameofteam1")==0)
    {
            ++goalSum[1];
    }
    if(strcmp(team2,"nameofteam2")==0)
    {
            ++goalSum[2];
    }
}

次に、各チームの目標を比較します。

    const int numberOfTeams = 3;
    int winningTeam=0;

//You'll have to do the support for draws yourself.
    for(int i = 0; i<numberOfTeams; ++i)
    {
        if(sumOfGoal[i]>sumOfGoal[i+1])
        {
                winningTeam = i+1;
        }
        else
        {
                winningTeam = i+2;
        }
    }
    printf("Team%i wins!\n", winningTeam);
于 2012-11-25T23:46:49.427 に答える