Software & Finance





C Programming (Turbo C++ Compiler) - Time Span Finding the number of days between two days





I have given here the source code for the time span.

The logic for finding leap year is applying the following two rules,

First Rule:
The year divisible by 4 is a leap year.
Second Rule: If the year is divisible by 100, then it is not a leap year. But If the year is divisible by 400, then it is a leap year.


Source Code


#include <stdio.h>

#include <conio.h>

 

 

static int arrnumdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

static int arrleapnumdays[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

 

typedef enum _boolean

{

    true = 1, false = 0

} bool;

 

 

 

bool IsLeapYear(int year)

{

    if((year % 4) == 0)

    {

        if((year % 100) == 0)

        {

            if( (year % 400) == 0)

                return true;

            else

            return false;

        }

        else

            return true;

    }

    return false;

}

 

bool CheckDate(int date, int month, int year)

{

    if(year < 0 || year > 10000)

        return false;

    if(month < 1 || month > 12)

      return false;

    if(date < 1 || date > 31)

        return false;

    if(IsLeapYear(year) == true)

    {

        if( date > arrleapnumdays[month-1])

            return false;

    }

    else

      if( date > arrnumdays[month-1])

          return false;

 

    return true;

}

 

int GetNumDays(int begdate, int begmonth, int begyear, int enddate, int endmonth, int endyear)

{

    int diffyears = endyear - begyear;

    int numdays = 0;

    int days = -1;

    int m, y, d1, d2;

    bool bLeap = false;

 

    if(diffyears < 0)

      return -1; // The start date is greater than end date

 

    if( CheckDate(begdate, begmonth, begyear) == false)

      return -2; // Not a valid start date

    if(CheckDate(enddate, endmonth, endyear) == false)

      return -3; // Not a valid end date

 

    if(diffyears == 0)  // same year

    {

      int diffmonth = endmonth - begmonth;

      if(diffmonth < 0)

          return -1; // The start date is greater than end date

      if(diffmonth == 0)

      {

          numdays = enddate - begdate;

          if(numdays < 0)

            return -1; // The start date is greater than end date

          return numdays;

 

      }

      else

      {

          bLeap = IsLeapYear(begyear);

          // Beg date of end of Beg month

          if(bLeap == true)

            days = arrleapnumdays[begmonth - 1];

          else

            days = arrnumdays[begmonth - 1];

          numdays += days - begdate;

 

          if(diffmonth > 1)

          {

            for(m = begmonth + 1; m <= endmonth - 1; m++)

                {

                if(bLeap == true)

                  numdays += arrleapnumdays[m - 1];

                else

                        numdays += arrnumdays[m - 1];

                }

            }

 

            // Beg of End month to End date

          numdays += enddate;

        }

    }

    else

    {

      // Beg Date to end of beg year (Dec 31, YYYY)

        bLeap = IsLeapYear(begyear);

      if(bLeap == true)

            days = arrleapnumdays[begmonth - 1];

        else

            days = arrnumdays[begmonth - 1];

        numdays += days - begdate;

      for(d1 = begmonth + 1; d1 <= 12; d1++)

      {

          if(bLeap == true)

            numdays += arrleapnumdays[d1 - 1];

          else

            numdays += arrnumdays[d1 - 1];

      }

 

      if(diffyears > 1)

      {

          for(y = begyear + 1; y <= endyear - 1; y++)

          {

            if(IsLeapYear(y) == true)

                numdays += 366;

            else

                numdays += 365;

          }

      }

 

      // Beg of End Year (Jan 01, YYYY) to End Date

      bLeap = IsLeapYear(endyear);

      for(d2 = 1; d2 <= endmonth - 1; d2++)

      {

          if(bLeap == true)

            numdays += arrleapnumdays[d2 - 1];

          else

            numdays += arrnumdays[d2 - 1];

      }

        numdays += enddate;

    }

    return numdays;

}

 

int main()

{

    int begdate, begmonth, begyear;

    int enddate, endmonth, endyear;

    char bd[128], ed[128];

    int numdays;

 

    printf("Enter Begin Date: ");

    scanf("%d", &begdate);

    printf("Enter Begin Month: ");

    scanf("%d", &begmonth);

    printf("Enter Begin Year: ");

    scanf("%d", &begyear);

 

    printf("Enter End Date: ");

    scanf("%d", &enddate);

    printf("Enter End Month: ");

    scanf("%d", &endmonth);

    printf("Enter End Year: ");

    scanf("%d", &endyear);

 

    sprintf(bd, "(DD/MM/YYYY) %02d/%02d/%04d", begdate, begmonth, begyear);

    sprintf(ed, "%02d/%02d/%04d", enddate, endmonth, endyear);

 

    numdays = GetNumDays(begdate, begmonth, begyear, enddate, endmonth, endyear);

    if(numdays== -1)

      printf("The start date is greater than end date\n");

    else if(numdays == -2)

      printf("Not a valid start date\n");

    else if(numdays == -3)

      printf("Not a valid end date\n");

    else

      printf("Number of days Between %s and %s is : %d\n", bd, ed, numdays);

 

    return 0;

}

Output


Enter Begin Date: 6

Enter Begin Month: 2

Enter Begin Year: 1978

Enter End Date: 1

Enter End Month: 11

Enter End Year: 2010

 

Number of days Between (DD/MM/YYYY) 06/02/1978 and 01/11/2010 is : 11956

 

Press any key to continue . . .

 

 

Enter Begin Date: 31

Enter Begin Month: 2

Enter Begin Year: 2010

Enter End Date: 10

Enter End Month: 10

Enter End Year: 2010

 

Not a valid start date

 

Press any key to continue . . .

 

 

Enter Begin Date: 10

Enter Begin Month: 10

Enter Begin Year: 2010

Enter End Date: 10

Enter End Month: 10

Enter End Year: 2000

 

The start date is greater than end date

 

Press any key to continue . . .