目录
问题:
请输入年份和月份,输出这一年这个月有多少天?
例如:程序中输入2000年2月,那么显示该年该月有29天。
解题思路:
首先在我们解决这个问题之前,我们要考虑到有一种特殊的情况:闰年
那么我们如何去判断这一年是不是闰年呢? 判断是不是闰年的条件满足以下两个就行:
(1)对应年份能被4整除,并且不能被100整除
(2)对应年份能被400整除
解决完了闰年的问题之后,我们就可以解决这个问题了,我们选择不用switch语句来实现,这次我们可以用自定义函数来解决这个问题,大家跟着我往下看。
代码示例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//是闰年返回1
//不是闰年返回0
int is_leap_year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
return 1;
else
return 0;
}
int get_days_of_month(int y, int m)
{
int mon[] = { 0, 31 ,28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//对应月份下标 0 1 2 3 4 5 6 7 8 9 10 11 12
int day = mon[m];
if (is_leap_year(y) && m == 2)//满足闰年并且是二月份
{
day++;
}
return day;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d %d", &year, &month);
int d = get_days_of_month(year, month);
printf("%d年%d月有%d天", year, month, d);
return 0;
}
运行结果如下:
代码解析
1. 首先我们定义一个变量year和变量month来表示年和月,这个问题我们需要自定义两个函数来解决,分别是 get_days_of_month 和 is_leap_year ,我们先创建一个变量d来接收 get_days_of_month函数的值
int year = 0;
int month = 0;
scanf("%d %d", &year, &month);
int d = get_days_of_month(year, month);
2.首先我们创建第一个函数 is_leap_year 用来判断这一年是不是闰年,用到上面说的判断闰年的条件,然后是闰年就返回1,不是闰年就返回0,由于我们需要接收这个函数的返回值,所以函数类型定义成int型
int is_leap_year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
return 1;
else
return 0;
}
3. 然后我们创建下一个函数 get_days_of_month,因为我们也需要接收这个函数的返回值,所以我们要定义int型,我们在函数内部创建一个叫mon的数组,然后给上值{0, 31 , 28, 31 , 30, 31, 30, 31, 31, 30, 31, 30, 31}, 这时候就有人会问了:奇怪啊,为什么会有个元素0呢?难道一年当中有月份是0天吗。 当然不是,我们用了一个非常巧妙的方法来表示天数对应的月份,就是利用数组的下标来表示月份,因为下标的特性刚好契合了十二个月份。由于数组下标是从0开始的,所以我们就要多加一个元素0来对应这个下标。
接下来我们定义一个变量day来表示数组里面的值,如果条件满足 is_leap_year函数返回值是1并且月份是二月份,我们就day++,最后再返回此函数的值给调用函数的地方。效果如下:
int get_days_of_month(int y, int m)
{
int mon[] = { 0, 31 ,28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//对应月份下标 0 1 2 3 4 5 6 7 8 9 10 11 12
int day = mon[m];
//闰年的2月是需要特殊调整 - 29天
if (is_leap_year(y) && m == 2)//满足闰年并且是二月份
{
day++;
}
return day;
}
4.最后我们再打印之前接收函数的变量d 的值
printf("%d年%d月有%d天", year, month, d);
看到这里,我相信大家都差不多明白了我们是如何解决这个问题的。
如果本文对你有帮助的话,可以点个免费的赞吗,这将会鼓励我继续创作,有不好的地方欢迎大家前来指正,谢谢!
完