我正在尝试完成一个实验室,我必须从结构链表中给出的课程信息中计算总成绩平均分(GPA)。我正在尝试用适当的等级点定义每个字母等级('A'= 4.0,“A-”= 3.7 ......)。课程成绩存储在字符数组中。我可以使用#define
导数来定义字母等级A,B,C,D,E,但我无法定义+/-等级。是否正确使用#define
衍生物来实现此任务?如果是这样,有人能够告诉我正确的语法。
/* 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 :(得分:1)
您正在寻找的是C中本身不支持的地图或字典。您可以为您的用例实现一个简单的地图,作为struct
s的数组:
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);
}
答案 1 :(得分: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)使用哈希表。如果您有大量映射,这是可取的。