/*

 * dates_1.c

 * This program reads a date and prints the dates of the days before and after

 * this date.

 */

 

#include <stdio.h>

 

struct Date

{

  int  day;

  int  month;

  int  year;

};

 

/* Prototypes: */

void print_date (struct Date date);

struct Date next_date (struct Date date);

struct Date prev_date (struct Date date);

 

int main ()

{

  int          dd, mm, yy;

  struct Date  date;

  struct Date  prev;

  struct Date  next;

 

  /* 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;

 

  /* Compute the previous date and the next date. */

  prev = prev_date (date);

  next = next_date (date);

 

  /* Print out the results. */

  printf ("Yesterday was: ");

  print_date (prev);

  printf ("\n");

 

  printf ("Today is: ");

  print_date (date);

  printf ("\n");

 

  printf ("Tomorrow will be: ");

  print_date (next);

  printf ("\n");

 

  return (0);

}

 

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

 * Function: print_date

 * Purpose : Print a date in a nice format.

 * Input   : date - The date.

 * Returns : Nothing.

 */

void print_date (struct Date date)

{

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

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

 

  printf ("%d %s %d", date.day, month_names[date.month - 1], date.year);

  return;

}

 

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

 * Function: next_date

 * Purpose : Compute the next date.

 * Input   : date - The current date.

 * Returns : The date of the next day.

 */

struct Date next_date (struct Date date)

{

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

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

  struct Date res = date;

 

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

  res.day++;

 

  if (res.day > days_in_month[res.month - 1])

  {

    /* Move to the next month. */

    res.day = 1;

    res.month++;

 

    if (res.month > 12)

    {

      /* Move to the next year. */

      res.month = 1;

      res.year++;

    }

  }

 

  return (res);

}

 

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

 * Function: prev_date

 * Purpose : Compute the previous date.

 * Input   : date - The current date.

 * Returns : The date of the previous day.

 */

struct Date prev_date (struct Date date)

{

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

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

  struct Date res = date;

 

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

  res.day--;

 

  if (res.day == 0)

  {

    /* Move to the previous month. */

    res.month--;

 

    if (res.month == 0)

    {

      /* Move to the previous year. */

      res.month = 12;

      res.year--;

    }

 

    /* Set the day to be the last of the month. */

    res.day = days_in_month[res.month - 1];

  }

 

  return (res);

}