天数转换成具体日期:给出某年的第多少天,算出这天的日期;
具体日期转换成天数:给定日期得出是该年的第多少天
#include<stdio.h>
int isleap(int year);
int day_of_year(int year, int month, int day);
void monthday(int year, int yearday, int* pmonth, int* pday);
//多一列是为了下标直接对应月份,方便
int daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
}; //设为全局变量方便所有函数都可以使用
int main() {
int x, month, day, year;
//天数转换成具体日期
scanf("%d %d", &year, &x);
monthday(year, x, &month, &day);
printf("%d年的第%d天是%d月%d日\n", year, x, month, day);
//具体日期转换成天数
scanf("%d %d %d", &year, &month, &day);
printf("%d年%d月%d日是%d年的第%d天\n", year, month, day, year, day_of_year(year, month, day));
return 0;
}
int day_of_year(int year, int month, int day) {
int i, sum;
sum = 0;
for (i = 1; i < month; i++)
sum += daytab[isleap(year)][i]; //对month之前的每个月的天数求和
sum += day; //再加上第month个月的天数就是所有的天数
return sum;
}
//要返回多于一个参数时用指针
void monthday(int year, int yearday, int* pmonth, int* pday) {
int leap = isleap(year);
int i;
for (i = 1; yearday > daytab[leap][i]; i++)
yearday -= daytab[leap][i]; //总天数依次减去每个月的天数直到不够为止,和上面的函数相反
*pmonth = i;
*pday = yearday;
}
int isleap(int year) { //判断一个年份是否闰年
return year % 4 == 0 && year % 100 || year % 400 == 0 ? 1 : 0;
}