贴一篇万年历
#include<stdio.h>//************自定义函数声明************************
void screen(); //系统主界面
void leapyear(); //查询某年是否是闰年
int IsLeapYear(int); //判断某年是否是闰年
void printmonthday(); //查询某年某月的最大天数
int everymonth(int,int); //计算每月的最大天数
void whatisit(); //查询某年某月某日是星期几
int whatisita(int,int); //计算当天是星期几
void printfyearday(); //打印某年的全年日历
void printmonth(int,int); //打印某年某月月历
//*************主函数*******************************
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义全局变量每月的最大天数(不是闰年)
char *week[]={"日","一","二","三","四","五","六"};
void main()
{
screen(); //万年历主界面查询
}
//************万年历主界面查询********************
void screen()
{
int n;
while(1)
{
printf("\n*******************************\n");
printf("* 万年历查询程序 *\n");
printf("* 1.查询某年某月某日是星期几 *\n");
printf("* 2.查询某年是否是闰年 *\n");
printf("* 3.打印某年的全年日历 *\n");
printf("* 4.查询某月的最大天数 *\n");
printf("* 5.退出 *\n");
printf("*******************************\n");
printf(" 请输入要查询的选项:");
scanf("%d",&n); //读取输入的数字
switch(n)
{
case 1:
whatisit(); //查询某年某月某日是星期几
break;
case 2:
leapyear(); //查询某年是否是闰年
break;
case 3:
printfyearday(); //打印某年的全年日历
break;
case 4:
printmonthday(); //查询某月的最大天数
break;
case 5:
return; //退出
default:
printf("你输入错误,请按要求输入!\n");
break;
}
}
}
//**************查询某年某月某日是星期几*******************
void whatisit()
{
int y,m,d,s,k=1,sum,n,i;
char yn;
while(k)
{
printf("\n请输入年,月,日:\n");
scanf("%d,%d,%d",&y,&m,&d);
getchar(); //吸收回车符
s=0;
for(i=1;i<m;i++)
s=s+a[i];
s=s+d; //累加天数
if(IsLeapYear(y) && m>2) //判断是否是闰年,且月份大于2
s=s+1;
sum=s;
n=(y-1+(y-1)/4-(y-1)/100+(y-1)/400+sum)%7; //计算结果0-6
printf("这天是%s\n",week[n]); //显示星期几
printf("是否继续查询(Y/N)?");
scanf("%c",&yn);
if(yn=='y'||yn=='Y')
k=1;
else
k=0;
}
}
//****************判断某年是否是闰年************************
int IsLeapYear(int year)
{
return(year%4==0&&year%100!=0||year%400==0);
}
//****************查询某年是否是闰年************************
void leapyear()
{
int y,k=1;
char yn;
while(k)
{
printf("\n请输入要查询的年份:\n");
scanf("%d",&y);
getchar(); //吸收回车符
if(IsLeapYear(y)) //判断是否是闰年
printf("是闰年\n");
else
printf("不是闰年\n");
printf("是否继续查询(Y/N)?");
scanf("%c",&yn);
if(yn=='y'||yn=='Y')
k=1;
else
k=0;
}
}
//*****************计算某月的最大天数******************************
int everymonth(int year,int month)
{
int s;
s=a[month];
if(IsLeapYear(year)&&month==2) //判断是否是闰年的2月份
s=s+1;
return s;
}
//*****************查询某年某月的最大天数**************************
void printmonthday()
{
int y,m,value,k=1;char yn;
while(k)
{
printf("\n请输入要查询的年份,月份:\n");
scanf("%d,%d",&y,&m);
getchar(); //吸收回车符
if(m<0||m>12) //判断输入的月份是否正确
{
printf("输入月份不对!!!\n");
break;
}
value=everymonth(y,m); //计算该年该月的最大天数
printf("%d年%d月的最大天数为:%d\n",y,m,value);
printf("是否继续查询(Y/N)?");
scanf("%c",&yn);
if(yn=='y'||yn=='Y')
k=1;
else
k=0;
}
}
//***************打印某年的全年日历*******************************
void printfyearday()
{
int y,value,sum,i,k=1;
char yn;
while(k)
{
printf("\n请输入查询日历的年份:\n");
scanf("%d",&y);
getchar(); //吸收回车符
for(i=1;i<=12;i++)
{
printf("%d年%d月的信息:\n",y,i);
value=whatisita(y,i); //计算当天是星期几
sum=everymonth(y,i); //计算某年某月最大天数
printmonth(value,sum); //打印一个月月历
printf("\n");
}
printf("是否继续查询(Y/N)?");
scanf("%c",&yn);
if(yn=='y'||yn=='Y')
k=1;
else
k=0;
}
}
//*****************打印某年某月月历*************************
void printmonth(int value,int sum)
{
int n,i=0,j;
for(j=0;j<7;j++)
printf(" %s",week[j]); //显示"日-六"
printf("\n");
while(i<value)
{
printf(" "); //根据当月1号是星期几打印空格
i++;
}
for(n=1;n<=7-value;n++)
printf(" %d",n); //打印当月的第一个星期
while(n<sum)
{
if((n+value-1)%7==0) //判断是否一周
printf("\n"),printf(" ");
if(n/10>0) //判断是否大于10
printf("%d ",n);
else
printf("%d ",n);
n++;
}
}
//**************计算当天星期几*******************
int whatisita(int y,int m)
{
int n,i,s=0;
for(i=1;i<m;i++)
s=s+a[i]; //累加天数
if(IsLeapYear(y) && m>2) //判断是否是闰年,且月份大于2
s=s+1;
n=(y-1+(y-1)/4-(y-1)/100+(y-1)/400+s+1)%7;
return n;
}