0

リンクされた構造のリストにあるコース情報から合計成績平均点(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);
}
4

2 に答える 2

1

探しているのは、Cでネイティブにサポートされていないマップまたは辞書です。ユースケースの単純なマップを、structsの配列として実装できます。

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);
}
于 2012-10-01T00:33:45.803 に答える
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)ハッシュテーブルを使用します。マッピングの数が多い場合は、これをお勧めします。

于 2012-10-01T00:27:15.207 に答える