本程序可完成打印年历,月历,以及查询两个日期间相距多少天,以及查询日期是星期几。代码如下:
#include<stdio.h>
//设计界面函数
int UI()
{
int n;
printf("------------------------\n");
printf("-----欢迎使用万年历-----\n");
printf("| 1.查询年历 |\n");
printf("| 2.查询月历 |\n");
printf("| 3.查询距今多少天 |\n");
printf("| 4.退出 |\n");
printf("------------------------\n");
printf("请输入您想使用功能的数字: ") ;
while(1)
{
scanf("%d",&n);
if(n==1||n==2||n==3||n==4)
{
return n;
}
else
{
printf("输入的数字有误,请重新输入\n");
}
}
}
//判断润平函数
int Judge(int year)
{
if(year%400==0||(year%4==0&&year%100!=0)) //闰年
return 0;
else //平年
return 1;
}
//功能1函数
void Fac1()
{
int Run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int Leap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char *Month[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char *Week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
int year=0;
int day=0;
int flag=0;
printf("请输入年份:");
scanf("%d",&year);
flag=Judge(year);
int tool=0,weekd=0;
tool=year-1+(year-1)/4-(year-1)/100+(year-1)/400+1; //公式计算
weekd=tool%7; //计算星期几
int i=0,j=0;
for(i=0;i<12;i++)
{
printf("\n");
printf("%s\n",Month[i]); //打印月份
printf("===================================================\n");
for(j=0;j<7;j++)
{
printf("%s\t",Week[j]); //打印星期
}
printf("\n");
for(int k=0;k<weekd;k++)
{
printf(" \t"); //打印日期前的空格
}
for(day=1;day<32;day++)
{
printf("%d\t",day);
if((weekd+day)%7==0)
{
printf("\n");//每行七个日期
}
if(flag==0)//是闰年
{
if(i==0 && day==31) break;//控制每月的天数
else if(i==1 && day==29) break;
else if(i==2 && day==31) break;
else if(i==3 && day==30) break;
else if(i==4 && day==31) break;
else if(i==5 && day==30) break;
else if(i==6 && day==31) break;
else if(i==7 && day==31) break;
else if(i==8 && day==30) break;
else if(i==9 && day==31) break;
else if(i==10 && day==30) break;
else if(i==11 && day==31) break;
}
else//不是闰年
{
if(i==0 && day==31) break;
else if(i==1 && day==28) break;
else if(i==2 && day==31) break;
else if(i==3 && day==30) break;
else if(i==4 && day==31) break;
else if(i==5 && day==30) break;
else if(i==6 && day==31) break;
else if(i==7 && day==31) break;
else if(i==8 && day==30) break;
else if(i==9 && day==31) break;
else if(i==10 && day==30) break;
else if(i==11 && day==31) break;
}
}
weekd=(weekd+day)%7;//计算下一个月第一天是星期几
printf("\n");
}
printf("\n");
}
//功能2函数
void Fac2()
{
int Run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int Leap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char *Month[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char *Week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
int year,month;
printf("请输入年,月:");
scanf("%d%d",&year,&month);
int flag=0;
flag=Judge(year);
printf("\n");
int Mark=0;
for(int i=0;i<month-1;i++)
{
if(flag==0)//是闰年
{
Mark+=Run[i];
}
else//不是闰年
{
Mark+=Leap[i];
}
}
int N=0;
N=year-1+(year-1)/4-(year-1)/100+(year-1)/400+Mark+1;
int weekd=0;
weekd=N%7;
printf("%s\n",Month[month-1]);//输出月份
printf("===================================================\n");
for(int j=0;j<7;j++)
{
printf("%s\t",Week[j]);//输出星期
}
printf("\n");
for(int k=0;k<weekd;k++)
{
printf(" \t");//输出日期
}
for(int day=1;day<32;day++)
{
printf("%d\t",day);
if((weekd+day)%7==0)
{
printf("\n");//每行七个日期
}
if(flag==0)//是闰年
{
if(month==1 && day==31) break;
else if(month==2 && day==29) break;
else if(month==3 && day==31) break;
else if(month==4 && day==30) break;
else if(month==5 && day==31) break;
else if(month==6 && day==30) break;
else if(month==7 && day==31) break;
else if(month==8 && day==31) break;
else if(month==9 && day==30) break;
else if(month==10 && day==31) break;
else if(month==11 && day==30) break;
else if(month==12 && day==31) break;
}
else//不是闰年
{
if(month==1 && day==31) break;
else if(month==2 && day==28) break;
else if(month==3 && day==31) break;
else if(month==4 && day==30) break;
else if(month==5 && day==31) break;
else if(month==6 && day==30) break;
else if(month==7 && day==31) break;
else if(month==8 && day==31) break;
else if(month==9 && day==30) break;
else if(month==10 && day==31) break;
else if(month==11 && day==30) break;
else if(month==12 && day==31) break;
}
}
printf("\n\n");
}
struct date
{
int yr;
int mon;
int day;
};
typedef struct date Date;
void Fac3() //两天之间差多少天
{
int Run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int Leap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
Date one,two;
Date str,end;
printf("请输入现今日期:(年 月 日)\n");
scanf("%d %d %d",&one.yr,&one.mon,&one.day);
printf("请输入查询日期:(年 月 日)\n");
scanf("%d %d %d",&two.yr,&two.mon,&two.day);
if((one.yr<two.yr)||((one.yr==two.yr)&&(one.mon<two.mon))||(((one.yr==two.yr)&&(one.mon==two.mon)&&(one.day<two.day)))) //保证日子小的年份放在str,大的放在end
{
str=one; //str存的小的
end=two; //end存的大的·
}
else
{
str=two;
end=one;
}
int n=0; //计数
int u=0;
if(str.yr<end.yr) //如果str年小
{
for(int im=1;im<=str.mon;++im)
{
if(im==str.mon)
u+=str.day;
else
{
if(Judge(str.yr))
u+=Run[im-1];
else u+=Leap[im-1];
}
}
for(int yr=str.yr;yr<=end.yr;++yr)
{
int judge=Judge(yr); //判断闰年
if(yr==end.yr)
{
for(int mon=1;mon<=end.mon;++mon)
{
if(mon==end.mon)
{
n+=end.day;
}
else
{
if(judge)
{
n+=Run[mon-1];
}
else n+=Leap[mon-1];
}
}
}
else
{
int ny=judge?365:364;
n+=ny;
}
}
n=n-u+1;
}
else if(str.mon<end.mon)
{
int judge=Judge(str.yr); //判断闰年
for(int mon=str.mon;mon<=end.mon;++mon)
{
if(mon==end.mon)
{
n+=end.day;
}
else
{
if(judge)
{
n+=Run[mon-1];
}
else n+=Leap[mon-1];
}
}
n=n-str.day;
}
else
{
n=end.day-str.day;
}
int D=0,W=0;
int judge=Judge(two.yr);
if(judge==0)
{
for(int imonth=1;imonth<two.mon;imonth++)
D+=Run[imonth-1];
D+=two.day;
}
else
{
for(int imonth=1;imonth<two.mon;imonth++)
D+=Leap[imonth-1];
D+=two.day;
}
W = two.yr-1+ (two.yr-1)/4- (two.yr-1)/100 + (two.yr-1)/400 + D;
W%=7;
if(W==0)
W=7;
printf("距今 %d 天,是星期%d\n",n,W);
}
void Fac4()
{
printf("欢迎再次使用!\n");
}
//进入功能函数
void Go(int n)
{
if(n==1)
Fac1();
if(n==2)
Fac2();
if(n==3)
Fac3();
if(n==4)
Fac4();
}
int main()
{
int n=0;
while(n!=4)
{
n=UI();
Go(n);
}
return 0;
}
根据日期计算星期几的公式:
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。