geekdoc-python-zh/docs/overiq/135.md

5.3 KiB

C 程序:打印两个日期中较早的一个

原文:https://overiq.com/c-examples/c-program-to-print-the-earlier-of-the-two-dates/

最后更新于 2020 年 9 月 24 日


下面的 C 程序要求用户输入两个日期,并打印两个日期中较早的一个。

/**********************************************
 Program to print the earlier of the two dates 
 * 
 * Enter first date (MM/DD/YYYY): 20/10/2020
 * Enter second date (MM/DD/YYYY): 02/29/2001
 * 
 * 02/29/2001 comes earlier than 20/10/2020
 **********************************************/

#include<stdio.h> // include stdio.h library
int check_date(int date, int mon, int year);

int main(void)
{
    int day1, mon1, year1,
        day2, mon2, year2;

    int is_leap = 0, is_valid = 1;

    printf("Enter first date (MM/DD/YYYY): ");
    scanf("%d/%d/%d", &mon1, &day1, &year1);

    printf("Enter second date (MM/DD/YYYY): ");
    scanf("%d/%d/%d", &mon2, &day2, &year2);

    if(!check_date(day1, mon1, year1))
    {
        printf("First date is invalid.\n");        
    }

    if(!check_date(day2, mon2, year2))
    {
        printf("Second date is invalid.\n");
        exit(0);
    }

    if(year1 > year2)
    {
        printf("%02d/%02d/%d comes earlier than %02d/%02d/%d", 
                        mon2, day2, year2, mon1, day1, year1);
    }

    else if (year1 < year2)
    {
        printf("%02d/%02d/%d comes earlier than %02d/%02d/%d", 
                        mon1, day1, year1, mon2, day2, year2);
    }

    // year1 ==  year2
    else
    {
        if (mon1 ==  mon2)
        {
            if (day1 ==  day2)
            {
                printf("Both dates are the same.");
            }

            else if(day1 > day2)
            {
                printf("%02d/%02d/%d comes earlier than %02d/%02d/%d", 
                        mon2, day2, year2, mon1, day1, year1);
            }

            else
            {
                printf("%02d/%02d/%d comes earlier than %02d/%02d/%d", 
                        mon1, day1, year1, mon2, day2, year2);
            }
        }

        else if (mon1 > mon2)
        {
            printf("%02d/%02d/%d comes earlier than %02d/%02d/%d", 
                        mon2, day2, year2, mon1, day1, year1);
        }

        else 
        {
            printf("%02d/%02d/%d comes earlier than %02d/%02d/%d", 
                        mon1, day1, year1, mon2, day2, year2);
        }        
    }

    return 0; // return 0 to operating system
}

// function to check whether a date is valid or not

int check_date(int day, int mon, int year)    
{
    int is_valid = 1, is_leap = 0;

    if (year >= 1800 && year <= 9999) 
    {

        //  check whether year is a leap year
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 
        {
            is_leap = 1;
        }

        // check whether mon is between 1 and 12
        if(mon >= 1 && mon <= 12)
        {
            // check for days in feb
            if (mon == 2)
            {
                if (is_leap && day == 29) 
                {
                    is_valid = 1;
                }
                else if(day > 28) 
                {
                    is_valid = 0;
                }
            }

            // check for days in April, June, September and November
            else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) 
            {
                if (day > 30)
                {
                    is_valid = 0;
                }
            }

            // check for days in rest of the months 
            // i.e Jan, Mar, May, July, Aug, Oct, Dec
            else if(day > 31)
            {            
                is_valid = 0;
            }        
        }

        else
        {
            is_valid = 0;
        }

    }
    else
    {
        is_valid = 0;
    }

    return is_valid;

}

现在试试

**预期输出:**第一次运行:

Enter the first date (MM/DD/YYYY): 05/10/2016
Enter the second date (MM/DD/YYYY): 04/09/2016
04/09/2016 comes earlier than 05/10/2016

第二次运行:

Enter the first date (MM/DD/YYYY): 02/01/2008 
Enter the second date (MM/DD/YYYY): 02/01/2008
Both dates are the same.

它是如何工作的

程序首先要求用户输入两个日期。

在第 27 行和第 32 行,我们使用用户定义的check_date()函数检查输入的日期是否有效。要了解更多关于check_date()功能如何工作的信息,请访问此链接

如果其中一个日期无效,程序将终止,并显示相应的错误消息。

在第 39-85 行,我们有一个 if-else 语句来比较这两个日期。比较日期的算法如下:

  • 如果year1 > year2,第二次约会比第一次来得早。
  • 如果year1 < year2,第一次约会比第二次来得早。
  • 如果year1 == year2。以下情况是可能的:
    • 如果mon1 == mon2,可能出现以下情况:
      • 如果day1 == day2,两个日期相同。
      • 如果day1 > day2,那么第二次约会比第一次来得早。
      • 如果day1 < day2,那么第一次约会比第二次来得早。
    • 如果mon1 > mon2,第二次约会比第一次来得早。
    • 否则,mon1 < mon2和第一个日期比第二个来得早。