确定闰年的 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" );
当我在 运行 这个 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" );