home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_01_02 / 1n02040a < prev    next >
Text File  |  1990-07-09  |  2KB  |  108 lines

  1.  
  2. ----------
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #define rangeof(lo, hi) ((hi) - (lo) + 1)
  8. #define WEEKS_PER_MONTH 6
  9.  
  10. enum day {SUN, MON, TUE, WED, THU, FRI, SAT};
  11. typedef enum day day;
  12.  
  13. static const char *day_image[] =
  14.     {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", NULL};
  15.  
  16. enum month
  17.     {
  18.     JAN, FEB, MAR, APR, MAY, JUN,
  19.     JUL, AUG, SEP, OCT, NOV, DEC
  20.     };
  21. typedef enum month month;
  22.  
  23. static const char *month_image[] =
  24.     {
  25.     "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
  26.     "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", NULL
  27.     };
  28.  
  29. typedef int monthly_calendar[WEEKS_PER_MONTH][rangeof(SUN, SAT)];
  30. typedef monthly_calendar annual_calendar[rangeof(JAN, DEC)];
  31.  
  32. /*
  33.  * return the number of week days in a month
  34.  */
  35. int monthly_week_days(monthly_calendar cal)
  36.     {
  37.     day d;
  38.     int w, sum = 0;
  39.  
  40.     for (w = 0; w < WEEKS_PER_MONTH; ++w)
  41.         for (d = MON; d <= FRI; ++d)
  42.             if (cal[w][d] > 0)
  43.                 ++sum;
  44.     return sum;
  45.     }
  46.  
  47. /*
  48.  * print a monthly calendar to stdout
  49.  */
  50. void print_monthly(monthly_calendar cal)
  51.     {
  52.     day d;
  53.     int w;
  54.  
  55.     for (w = 0; w < WEEKS_PER_MONTH; ++w)
  56.         {
  57.         for (d = SUN; d <= SAT; ++d)
  58.             if (cal[w][d] > 0)
  59.                 printf("%4d", cal[w][d]);
  60.             else
  61.                 printf("    ");
  62.         putchar('\n');
  63.         }
  64.     putchar('\n');
  65.     }
  66.  
  67. /*
  68.  * fgete(t, f) gets an enumeration value from FILE f using image
  69.  * table t. It returns the integer value corresponding to the
  70.  * image read, or EOF if no legitimate value is found.
  71.  */
  72. int fgete(const char *t[], FILE *f)
  73.     {
  74.     char buf[BUFSIZ];
  75.     const char **p;
  76.  
  77.     if (fscanf(f, "%s", buf) == 1)
  78.         for (p = t; *p != NULL; ++p)
  79.             if (strcmp(buf, *p) == 0)
  80.                 return p - t;
  81.     return EOF;
  82.     }
  83.  
  84. int main(void)
  85.     {
  86.     annual_calendar cal;
  87.     day d;
  88.     FILE *f;
  89.     int w;
  90.     month m;
  91.  
  92.     f = fopen("cal.dat", "r");
  93.     for (m = JAN; m <= DEC; ++m)
  94.         for (w = 0; w < WEEKS_PER_MONTH; ++w)
  95.             for (d = SUN; d <= SAT; ++d)
  96.                 fscanf(f, "%d", &cal[m][w][d]);
  97.     fclose(f);
  98.     for (m = JAN; m <= DEC; ++m)
  99.         print_monthly(cal[m]);
  100.     while ((m = fgete(month_image, stdin)) != EOF)
  101.         printf("week days in %s = %d\n",
  102.             month_image[m], monthly_week_days(cal[m]));
  103.         return EXIT_SUCCESS;
  104.     }
  105.  
  106. Listing 4 - Calendars in C
  107.  
  108.