确定闰年的 C 程序在输入 2000、1900 或 2100 作为输入时未给出任何输出

A leap year determining C program is not giving any output when inputting 2000, 1900 or 2100 as an input

当我在 运行 这个 C 程序中,并给出 2020、2024 或其他可以被 4 整除的年份时,我得到了预期的输出,即它是闰年。 但是当我给出世纪年份:1900、2000 或 2100 等作为输入时,它并没有给我任何输出。

Please do not suggest me the correct program as there are many available on internet and I understood them already. You are requested to tell me why my program is not giving any output when entering a century year.

P.S。这个程序没有报错。

节目:

#include <stdio.h>

int main()
{
    int n;
    printf("Enter year : "); scanf("%d",&n);
    
    if (n%4==0)
    {
        if(n%100 != 0)
        {
            printf("Leap year"); 
        }
    }
    else if(n%100 == 0)
    {
        if (n%400==0)
        {
            //`enter code here`
            printf("Leap year");
        }
    }
    else 
        printf("Not a Leap year");

    return 0;
}

这个if语句

    if (n%4==0)
{
    if(n%100 != 0)
    {
        printf("Leap year"); 
    }
}

控制1900这样的年份,因为它们可以被4整除。但是这样的年份也可以被100整除,所以什么都不输出。

所以你的程序存在逻辑错误

您可以按以下方式重写 if 语句

if ( ( n % 4 != 0 ) || ( n % 100 == 0 && n % 400 != 0 ) )
{
    printf("Not a Leap year");
}
else
{ 
    printf("Leap year"); 
}

if ( ( n % 4 == 0 ) && ( n % 400 == 0 || n % 100 != 0 ) )
{
    printf("Leap year"); 
}
else
{ 
    printf("Not a Leap year");
}

或者如果使用嵌套的 if-else 语句,那么代码可以看起来像

if ( n % 4 == 0 )
{
    if ( n % 400 == 0 )
    {
        printf("Leap year"); 
    }
    else if ( n % 100 != 0 )
    {
        printf("Leap year"); 
    }
    else
    {
        printf("Not a Leap year");
    }
}
else
{ 
    printf("Not a Leap year");
}

这部分代码有问题:

if (n%4==0)
{
    if(n%100 != 0)
    {
        printf("Leap year"); 
    }
}

当你输入1900,就进入了第一个条件。 (因为 1900%4 等于零。)然后,它检查 1900%100 是否为零,如您所见,它为零,所以它不会输入 if(n%100!=0 ) 条件,并且 if (n%4==0) 中没有其他 else 语句。所以代码进入是没有条件的。因此它不提供任何输出。 另外,您的代码永远不会进入 else if(n%100 == 0) 部分,因为任何可被 100 整除的数字也可被 4 整除。

您的逻辑结构如下:

if ( n % 4 == 0 )
{
    if ( n % 100 != 0 )
    {
        printf( "Leap year\n" ); 
    }
}

else if ( n % 100 == 0 )
{
    if ( n % 400 == 0 )
    {
        printf( "Leap year\n" );
    }
}

else
{
    printf( "Not a Leap year\n" );
}

我不会写 else if,而是在每个 else 语句中添加大括号 { },以明确 else 实际上是什么指的是。添加大括号不会改变程序的行为。

if ( n % 4 == 0 )
{
    if ( n % 100 != 0 )
    {
        printf( "Leap year\n" ); 
    }
}
else
{
    if ( n % 100 == 0 )
    {
        if ( n % 400 == 0 )
        {
            printf( "Leap year\n" );
        }
    }
    else
    {
        printf( "Not a Leap year\n" );
    }
}

现在可以清楚的看到,如果if条件n % 4 == 0为真,则执行第一个外块,否则执行第二个外块。

但是,这个逻辑是错误的。如果条件 n % 4 == 0 为真,那么第一个外部块将被执行,这意味着如果 if 条件 n % 100 != 0 为真,你的程序将打印 "Leap year",但是如果 if 条件为假,则什么也不做(即什么也不打印)。这不是你想要的。

你要的是下面的逻辑:

if ( n % 4 != 0 )
{
    printf( "Not a Leap year\n" );
}
else
{
    if ( n % 100 != 0 )
    {
        printf( "Leap year\n" );
    }
    else
    {
        if ( n % 400 != 0 )
        {
            printf( "Not a Leap year\n" );
        }
        else
        {
            printf( "Leap year\n" );
        }
    }
}

这可以通过删除所有大括号来更紧凑地编写:

if ( n % 4 != 0 )
    printf( "Not a Leap year\n" );

else if ( n % 100 != 0 )
    printf( "Leap year\n" );

else if ( n % 400 != 0 )
    printf( "Not a Leap year\n" );

else
    printf( "Leap year\n" );