0

列挙型を評価する方法はありますか?構造体に組み込まれている列挙型があります:

typedef enum {MW, TR} days;

typedef struct {
  int hour, min;
} Time;

typedef struct {
  char Dept[5];
  int course, sect;
  days meet_days;
  Time start, end;
  char instr[20];
} sched_record;

列挙型の私の印刷ステートメントは次のとおりです。

 data[i].meet_days == MW ? "MW" : "TR"

私がやろうとしているのは、sched_recordのtypedef構造体に、たとえばMWが含まれているレコードのみを出力するようにすることです。プログラムの「メニュー」は次のとおりです。

 fread(data, sizeof(sched_record), MAX_RECORD, filePointer);
        fclose(filePointer);
        printf("Enter the Department or A for any Department: ");
        scanf("%s", tempDept);
        printf("Enter the Course or 0 for any course: ");
        scanf("%d", &tempCourse);
        printf("Enter the Days; M = MW, T = TTH or D=Don't Care: ");
        scanf("%s", tempDay);
        printf("Enter the Time; A=Mornings, P=Afternoons or D=Don't Care: ");
        scanf("%s", tempTime);

sched_recordsを、次の簡単なステートメントで時間ごとに印刷するようにしました。

 else if ((strcmp(tempDept, "A")==0) && tempCourse == 0 && (strcmp(tempDay, "D")==0) && (strcmp(tempTime, "P")==0)) {
                            if (data[i].start.hour >= 12) {  // <---Time comparison
                                printf("%s %d %d %2s %02d%02d %02d%02d %s\n", data[i].Dept, data[i].course, data[i].sect, data[i].meet_days == MW ? "MW" : "TR",
                                   data[i].start.hour, data[i].start.min, data[i].end.hour, data[i].end.min, data[i].instr);
                     }
                }

                else if ((strcmp(tempDept, "A")==0) && tempCourse == 0 && (strcmp(tempDay, "M")==0) && (strcmp(tempTime, "D")==0)) {
                        printf("\n%s %d", data[i].Dept, data[i].course);

列挙型で同じことを行う時間比較のような簡単な方法があるかどうか疑問に思います。もしそうなら、誰かが私に見せてもらえますか?

4

2 に答える 2

2

列挙値は、他の整数変数と同じ方法で比較できます。

if (data[i].meet_days == MW)
  .....

または、すべての日について列挙型があったとすると、次のようになります。

enum days {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

次に、次のような範囲をテストできます。

if (day >= Monday || day <= Friday)
  printf ("It's a weekday!\n");

お役に立てば幸いです。

于 2012-05-02T15:38:35.400 に答える
1

これに対する別のアプローチは、特定のビットが設定されるように列挙値を定義することです。たとえば、「月曜日」から「金曜日」までのすべての日に特定のビットが設定されていることを確認します。

したがって:

#define WEEKDAY 0x100
typedef enum {
 SUNDAY   = 1,
 MONDAY   = 2 | WEEKDAY,
 TUESDAY  = 3 | WEEKDAY,
 WEDNESDAY= 4 | WEEKDAY,
 THURSDAY = 5 | WEEKDAY,
 FRIDAY   = 6 | WEEKDAY,
 SATURDAY = 7
} days;

次に、その日が平日であるかどうかを確認する場合:

if (day & WEEKDAY) {
 printf("Day %d is a weekday!\n", day);
}

これにXMACROを使用することで、さらに洗練されたものを得ることができます。しかし、これはOPの演習として残しておきます:)

ビットフラグアプローチを使用すると、実際に常に範囲比較を行うことなく、日々の任意の分類を追加できます。

于 2012-05-02T18:05:42.983 に答える