一个关于计算星期的程序
下面这个程序是求任意一个日期的星期的,如:给定日期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]);
}
** 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楼的兄弟,能解释一下你的算法不??
----------------解决方案--------------------------------------------------------
他来了会解释的.
----------------解决方案--------------------------------------------------------