1

私は C を学ぼうとしていますが、授業で取り組んでいるプロジェクトの関数を書くのに苦労しています。ファイルから読み込んで構造体のメンバーに分割した 7 つの異なるスコアの平均を求める必要があります。私が抱えている問題は、構造体のさまざまなメンバーを使用できるように、モジュラー関数を記述する方法を理解できないように見えることです。私が書いた関数とプロトタイプだけでなく、構造も含めています。検索しても検索しても、役立つものが見つからなかったので、どんな提案も大歓迎です。

私の構造:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXNAME         50
#define MAXSTUDENTS     100

int count;

typedef struct {

    char  name[MAXNAME];
    float quiz1;
    float quiz2;
    float quiz3;
    float quiz4;
    float midTerm1;
    float midTerm2;
    float final;
    float totalScore;
    char  finalGpa;

}student;

私のプロトタイプ:

float averageQuiz1(int count, student *dataList);

私の機能:

float averageQuiz1(int count, student *dataList)
{
int i;
float total = 0;

for (i = 0; i < count; i++) {

    total += dataList[i].quiz1;

}
return total/count;
}

繰り返しますが、これをモジュール化するための正しい方向に私を向ける助けがあれば、dataList[i].quiz を構造の別のメンバーに置き換えることができます。

4

1 に答える 1

2

すべてのスコアが配列になるように構造体を変更すると、柔軟性が大幅に向上します。

typedef enum { // define a new enum to select which score you're working with 
    quiz1,
    quiz2,
    quiz3,
    quiz4,
    midTerm1,
    midTerm2,
    final,
    totalScore,
    NUM_SCORES
} Score;

typedef struct {
    char  name[MAXNAME];
    float scores[NUM_SCORES]; // array of scores
    char  finalGpa;
} student;

averageQuiz次に、平均を計算するスコアを指定する汎用関数を使用できます。

float averageQuiz(int count, student *dataList, Score s)
{
    int i;
    float total = 0;
    float average = 0;

    for (i = 0; i < count; i++) {
        total += dataList[i].scores[s]; // <<< note that we are summing score `s` here
    }
    average = total/count; // <<< bug fix from @user2722968
    return average;
}

そして、これを次のように呼び出します

averageScore = averageQuiz(count, dataList, quiz1);
于 2013-09-10T05:48:38.570 に答える