|
#include <stdio.h>
void y_y(void);//函数原型
void y_w(void);//函数原型
int main() //主函数
{
int choice;
printf("\n==========万年历查询系统==========\n");
printf("* *\n");
printf("* *\n");
printf("* *\n");
printf("* 作者:kekegcs *\n");
printf("====================================\n");
printf("请选择下面选项(1,2,0):\n");
printf(" 1,查询两个日期相隔的天数。\n");
printf(" 2,查询农历和星期。\n");
printf(" 0,退出程序。\n");
printf("************************************\n");
while(choice==1||choice==2)//当输入choice为1或2时客户重复操作执行下面语句
{
scanf("%d",&choice);
switch(choice)
{
case 1:y_y();break; //调用函数
case 2:y_w();break;//调用函数
case 0: break;
default:printf("data error.");break;
}
}
return 0;
}
void y_y() //计算两个日期相隔的天数函数
{
int o_day,o_month,o_year;
int day,month,year;
int sum_month,sum_o_month;
int sum=0,leap=0,i=0;
printf("\n两个日期相隔天数查询:\n");
printf("\n请输入开始日期(年 月 日)"); /*输入提示*/
scanf("%d%d%d",&o_year,&o_month,&o_day); /*输入年月日*/
printf("\n请输入结束日期(年 月 日)");
scanf("%d%d%d",&year,&month,&day);
switch(month){ /*先计算今年year某月以前月份的总天数*/
case 1:sum_month=0;break;
case 2:sum_month=31;break;
case 3:sum_month=59;break;
case 4:sum_month=90;break;
case 5:sum_month=120;break;
case 6:sum_month=151;break;
case 7:sum_month=181;break;
case 8:sum_month=212;break;
case 9:sum_month=243;break;
case 10:sum_month=273;break;
case 11:sum_month=304;break;
case 12:sum_month=334;break;
default:printf("data error.");break;/*其它情况*/
}
if(year%400==0||(year%4==0&&year%100!=0))/*判断是否润年*/
leap=1; /*判断标志*/
else
leap=0;
if(leap==1&&month>2)/*如果是润年且月份大于2,总天数应该加一天*/
sum_month=sum_month+day+1;
else
sum_month=sum_month+day;
switch(o_month){ /*开始年份oyear某月以前月份的总天数*/
case 1:sum_o_month=0;break;
case 2:sum_o_month=31;break;
case 3:sum_o_month=59;break;
case 4:sum_o_month=90;break;
case 5:sum_o_month=120;break;
case 6:sum_o_month=151;break;
case 7:sum_o_month=181;break;
case 8:sum_o_month=212;break;
case 9:sum_o_month=243;break;
case 10:sum_o_month=273;break;
case 11:sum_o_month=304;break;
case 12:sum_o_month=334;break;
default:printf("data error.");break;/*其它情况*/
}
if(o_year%400==0||(o_year%4==0&&o_year%100!=0))/*判断是否润年*/
leap=1; /*判断标志*/
else
leap=0;
if(leap==1)
if(o_month>2) /*如果是润年且月份大于2,总天数应该加一天*/
{
sum_o_month=sum_o_month+1;
sum_o_month=366-(sum_o_month+o_day);
}
else
sum_o_month=366-(sum_o_month+o_day);
else
sum_o_month=365-(sum_o_month+o_day);
sum=(year-(o_year+1))*365; /*整年的天数总和*/
sum=sum+sum_month+sum_o_month; /*总天数=整年的天数总和+结束年的月份总天数+开始年的月份总天数*/
for(o_year=o_year+1;o_year<year;o_year++) /*中间有几个润年?不包括开始日期和结束日期*/
{
if(o_year%400==0||(o_year%4==0&&o_year%100!=0))/*判断是否润年*/
i++; /*累加润年数*/
}
sum=sum+i; /*总天数再加个i个润年多出的i天*/
printf("\n从开始日期到结束日期的相隔%d天.\n",sum);/*输出总天数*/
getchar();
}
void y_w() //计算某个日期的农历和星期函数
{
int year,month,day,leap;
int sum_month,oday;
int q,r,n;
double i,j;
int c,m,d,w,y;
printf("\n农历和星期查询:\n");
printf("\n请输入你要查询的日期(例如1994 5 7):");
scanf("%d%d%d",&year,&month,&day);
switch(month)
{
case 1:sum_month=0;break;
case 2:sum_month=31;break;
case 3:sum_month=59;break;
case 4:sum_month=90;break;
case 5:sum_month=120;break;
case 6:sum_month=151;break;
case 7:sum_month=181;break;
case 8:sum_month=212;break;
case 9:sum_month=243;break;
case 10:sum_month=273;break;
case 11:sum_month=304;break;
case 12:sum_month=334;break;
default:printf("data error.");break;/*其它情况*/
}
if(year%400==0||(year%4==0&&year%100!=0))/*判断是否润年*/
leap=1; /*判断标志*/
else
leap=0;
if(leap==1&&month>2)/*如果是润年且月份大于2,总天数应该加一天*/
sum_month++;
r=(year-1901)%4;//开始计算农历
q=(int)(year-1901)/4;
i=14*q+10.6*(r+1)+(sum_month+day);
j=29.5;
n=(int)(i/j);
oday=(int)(i-j*n);
printf("\n%d年%d月%d日是农历%d日",year,month,day,oday);
c=(int)(year/100);//开始计算星期,C为年份的前2位
y=year%100; //Y为年份的后2位
if(month<3)
m=month+12;
else
m=month;
d=day;
w=(int)(c/4)-2*c+y+(int)(y/4)+(int)(13*(m+1)/5)+d-1; //泰勒公式
if(w>0)
w=w%7;
else
w=w-((int)(w/7)-1)*7; //负数取模运算
switch(w)
{
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;
default:printf("ERROR!\n");break;
}
getchar();
}
|
|