日历显示
功能实现:
1.输入一个年份,输出是在屏幕上显示该年的日历
2.输入年月,输出该月的日历。
3.输入年月日,输出距今天还有多少天,星期几,是否公历节
代码实现:
1.计算今天是星期几
int CaculateWeekDay(int y,int m, int d) {
if(m==1||m==2) {
m+=12;
y--;
}
int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return iWeek;
}
2.计算天数
int to_day(int y, int m, int d) {
int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = 0;
int i;
for(i=1; i<y; i++) {
day += (i%4==0 && i%100!=0 || i%400==0)? 366 : 365;
}
if(y%4==0 && y%100!=0 || y%400==0) mon[2]++;
for(i=1; i<m; i++) {
day += mon[i];
}
return day + d;
3.闰年判断
int isleapyear(int year) {
if((year%4==0)&&(year%100!=0)||(year%400==0))
return 1;
else
return 0;
}
3.获得每个月的天数
int monthday(int month,int year) {
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
break;
case 4:
case 6:
case 9:
case 11:
return 30;
break;
case 2:
if(isleapyear(year)) {
return 29;
break;
} else {
return 28;
break;
}
}
}
4.主函数显示
int main() {
time_t timep;
struct tm *p;
time(&timep);
p=gmtime(&timep);
char v[10];
int year=0,month,days,weekday;
int i,d,a,b,c,m=0,dt=0;
while(1) {
printf("please input the year:");
scanf("%s",v);
year = (v[0]-'0')*1000+(v[1]-'0')*100+(v[2]-'0')*10+(v[3]-'0');
int l = strlen(v);
if(l==6||l==7) {
if(l==6) {
m = v[5]-'0';
}
if(l==7) {
m = (v[5]-'0')*10+(v[6]-'0');
}
} else if(l==8||l==9||l==10) {
if(l==8) {
m = v[5]-'0';
dt= v[7];
} else if(l==9) {
if(v[6]=='.') {
m = v[5]-'0';
dt = (v[7]-'0')*10+(v[8]-'0');
} else {
m = (v[5]-'0')*10+(v[6]-'0');
dt = (v[8]-'0');
}
} else {
m = (v[5]-'0')*10+(v[6]-'0');
dt = (v[8]-'0')*10+(v[9]-'0');
}
}
days = year-1+(year-1)/400+(year-1)/4-(year-1)/100;
if(m==0) {
for(month=1; month<=12; month++) {
printf("\t\t****%d年--%d月****\n",year,month);
printf("sun\tmon\ttues\twed\tthur\tfir\tsat\t\n");
i = 1;
d = 1;
weekday = (days + 1)%7;
while(i<=weekday) {
printf("\t");
i++;
}
while(d<=monthday(month,year)) {
weekday = (days + 1)%7;
if(weekday==6)
printf("%d\n",d);
else
printf("%d\t",d);
if(d==monthday(month,year))
printf("\n");
d++;
days++;
}
}
} else {
if(dt==0) {
for(month=m; month<=m; month++) {
printf("\t\t****%d年--%d月****\n",year,month);
printf("sun\tmon\ttues\twed\tthur\tfir\tsat\t\n");
i = 1;
d = 1;
weekday = (days + 1)%7;
while(i<=weekday) {
printf("\t");
i++;
}
while(d<=monthday(month,year)) {
weekday = (days + 1)%7;
if(weekday==6)
printf("%d\n",d);
else
printf("%d\t",d);
if(d==monthday(month,year))
printf("\n");
d++;
days++;
}
}
} else {
printf("距离今天:%d 星期%d 不是公立节日\n",diff(year,m,d,p->tm_year+1900,p->tm_mon+1,p->tm_mday),CaculateWeekDay(year,m,d)+1);
}
}
}
}
5.完整程序
年历显示