C语言的问题:根据输入的年月日,输出该日为该年度的第几周、第几天、星期几。

C语言的问题:日历计算(不得使用C语言的日期库函数)
根据输入的年月日,输出该日为该年度的第几周、第几天、星期几。

如输入: 2007,12,1
则输出: 48z,335t,6xq

第1个回答  2007-12-27
//根据输入的年月日,输出该日为该年度的第几周、第几天、星期几。

//如输入: 2007,12,1
//则输出: 48z,335t,6xq
int date[12]={31,28,31,30,31,30,31,31,30,31,30,31};
#include<stdio.h>
int Check(int a,int b,int c);//判断输入的合法性
int CountWeek(int a,int b,int c);//判断第几周
int CountDay(int a,int b,int c);//计算第几天
int CountWeekday(int a,int b,int c);//计算星期几
int LeapYear(int a){int x=(!(a%4)&&(a%100)||!(a%400))?1:0;return x;}
int main(void)
{
int year,month,day;
do{
printf("请输入年,月,日:");
scanf("%d%d%d",&year,&month,&day);
//printf("%d\n",Check(year,month,day));
if(Check(year,month,day)!=0)
printf("你输入错误,请重新输入.\n");
}while(Check(year,month,day)!=0);
printf("第%d周 第%d天 星期%d\n",CountWeek(year,month,day),CountDay(year,month,day),CountWeekday(year,month,day));
return 0;

}
int Check(int a,int b,int c)//如果输入的日期不合法,则返回1,否则返回0
{
if(a<=0||a>9999) return 1; //年输入不合法
else
{
if(b<=0||b>12) return 1; //月输入不合法
else
{
date[1]=(!(a%4)&&(a%100)||!(a%400))?29:28;
if(c<=0||c>date[b-1])
return 1;
else return 0;
}

}

}
int CountDay(int a,int b,int c)
{
int x=c;
int IsLeapYear=(!(a%4)&&(a%100)||!(a%400))?1:0;
if(IsLeapYear==1) date[1]=29;
for(int i=0;i<b-1;i++)
{
x+=date[i];
}
return x;
}
int CountWeek(int a,int b,int c)
{
int x;
if(CountDay(a,b,c)%7==0) x=CountDay(a,b,c)/7;
else x=CountDay(a,b,c)/7+1;
return x;
}
int CountWeekday(int a,int b,int c)
{
int i,x1,x2,y;
if(a<2007)
{
x1=LeapYear(a)?(366-CountDay(a,b,c)):(365-CountDay(a,b,c));
for(x2=0,i=a+1;i<2007;i++)
x2+=CountDay(i,12,31);
y=6-(x1+x2+1)%7;
if(y<0) y+=7;
}
else
{
x1=CountDay(a,b,c);
for(i=2007,x2=0;i<a;i++)
x2+=CountDay(i,12,31);
y=6+(x1+x2+1)%7;
if(y>7) y-=7;
}
return y;
}本回答被提问者采纳
相似回答