2012-09-30 76 views
0

我想完成一個實驗室,我必須根據結構鏈接列表中給出的課程信息計算總學分平均值(GPA)。我試圖用適當的分數來定義每個字母等級('A'= 4.0,「A-」= 3.7 ...)。課程成績存儲在字符數組中。我可以使用#define衍生物來定義字母等級A,B,C,D,E,但我在定義+/-等級時遇到了問題。是否使用#define衍生物來實現此任務的正確方法?如果是這樣,有人能夠給我看適當的語法。將+/-字母等級定義爲常量。 C

/* Definition of a data node holding course information */ 
    struct course { 
    int term; 
    char name[15]; 
    char abbrev[20]; 
    float hours; 
    char grade [4]; 
    char type[12]; 
    struct course *next; 
    }; 



float gpa (struct course *ptr) 
{ 
    float totalhours; 
    float gpa; 
    float gradepoints; 

    while (ptr != NULL) 
    { 
     totalhours += (ptr->hours); 
     gradepoints = (ptr->hours * ptr->grade); 
    } 
    gpa = (gradepoints/totalhours); 
} 
+0

GPA =(gradepoints/totalhours); –

+1

我會立即建議您將該ptr提前到列表中的下一個,否則在循環結束之前將會是寒冷的一天。 – WhozCraig

+0

爲什麼不叫他們A_PLUS和A_MINUS?如果不行,原因在於你沒有提供的事實或代碼。 –

回答

1

你所尋找的是一個地圖,或字典,它本身並不在C.支持您可以實現您的使用情況下,一個簡單的地圖爲struct秒的數組作爲這樣的:

struct GradeInfo { 
    char *grade; 
    float value; 
}; 
struct GradeInfo GRADES[] = { {"A", 4.0}, {"A-", 3.7}, ..., {NULL, 0.0}}; 

然後循環移到該數組內的for循環(定影幾個更多的錯誤):

float gpa (struct course *ptr) 
{ 
    float totalhours = 0.0; 
    float gradepoints = 0.0; 

    for (; ptr; ptr = ptr->next) 
    { 
     float grade = -1.0; 
     struct GradeInfo *info; 
     for (info = GRADES; info->grade; ++info) { 
     if (!strcmp(ptr->grade, info->grade)) { 
      grade = info->value; 
      break; 
     } 
     } 
     if (grade < 0) { 
     continue; 
     } 
     totalhours += (ptr->hours); 
     gradepoints = (ptr->hours * ptr->grade); 
    } 
    if (!totalhours) { 
    return 0.0; 
    } 
    return (gradepoints/totalhours); 
} 
+0

你的數組*是*一張地圖。地圖可以實現爲線性數組,二叉樹或散列表(以及其他變體數據結構)。 –

+0

這段代碼仍然有一個錯誤...一個狡猾的學生可以通過不學習任何課程來調用UB。 –

+0

我知道這是一張地圖。我說C沒有像Python或Perl這樣的本地映射類型,甚至沒有C++ STL。也就是說,你不會使用'[]'或類似的語法糖。 – epsalon

0

你想要的是字符串常量,不能與那些名字變量...你可以定義宏,但它只是增加了一個毫無意義的額外的水平,因爲映射是固定的。例如,

// grade_string is a string read from the input 
float grade_value; 

if (strcmp(grade_string, "A") == 0) 
    grade_value = 4.0; 
else if (strcmp(grade_string, "A-") == 0) 
    grade_value = 3.7; 
etc. 

有一對夫婦更緊湊的方法可以做到這一點。

1)創建的映射的陣列,例如,

struct { 
    char* string; 
    double value; 
} grades = { {"A", 4.0}, {"A-", 3.7}, etc. }; 

和遍歷該陣列中,比較所述串grade_string並提取該值。例如,

int ngrades = sizeof grades/sizeof *grades; 
int i; 
for(i = 0; i < ngrades; i++) 
    if (strcmp(grades[i].string, grade_string) == 0) 
    { 
     grade_value = grade[i].value; 
     break; 
    } 

if (i == ngrades) 
    /* invalid grade */ 

2)使用散列表。如果您有大量的映射,這將是明智的。