Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义+;/-字母等级作为常量。C_C_Arrays_Constants_C Preprocessor - Fatal编程技术网

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

定义+;/-字母等级作为常量。C,c,arrays,constants,c-preprocessor,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

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

您需要的是字符串文本,而不是具有这些名称的变量。。。您可以定义宏,但它只是添加了一个毫无意义的额外级别,因为映射是固定的。e、 g

// 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_字符串进行比较并提取值。e、 g

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 */
int ngrades=sizeof grades/sizeof*grades;
int i;
对于(i=0;i

2) 使用哈希表。如果您有大量映射,则建议您这样做。

您要查找的是一个映射或字典,而C本机不支持它。您可以将用例的简单映射实现为一个
结构数组,如下所示:

struct GradeInfo {
  char *grade;
  float value;
};
struct GradeInfo GRADES[] = { {"A", 4.0}, {"A-", 3.7}, ..., {NULL, 0.0}};
然后在for循环中循环此阵列(修复了更多的bug):

float gpa(结构课程*ptr)
{
浮动总小时数=0.0;
浮点数=0.0;
对于(;ptr;ptr=ptr->next)
{
浮动等级=-1.0;
结构等级信息*info;
对于(信息=等级;信息->等级;++info){
如果(!strcmp(ptr->grade,info->grade)){
等级=信息->价值;
打破
}
}
如果(等级<0){
继续;
}
总小时数+=(ptr->小时数);
成绩点=(ptr->小时*ptr->成绩);
}
如果(!总小时数){
返回0.0;
}
返回(成绩点/总小时);
}

gpa=(成绩点/总小时数);我建议你马上将ptr提前到列表中的下一个,否则在循环退出之前会是寒冷的一天。为什么不把它们称为加号和减号呢?如果这样不行,原因在于您没有提供的事实或代码。啊,是的,谢谢-我收到的是作为输入的字母等级。可能输入的值是{A=4.0,A-=3.7,B+=3.3,B=3.0,B-=2.7,C+=2.3,C=2.0,C-=1.7,D+=1.3,D=1.0,E=0.0}其他等级,UEN,EN,R,I等被忽略。'。。。但当它这样做时,ptr将为NULL,从而导致UB。大概最后一行应该是“gpa=(成绩点/总小时)”;“。。。如果没有课程,仍然会产生UB。给那些渴望成为程序员的人一个提示:学会关注细节,并在编写代码后阅读代码。你的数组就是一张地图。映射可以实现为线性数组、二叉树或哈希表(以及这些映射的其他变体数据结构)。。。一个狡猾的学生可以通过不上任何课程来调用UB。我知道这是一张地图。我是说C没有一个本地的映射类型,比如Python或者Perl,甚至C++ STL。也就是说,使用
[]
或诸如此类的东西,你不会得到语法上的甜头。我无法知道你知道什么,只知道你写了什么。你的回答中没有提到你“正在说”的内容。你把语法和“本机”混为一谈了。。。许多系统在库中提供这些数据结构,但没有将它们构建到语法中(这在C++中肯定是正确的)。我重申:当您编写“您正在寻找的是一个映射”时,您误导了读者,因为该数组是一个映射。当你谈到“本地地图类型”时。。。本机贴图类型可以实现为线性数组。一些复杂的系统(如Scala)实际上会对小地图执行此操作。
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);
}