要求:按一般的格式显示日历。
(1)输入一个年份,输出该年整年的日历。
(2)输入年和月,输出该月的日历。
(3)输入年、月和日,输出星期几,跟今天差多少天。
#include <stdio.h>
#include <time.h>
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char mon[13][8]={"zore","一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
//判断是否为闰年
Isleapyear(int year){
if((year%4==0 && year%100!=0) || year%400==0)
return 1;
else return 0;
}
//判断输入日期总共有多少天
int Alldays(int year,int month,int day)
{ int i,j=0;
int alldays;
int monthdays;
for(i=1;i<year;i++)
if(Isleapyear(i)) j=j+1;
switch(month-1){
case 0: monthdays = 0; break;
case 1: monthdays = 31; break;
case 2: monthdays = 59; break;
case 3: monthdays = 90; break;
case 4: monthdays = 120; break;
case 5: monthdays = 151; break;
case 6: monthdays = 181; break;
case 7: monthdays = 212; break;
case 8: monthdays = 243; break;
case 9: monthdays = 273; break;
case 10: monthdays = 304; break;
case 11: monthdays = 334; break;
case 12: monthdays = 365; break;
default: break;
}
alldays = (year-1)*365 + j + monthdays +day;
if(Isleapyear(year) && month > 2)
alldays = alldays + 1;
return alldays;
}
//判断开头几个空格
void kong(int k){
int i;
if(k<6){
for(i=0;i<k+1;i++)
printf(" ");}
else if(k>=6 && k<8){
for(i=0;i<k-6;i++)
printf(" ");}
}
//状况1:输入年
void tou_year(int y){
int i,j,k;
if(Isleapyear(y)) month[2]=29;
k = Alldays(y-1,12,31);
k = k % 7; //计算出k是星期几
for(i=1;i<=12;i++){
printf("%s\n",mon[i]);//输入门面
printf("\n");
printf("日 一 二 三 四 五 六\n");
printf("---------------------------\n");
kong(k);
for(j=1;j<=month[i];j++){
printf("%-4d",j);
if((j+k+1)%7==0) printf("\n");
}
printf("\n");
printf("\n");
k=(k+month[i])%7;
}
}
//状况2:输入年月
void tou_month(int y,int m){
int j;
int k;
if(Isleapyear(y)) month[2]=29;
k = Alldays(y,m,0);
k = k % 7; //计算出k是星期几
printf(" ");
printf("%d年",y);
printf("%s\n",mon[m]);
printf("日 一 二 三 四 五 六\n");
printf("---------------------------\n");
kong(k);
for(j=1;j<=month[m];j++){
printf("%-4d",j);
if((j+k+1)%7==0) printf("\n");
}
printf("\n");
}
//状况3:输入年月日
void tou_day(int y,int m,int d){
int k,k1;
int y1,m1,d1;
int minusday;
time_t t; //时间函数
struct tm * lt;
time (&t);
lt = localtime(&t);
y1 = lt->tm_year+1900;
m1 = lt->tm_mon+1;
d1 = lt->tm_mday;
k = Alldays(y,m,d);
k = k % 7; //计算k的值得出星期几
printf("%d年/%d月/%d日是:",y,m,d);
switch(k){
case 0:printf("星期日\n"); break;
case 1:printf("星期一\n"); break;
case 2:printf("星期二\n"); break;
case 3:printf("星期三\n"); break;
case 4:printf("星期四\n"); break;
case 5:printf("星期五\n"); break;
case 6:printf("星期六\n"); break;
}
//超出int范围
k = Alldays(y,m,d);
k1 = Alldays(y1,m1,d1);
minusday = k1 - k; //计算两者相差的天数
printf("今天是%d年/%d月/%d日,%d年/%d月/%d日距今天相差:%d天\n",y1,m1,d1,y,m,d,minusday);
}
#include <stdio.h>
int main(){
int temp,y,m,d;
char ch;
do{
printf("请输入您选择的方案(1.查询年历2.查询月历3.输出星期几,跟今天差多少天\n");
scanf("%d",&temp);
switch(temp){
case 1:printf("请输入年份(ep:2020):");
scanf("%d",&y); printf(" %d年\n",y); tou_year(y);
// 输入整年日历
break;
case 2:printf("请按照所给格式输入\n");printf("请输入年月(ep:2020,6):");
scanf("%d,%d",&y,&m); tou_month(y,m);
//输入该月日历
break;
case 3:printf("请按照所给格式输入\n");printf("请输入日期(ep:2019,6,1):");
scanf("%d,%d,%d",&y,&m,&d); tou_day(y,m,d);
//输出星期几,跟今天差多少天
break;
default: break;
}
printf("\n\n是否继续?(Y键继续,任意键退出)\n");
getchar();
scanf("%c",&ch);
}while(ch=='y' || ch=='Y');}