函数day_of_year 将某月某日的日期表示转换为某一年的第几天的形式,
函数month_day则执行反操作。
因为要考虑闰年的情况,先设置一个二维数组 daytab[2][13]存储两种情况,
并且为了让两个函数都能调用该数组,将其设置为静态全局变量。
static char 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 day_of_year(int year, int month, int day){
int i ,leap;
leap=year%4==0&&year%100!=0||year%400==0; //闰年为1,普通年为0
if(month<1||month>12)
return -1;
if(day<1||day>daytab[leap][month])
return -1;
for(i=1;i<month;i++){
day+=daytab[leap][i];
}
return day;
}
//将概念的第几天转化为具体日期
void month_day(int year , int yearday, int *pmonth, int *pday){
int i,leap;
leap=year%4==0&&year%100!=0||year%400==0;
if(year<1){
*pmonth=-1;
*pday=-1;
return ;
}
for(i=1;i<=12&&yearday>daytab[leap][i];i++){
yearday-=daytab[leap][i];
}
if(i>12&&yearday>daytab[leap][12]){
*pmonth=-1;
*pday=-1;
}
else{
*pmonth=i;
*pday=yearday;
}
}
在month_day函数中,因为要返回x月x日两个变量,所以月和日两个参数设置为指针形式
例如:
month_day(2019,156,&m,&d);
将具体的几月几号存储到m和d变量中去。
接下来用指针形式实现上面两个函数
static char 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 day_of_year(int year, int month, int day){
int leap;
char *p;
leap=year%4==0&&year%100!=0||year%400==0; //闰年为1,普通年为0
p=daytab[leap];//p指向daytab 的第一行或第二行
while(--month)
day += *++p;
return day;
}
//将概念的第几天转化为具体日期
void month_day(int year , int yearday, int *pmonth, int *pday){
int leap;
char *p;
leap=year%4==0&&year%100!=0||year%400==0;
p=daytab[leap];
while(yearday> *++p)
yearday-=*p;
*pmonth=p-*(daytab+leap);
*pday=yearday;
}