当前位置: 代码迷 >> C语言 >> 一个关于计算星期的程序
  详细解决方案

一个关于计算星期的程序

热度:218   发布时间:2008-05-29 20:57:00.0
一个关于计算星期的程序
下面这个程序是求任意一个日期的星期的,如:给定日期X年Y月Z日,求出它的星期
i:月份 a[i]:每月天数   k:若k=0,则x为闰年    t:闰年数    d:天数差
参照日期:1980.1.1――星期二

#include "stdio.h"
#include "math.h"
struct date
{
    int year;
    int month;
    int day;
};
int daies(int x,int y,int z)
{   
    enum weekday
    {mon=6,tue=0,wed,thu,fri,sta,sun};
    enum weekday week;
    int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int i,k,t,m=0,n,d;
    k=abs(x-1980)%4;
    if(k==0)
     a[1]=29;
    if(x==1980)
    {
        for(i=0;i<y;i++)
     m+=a[i];
     m=m+a[y-1];
        d=m+z-1;
        n=d%7;
    }
    if(x>1980)
    {    
       t=(x-1981)/4;    
        for(i=0;i<y;i++)
        m+=a[i];
        m=m-a[y-1];
       d=(x-1980)*365+m+z+t;
        n=d%7;    
    }
    if(x<1980)
    {    
        t=(1979-x)/4;
        for(i=y-1;i<12;i++)
        m+=a[i];
        m=m-a[11];
        d=(1979-x)*365+m+(31-z)+t;
        n=6-d%7;
    }
    week=(enum weekday)n;
    switch(week)
    {
        case mon:printf("星期一\n"); break;
        case tue:printf("星期二\n"); break;
        case wed:printf("星期三\n"); break;
        case thu:printf("星期四\n"); break;
        case fri:printf("星期五\n"); break;
        case sta:printf("星期六\n"); break;
        case sun:printf("星期天\n"); break;
    }
    return week;
}
main()
{
    struct date d;
    printf("输入年份:");
    scanf("%d",&d.year);
    printf("输入月份:");
    scanf("%d",&d.month);
    printf("输入日期:");
    scanf("%d",&d.day);
    printf("输出:\n");
    printf("%d年%d月%d日\n",d.year,d.month,d.day);
    daies(d.year,d.month,d.day);
}

此程序是用数组写的,好像有些繁琐。不知哪位高人能指导下,让它变简洁些
搜索更多相关的解决方案: include  

----------------解决方案--------------------------------------------------------
楼主,我这有个程序,是我从别处看到的,我也不知道为什么这样写,但是我试了几组数据,确实是对的.

typedef unsigned char uint8;
typedef unsigned short uint16;

/*********************************************************************/
*  Name: mmi_dt_to_weekday
* DESCRIPTION : Function to compute current day of week.
* PARAMETERS
*  y  [IN]        Year of the date.    (example, 2008)
*  m  [IN]        Month of the date. (example, 2)
*  d  [IN]        Day of the date    (example, 28)
* RETURNS
*    index of day of week
**********************************************************************/

uint8 mmi_dt_to_weekday(uint16 y, uint8 m, uint8 d)
{
    if (m < 3)
    {
        m += 13;
        y--;
    }
    else
    {
        m++;
    }
    
    return (d + 26 * m / 10 + y + y / 4 - y / 100 + y / 400 + 6) % 7;
}
----------------解决方案--------------------------------------------------------
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include<stdio.h>

int dayofweek(int y, int m, int d)
{
   
static int t[]={0,3,2,5,0,3,5,1,4,6,2,4};
    y -= m<3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

int main()
{
   
char wd[]="SumMonTueWedThuFriSat";
    int y,m,d;
    while (scanf("%d %d %d",&y,&m,&d)!=EOF)
        printf("%.3s.\n",&wd[dayofweek(y,m,d)*3]);
}

http://bbs.bccn.net/redirect.php?tid=215777&goto=lastpost#lastpost
发现大家都不爱看老帖子………………
----------------解决方案--------------------------------------------------------
楼上的兄弟,确实没有看到你贴的老贴,不过你的算法合我贴的这个算法还是有不一样的哦。
----------------解决方案--------------------------------------------------------
算法一样干嘛贴………………
不过原理都是一样的,有一个公式…………
----------------解决方案--------------------------------------------------------
2楼的兄弟,能解释一下你的算法不??
----------------解决方案--------------------------------------------------------
他来了会解释的.
----------------解决方案--------------------------------------------------------
  相关解决方案