用C语言判断--某年某月某日是这一年的第几天

C判断输入的年月日是这一年的第几天

这道题我们主要是练就思路问题,然后是解题方法。比如我们看到题目,接下来就应该想到一些特殊情况:一年中的月份有大月和小月,而且还有最特殊的是二月,在闰年是28天,平年是29天,然后继续想,就会知道我们接下来要做的就是想到判断闰年的条件,然后把月份以某种形式表达出来,比如用switch,或者数组,然后就可以开始写代码了。

#define YEAR_ERROR   -1          //告诉人们这是年份输入错误,不然返回-1也不知道哪里错了,使其更具有可读性
#define MONTH_ERROR  -2
#define DAY_ERROR    -3
bool is_Leapyear(int year)
{
	return (year % 100 != 0 && year % 4 == 0 || year % 400 == 0);
}
int Get_YM_days(int year, int month)
{
	int days[13] = { 28,31,29,31,30,31,30,31,31,30,31,30,31 };
	if (is_Leapyear(year) && month == 2)
	{
		month = 0;
	}
	return days[month];
}
int Get_YMD_days(int year, int month, int day)
{
	int sum = 0;
	if (year < 1)return YEAR_ERROR;
	if (month < 1 || month>13) return MONTH_ERROR;
	if(day<1||day>Get_YM_days(year,month)) return DAY_ERROR;
	for (int i = 1; i <= month; ++i)
	{
		sum += Get_YM_days(year, i);
	}
	return sum + day;
}
int main()
{
	int year,month,day;
	int sum = 0;
	char ch = '\0';
	do
	{
		printf("please input year  month  day\n");
		scanf_s("%d %d %d", &year, &month, &day);
		sum = Get_YMD_days(year, month, day);
		switch (sum)
		{
		case YEAR_ERROR:
			printf("year input error \n");
			break;
		case MONTH_ERROR:
			printf("month input error \n");
			break;
		case DAY_ERROR:
			printf("day input error \n");
			break;
		default:
			printf("%d year %d month %d day => total: %d\n", year, month, day, sum);
			break;
		}
		printf("是否继续(y/n)\n");
		getchar();              //接收缓冲区的\n
		ch = getchar();
	} while (ch == 'y' || ch == 'Y');
	return 0;
}

运行结果如下:
代码运行终端

这个代码还多加了一个循环,告诉用户,输入之后如果还想继续运行程序,就输入y或者Y,否则按其他键直接退出;
在上述代码中,我们就以判断闰年为例,解读一下文章前面所说的练就思路问题;
我们一说判断闰年,正常人都会想到用条件语句,很正常,比如:

int is_Leapyear(int year)
{
	if(year%4==0&&year%100!=0||year%400==0)
	{
		return 1;
	}
	else 
	{
		return 0;
	}
}

然后我们可以再想一下,怎么可以少一个else语句,就想到了我们的初始化:

int is_Leapyear(int year)
{
	int n=0;
	if(year%4==0&&year%100!=0||year%400==0)
	{
		n=1;
	}
	return n;
}

然后我们又想到返回值是1后者0,我们可以直接用bool类型,所以就有:

bool is_Leapyear(int year)
{
	return (year % 100 != 0 && year % 4 == 0 || year % 400 == 0);
}

代码就是这样一步一步完善的,再比如下面的Get_YM_days()函数,我们上面用了数组,这样方便,前面也可以用switch,比如:

switch(month)
{
	case 1: case 3: case 5: case 7: case 8: case 10: case 12: 
	day=31;
	breakl
	case 4: case 6: case 9 : case 11:
	day=30;
	break;
	dafault :
	if (Is_Leapyear(year))
		{
			day = 29;
		}
		else
		{
			day = 28;
		}
}

很显然,这个就没有以下标方式表明简洁,所以我们每次写完代码后,完全可以自己再多看几遍,找一些简单的方法或者可读性更好的代码进行表示。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值