搜索
查看: 2875|回复: 7
打印 上一主题 下一主题

万年历

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-22 21:07:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

#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();
}
       





沙发
发表于 2013-3-24 12:40:18 | 只看该作者
其实可以把LOGO改掉的
板凳
发表于 2013-3-24 14:35:00 | 只看该作者
那个,楼主会用<time.h>吗?
为啥不用呢?
地板
发表于 2013-3-24 16:43:23 | 只看该作者
不停留啊   sleep没用啊
5#
 楼主| 发表于 2013-3-24 17:10:48 | 只看该作者
981013 发表于 2013-3-24 14:35
那个,楼主会用吗?
为啥不用呢?

本人初学,完全按自己思路弄的。<time.h>怎么用?有啥作用?
6#
发表于 2013-3-28 18:29:02 | 只看该作者
貌似不错啊     学习学习
7#
发表于 2013-3-31 12:48:22 | 只看该作者
kekegcs 发表于 2013-3-24 17:10
本人初学,完全按自己思路弄的。怎么用?有啥作用?

我也是初学
在头文件<time.h>中声明了一些处理日期和时间的类型和函数。
我懒得打字了,到这里去看看吧
http://baike.baidu.com/view/1741851.htm
8#
发表于 2013-6-3 15:26:00 | 只看该作者
很棒,厉害
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表