make known 2019.11.7.23.02:Judging whether the date (year, month, and day) is legal

记录于2019/11/8 1:00

语言标准(-std)

ISO C99

输入

三个正整数

输出

OK
NO

测试用例

1200 2 29
输出 OK
1900 2 29
输出 NO
2019 2 29
输出 NO
2018 4 31
输出 NO
2017 13 1
输出 NO
2016 1 0
输出 NO
2015 0 28
输出 NO
2019 12 12
输出 OK

代码片(C)

反思1boolelse使用出错.

#include <stdio.h>
#include <stdbool.h>
int main() 
{
    int year, month, day;
    bool y,m,d;
    while(scanf("%d%d%d",&year,&month,&day) != EOF)
    {
    	/*year*/
		if(year >= 0)
    		y = 1;
    	else
    		y = 0;
    	/*month*/
    	if(month >= 1 && month <= 12)
    		m = 1;
    	else
    		m = 0;
		/*day==30*/
    	if(month == 4 || month == 6 || month == 9 || month == 11) 
		{
        	if(day >= 1 && day <= 30)
        		d = 1;
        	else
        		d = 0;
    	} 
    	/*day==28 or 29*/
    	if(month == 2) 
    	//此处应该在if前加一个else,保证执行与此if匹配的else语句块时
    	//不会重复执行覆盖掉当month为(4.6.9.11)时的d值 
		{
        	if((year%4 == 0 && year%100 != 0) || (year%400 == 0)) 
			{
            	if(day >= 1 && day <= 29)
            		d = 1;
            	else
            		d = 0;
        	}
        	else
        	{
            	if(day >= 1 && day <= 28)
            		d = 1;
            	else
            		d = 0;
        	}
    	}
    	/*day==31*/
        //这里本意是希望执行
        //else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month ==12)
        else
        {
        	if(day >= 1 && day <= 31)
        		d = 1;
        	else
        		d = 0;
		}  
		/*bool*/ 
    	if(y == 1 && m == 1 && d == 1)
    		printf("OK\n");
    	else
    		printf("NO\n");
	}
    return 0;
}

函数(isValid_date)

#include <stdio.h>
int isValid_date(int year, int month, int day); //判断日期(年月日)是否合法的函数声明
int main()
{
	int y, m, d; //定义3个变量分别来存放输入的年、月、日
	while(scanf("%d%d%d", &y, &m, &d) != EOF)
	{
		if (isValid_date(y, m, d) == 1)
			printf("OK\n");
		else
			printf("NO\n ");
	}
	return 0;
}
int isValid_date(int year, int month, int day)//判断日期(年月日)是否合法的函数定义
{
	int leap = 0;  //判断闰年的标记

	if (month < 1 || month>12 || day < 1 || day>31)
		return 0; //返回不合法

	if ((month == 4 || month == 6 || month == 9 || month == 11) && (day == 31))
		return 0;//返回不合法

	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)//判断是否是闰年
		leap = 1; //是闰年

	if ((leap == 1 && month == 2 && day > 29) || (leap == 0 && month == 2 && day > 28))
		return 0;//返回不合法

	return 1; //返回合法
}

请参考:最简单的C语言判断日期合法性函数

#include <stdio.h>
int isValid_date(int year, int month, int day); 
int main()
{
	int y, m, d; 
	while(scanf("%d%d%d", &y, &m, &d) != EOF)
	{
		if (isValid_date(y, m, d) == 1)
			printf("OK\n");
		else
			printf("NO\n");
	}
	return 0;
}
int isValid_date(int year,int month,int day)
{
    int Month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
 
    if (month==2)
        ((year%4 == 0 && year%100 != 0) || (year%400 == 0)) ? Month[1]+=1 : Month[1];
 
    if (month>12 || month<1 || day>Month[month-1] || day<1)
        return 0;
 
    return 1;
} 

End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值