Software & Finance





Turbo C++ - Time Span Finding the number of days between two days





I have given here the source code for the time span. Given two days as input, it will count the number of days in between.

 

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 <iostream.h>

#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;

    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(int 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(int d1 = begmonth + 1; d1 <= 12; d1++)

      {

            if(bLeap == true)

                numdays += arrleapnumdays[d1 - 1];

            else

                numdays += arrnumdays[d1 - 1];

        }

 

        if(diffyears > 1)

        {

            for(int 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(int 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;

 

    cout << "Enter Begin Date: ";

    cin >> begdate;

    cout << "Enter Begin Month: ";

    cin >> begmonth;

    cout << "Enter Begin Year: ";

    cin >> begyear;

 

    cout << "Enter End Date: ";

    cin >> enddate;

    cout << "Enter End Month: ";

    cin >> endmonth;

    cout << "Enter End Year: ";

    cin >> endyear;

 

    char bd[128], ed[128];

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

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

 

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

    if(numdays== -1)

      cout << "The start date is greater than end date\n";

    else if(numdays == -2)

      cout << "Not a valid start date\n";

    else if(numdays == -3)

      cout << "Not a valid end date\n";

    else

      cout << "Number of days Between " << bd << " and " << ed << " is : " << numdays << "\n";

 

      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 . . .