将+/-字母等级定义为常量。 C

时间:2012-09-30 23:58:14

标签: c arrays constants c-preprocessor

我正在尝试完成一个实验室,我必须从结构链表中给出的课程信息中计算总成绩平均分(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);
}

2 个答案:

答案 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)使用哈希表。如果您有大量映射,这是可取的。