/*

 * dates_2.c

 * This program reads a date and prints the dates of the week after this date.

 */

 

#include <stdio.h>

 

#define DAYS_IN_WEEK 7

 

struct _Date

{

  int  day;

  int  month;

  int  year;

};

 

typedef struct _Date Date;

 

/* Prototypes: */

void print_date (const Date *p_date);

void next_date (const Date *p_date, Date *p_next);

 

int main ()

{

  int       dd, mm, yy;

  Date      date;

  Date      next_week[1 + DAYS_IN_WEEK];

  int       i;

 

  /* Read the date (no validity checks for now). */

  printf ("Please enter a date: ");

  scanf ("%d %d %d", &dd, &mm, &yy);

 

  /* Set the date. */

  date.day = dd;

  date.month = mm;

  date.year = yy;

 

  next_week[0] = date;

 

  /* Compute the dates of the next week. */

  for (i = 0; i < DAYS_IN_WEEK; i++)

  {

    next_date (next_week + i, next_week + i + 1);

    /* Equivalent to:

       next_date (&(next_week[i]), &(next_week[i + 1])); */

  }

 

  /* Print out the results. */

  for (i = 1; i <= DAYS_IN_WEEK; i++)

  {

    printf ("After %d day(s): ", i);

    print_date (next_week + i);

    printf ("\n");

  }

 

  return (0);

}

 

/* ------------------------------------------------------------------------

 * Function: print_date

 * Purpose : Print a date in a nice format.

 * Input   : p_date - The date.

 * Returns : Nothing.

 */

void print_date (const Date *p_date)

{

  const char* month_names[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",

                                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

 

  printf ("%d %s %d", p_date->day,

                      month_names[p_date->month - 1],

                      p_date->year);

  return;

}

 

/* ------------------------------------------------------------------------

 * Function: next_date

 * Purpose : Compute the next date.

 * Input   : p_date - The current date.

 * Output  : p_next - The next date.

 * Returns : Nothing.

 */

void next_date (const Date *p_date, Date *p_next)

{

  int         days_in_month[12] = {31, 28, 31, 30, 31, 30,

                                   31, 31, 30, 31, 30, 31};

  int         days_in_curr_month;

 

  /* Copy the current day. */

  *p_next = *p_date;

 

  /* Increment the day and check whether the date is still legal. */

  p_next->day++;

  days_in_curr_month = days_in_month[p_date->month - 1];

 

  if (p_date->month == 2)

  {

    /* February may have 28 or 29 days (in a leap year).

       It has 29 days if the year is divided by 4, but not by 100 or if it is

       divided by 400. */

    if ((p_date->year % 4 == 0) &&

        (p_date->year % 100 != 0 || p_date->year % 400 == 0))

    {

      days_in_curr_month++;

    }

  }

 

  if (p_next->day > days_in_curr_month)

  {

    /* Move to the next month. */

    p_next->day = 1;

    p_next->month++;

 

    if (p_next->month > 12)

    {

      /* Move to the next year. */

      p_next->month = 1;

      p_next->year++;

    }

  }

 

  return;

}