读书人

日期有关问题

发布时间: 2012-02-05 12:07:14 作者: rapoo

日期问题
请问 如何写一个输入几月几日,然后输出对应星期几的c++程序。

[解决办法]
http://post.baidu.com/f?kz=171654714
[解决办法]
http://bbs.bc-cn.net/dispbbs.asp?boardid=56&id=65932
[解决办法]

#include <stdio.h>

unsigned data(long unsigned , unsigned , unsigned);
int main(void)
{
long unsigned year;
unsigned month,day,week;
puts( "please enter year. ");
scanf( "%lu ",&year);
puts( "please enter month 1~12. ");
scanf( "%u ",&month);
while(month <0||month> 12)
{
puts( "enter error!please enter again. ");
scanf( "%u ",&month);
}
puts( "please enter day. ");
scanf( "%u ",&day);
while(day <1||day> 31)
{
puts( "enter error!please enter again. ");
scanf( "%u ",&day);
}
week=data(year,month,day);
printf( "today is %lu年 %u月 %u日 星期%u\n ",year,month,day,week=(week==0)?7:week);
printf( "press any key to quit! ");
getch();
return 0;
}
unsigned data(long unsigned year , unsigned month , unsigned day)
{
int i , firstday , flag;
unsigned week;
int days[][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
firstday=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;
flag=((year%4==0&&year%100!=0)||(year%400==0));
if(days[flag][month] <day)
{
puts( "day error!press any key to quit! ");
getch();
exit(0);
}
for(i=1;i <month;i++)
firstday=((firstday+days[flag][i])%7);
if((day+firstday)%7==0)
week=(day+firstday)%7+7-1;
else if(day+firstday <=7)
week=day+firstday-1;
else
week=(day+firstday)%7-1;
return week;
}

基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7

计算星期可用 蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形):
W = Y + [Y/4] + [C/4] - 2C + [13(M+1)/5] + D - 1

公式中的符号含义如下:
C:世纪数减一(年的高两位数);
Y:年(年的低两位数);
M:月(M大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的
13、14月来计算,比如2005年1月1日要看作2004年的13月1日来计算);
D:日;
[]代表取整,即只要整数部分。
W:星期;W对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,
5-星期五,6-星期六
注意负数不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。为了
方便计算,我们可以给它加上一个7的整数倍,使它变为一个正数。

以2005年2月14日为例:C=20,Y=4,M=14,D=14
W = 4 + [4/4] + [20/4] - 2*20 + [26*(14+1)/10] + 14 - 1
= 4 + 1 + 5 - 40 + 39 + 14 - 1
= 22 (除以7余1)
所以2005年2月14日是星期一。

[解决办法]
网上搜的,以前收集的,都给出来
[解决办法]
【Ref】

注意:下面的程序需要以命令行的格式运行,例如,把编绎好的可执行文件的名字为 filename,那要查看某2002/01/01就输入 filename 2002/02/01,要查看2002年1月份就输入filename 2002/01或filename2002/01/0。

/*** 万年历 ***/

/*** 命令行:
若查看某一天,例如 calen 2001/12/28
若查看某个月,例如 calen 2001/12/0 或 calen 2001/12
***/
/**************************************************
1. 以2000/01/01日为星期六为基准。
2. dy为该年 1月1号 到2000年1月1号的 " 星期差 "
3. dm为该月以前的月所引起的 " 星期差 "
4. m2为二月所引起的 " 星期差 "
**************************************************/

main(int x,char **date)
{
int year=0,month=0,day=0,week;
int d,i,dm,dy,m2;
char WEEK[9];
if (x==1)
{
printf ( "\n ERROR! you forgot to enter the date you want to view\n ");


exit (0);
}
i=0; d=-1;
while (date[1][i])
{
if ((date[1][i]== '/ '||date[1][i]== '. ')&&d==-1) { d=0; i++; continue; }
if ((date[1][i]== '/ '||date[1][i]== '. ')&&d==0) { d=1; i++; continue; }
if (d==-1) year=year*10+(date[1][i]- '0 ');
if (d==0) month=month*10+(date[1][i]- '0 ');
if (d==1) day=day*10+(date[1][i]- '0 ');
i++;
}
if (month <1||month> 12)
{ printf ( "\n ERROR! the entered MONTH is invalid\n "); exit (0); }
if (year==2000) { dy=0; m2=1; goto la_100; }
if (year> 2000) d=(year-1-2000)/4-(year-1-2000)/100+(year-1-2000)/400+1;
else d=(year-2000)/4-(year-2000)/100+(year-2000)/400;
dy=(year-2000)+d; /*** 该年 1月1号 到2000年1月1号的 " 星期差 " ***/
if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))
m2=1; else m2=0; /*** 该年是否润 ***/



la_100: /**** la_100 ****/

/*** 该月以前的月所引起的 " 星期差 " ***/
switch (month)
{
case 1: dm=0; month=31; break; /*** month 在此存放该月天数 ***/
case 2: dm=3; month=d==1? 29:28; break;
case 3: dm=3+m2; month=31; break;
case 4: dm=6+m2; month=30; break;
case 5: dm=1+m2; month=31; break;
case 6: dm=4+m2; month=30; break;
case 7: dm=6+m2; month=31; break;
case 8: dm=2+m2; month=31; break;
case 9: dm=5+m2; month=30; break;
case 10: dm=m2; month=31; break;
case 11: dm=3+m2; month=30; break;
case 12: dm=5+m2; month=31; break;
}
if (day <0||day> month)
{ printf ( "\n ERROR! the entered DAY is invalid\n "); exit (0); }
week=(dy+dm+day-1+6)%7; if(week <0) week+=7;

if (day> 0) /*** 判断查看类型 ***/
{
switch (week)
{
case 0: strcpy (WEEK, "SUNDAY "); break;
case 1: strcpy (WEEK, "MONDAY "); break;
case 2: strcpy (WEEK, "TUESDAY "); break;
case 3: strcpy (WEEK, "WEDNESDAY "); break;
case 4: strcpy (WEEK, "THURSDAY "); break;
case 5: strcpy (WEEK, "FRIDAY "); break;
case 6: strcpy (WEEK, "SATURDAY "); break;
}
printf ( "\n this day is %s \( %d \)\n\n OK!\n ",WEEK,week);
}
else
{
week=++week%7;
printf ( "\n the calender of this month as following\n ");
printf ( "\n *********************************\n ");
printf ( " SUN MON TUE WEN THU FRI STA\n ");
for (i=0;i <week;i++) printf ( " ");
for (i=1;i <=month;i++)
{ printf ( " %2d ",i); week++; if (week%7==0&&i!=month) printf ( "\n "); }
printf ( "\n *********************************\n ");
printf ( "\n OK!\n ");
}
}
[解决办法]
http://blog.sina.com.cn/u/53c02915010004ao
//快速计算星期几的公式
#include <stdio.h>
char *name[] = { "monday ",
"tuesday ",
"wednesday ",
"thursday ",
"friday ",
"saturday ",
"sunday "
};
void main(){
int D,M,Y,A;
scanf( "%d%d%d ",&Y,&M,&D);
if ((M == 1) || (M == 2)){
M += 12;


Y--;
}
A = (D + 2*M + 3*(M+1)/5 + Y + Y/4 - Y/100 + Y/400) % 7;
printf( "%s\n ",name[A]);
}

读书人网 >C语言

热点推荐