万年历星期的算法(C语言)

合集下载

计算星期程序

计算星期程序
星期二
输入0退出,其他继续:d
2008,1,1
星期二
输入0退出,其他继续:l
2008,8,8
星期五
输入0退出,其他继续:0
请按任意键继续. . .
注:用来算现在真实日期的星期是没有问题的。原理是根据已知公元1年1月1日的星期数来推算。如果在你的题目中约定了某天是星期几,你要注意那天的星期是否跟真实的星期相同,如果不同,需要考虑相差几天!
由于我们要计算的是当前要计算的年之前的闰年数,所以要将年减1,得到了如下的公式:
w = [d-1+y + (y-1)/4-(y-1)/100+(y-1)/400] % 7 -----公式⑵
现在,我们得到了按年扩展的公式⑵,用这个公式可以计算任一年的1月份的星期
四、扩展到其它月
考虑这个问题颇费了一翻脑筋,后来还是按前面的方法大胆假才找到突破口。
#include <stdio.h>
void CaculateWeekday(int y, int m, int d)
{
int w; //代表星期几
if (m==1 || m==2)
{
m += 12;
y--;
}
w = (d+1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400)%7;
flushall();
printf("按 Esc 键退出,其他键继续!");
ch = getch();
printf("\n");
flushall();

单片机万年历C语言程序完整

单片机万年历C语言程序完整
sbit out = P2^3; //立刻跳出调整模式按钮
sbit DQ = P3^0;
char done,count,temp,flag,up_flag,down_flag,t_value;
uchar TempBuffer[5],week_value[2];
void show_time(); //液晶显示程序
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[11];
unsigned char TimeString[9];
}SYSTEMTIME;//定义的时间类型
#define AM(X)X
#define PM(X)(X+12)//转成24小时制
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); //地址,命令
ucData = DS1302OutputByte(); //读1Byte数据
DS1302_CLK = 1;
#define DS1302_SECOND0x80 //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE0x82
#define DS1302_HOUR0x84
#define DS1302_WEEK0x8A
#define DS1302_DAY0x86
#define DS1302_MONTH0x88
#define uchar unsigned char

用c语言编写万年历思路

用c语言编写万年历思路

用c语言编写万年历思路摘要:1.编写万年历的思路2.C 语言编程基础3.实现万年历的算法4.具体编写代码5.测试与优化正文:编写万年历的思路:万年历是一种能够显示任意一年中每月每日的日历,它可以方便地帮助人们查询日期和节日。

在C 语言中编写万年历需要运用一些基本的编程知识和算法。

本文将从编写万年历的思路、C 语言编程基础、实现万年历的算法、具体编写代码以及测试与优化等方面来介绍如何用C 语言编写万年历。

C 语言编程基础:在开始编写万年历之前,我们需要了解一些C 语言的基础知识,例如变量、循环、条件语句等。

C 语言是一种高级编程语言,它可以用来编写操作系统、编译器等各种应用程序。

C 语言具有语法简单、执行效率高的特点,因此在编写万年历时,我们可以选择使用C 语言来进行编程。

实现万年历的算法:万年历的实现需要运用一些基本的算法,例如计算平年和闰年的天数、计算每个月的天数等。

我们可以通过一个数组来存储每一年的天数信息,然后根据需要输出相应的日期。

在实现万年历的过程中,我们需要注意闰年的判断,根据闰年的规则,每4 年一闰,每100 年不闰,每400 年再闰。

具体编写代码:在具体编写代码时,我们需要按照一定的逻辑顺序进行编程。

首先,我们需要输入年份,然后根据年份计算出该年的天数信息。

接着,我们可以使用循环语句来逐月输出日期。

在输出日期时,我们需要注意每个月的天数,以及每个月的日期格式。

测试与优化:在编写完万年历程序后,我们需要对其进行测试和优化。

首先,我们可以通过输入一些年份来测试程序的正确性。

在测试过程中,我们需要注意程序的运行速度和正确性。

如果发现程序存在问题,我们需要及时进行优化和修改。

总之,用C 语言编写万年历需要掌握一定的编程基础和算法知识。

在编写程序时,我们需要注意代码的逻辑性和正确性,以便能够输出正确的日期信息。

万年历C语言报告范文1

万年历C语言报告范文1

万年历C语言报告范文1万年历实验报告---软件工程老师:班级:学号:姓名:-1-实验题目:编制一个万年历程序要求:输入一个年份(1-3000),然后显示12个月的月历,如屏幕显示不下,则应提供翻页功能。

一.实验目的通过实例使同学们掌握结构化数据流分析技术。

二.实验内容软件需求分析:1.总体而言,根据老师的要求来做一个万年历的C程序,要求分页输出每个月的月历,首先输入想要知道日历的年份,然后可按ENTER键逐月显示日历,这样就可以达到要求了。

3.求出一年中的第一天是周几(year+(year-1)/4-(year-1)/100+(year-1)/400)%7。

4.用FOR循环输出各月份的日历。

数据流图:软件设计与编码:实验完整代码:#include\longintf(intyear,intmonth){if(month<3)returnyear-1;elereturnyear;}longintg(intmonth){if(month<3)returnmonth+13;elereturnmonth+1;}longintn(intyear,intmonth,intday){return1461L某f(year,month)/4+153L某g(month)/5+day;}intw(intyear,intmonth,intday){return(int)((n(year,month,day)%7-621049L%7+7)%7);}intdate[12][6][7];intday_tbl[][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31, 29,31,30,31,30,31,31,30,31,30,31}};main(){intw,leap,i,j,k,wd,day;intyear;chartitle[]=\printf(\请输入您想要知道万年历的年份:\输入年某/canf(\输入年份值和掠过值后的回车某/w=w(year,1,1);for(k=0;k<7;k++)date[i][j][k]=0;/某日期表置0某/for(i=0;i<12;i++)/某一年十二个月某/-3-for(wd=0,day=1;day<=day_tbl[leap][i];day++){/某将第i+1月的日期填入日期表某/date[i][wd][w]=day;w=++w%7;/某每星期七天,以0至6计数某/if(w==0)wd++;/某日期表每七天一行,星期天开始新的一行某/}printf(\年的年历===========|\\n\for(i=0;i<12;i++){/某先测算第i+1月的最大星期数某/for(wd=0,k=0;k<7;k++)/某日期表的第六行有日期,则wd!=0某/wd+=date[i][5][k]+date[i+6][5][k];wd=wd6:5;put(\printf(\月%|\\n|\for(j=0;jprintf(\\for(k=0;k<7;k++)if(date[i][j][k])printf(\eleprintf(\\printf(\\printf(\}put(\canf(\键入回车输出下一个月的日历某/}put(\put(\按任意键退出...\getch();}截图:-4--5-三.总结1.实验内容总结经过运行和调试得到了想要的结果——“万年历”,任意输入一个年份能按当初设计的格式输出每个月份的日历。

C语言实训--万年历源代码

C语言实训--万年历源代码

C语言实训--万年历源代码# include#include#include#include#include# define YEAR 365int numday[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31}, {31,29,31,30,31,30,31,31,30,31,30,31}};int leap(int year);int calday(int y,int m);int counterdays(int year,int month,int day);int week(int year,int month,int day);int eachyeartotal(int year,int month,int day);int maxDay(int y,int month);void print(int y,int m,int w);void festival (int year,int month,int day);int IsLeap(int y);int guanli(int i);void rili(int year,int month);int rili1();void rili2();void rili3();void rili4();void rili5();void fan();void show(int year,int month,int date,int sec,int mini,int hour);int main(){int i;printf("***************************************\n"); printf("1.查询日历,输入年份:\n");printf("2.查询该月日历及对应星期,输入年份和月份:\n"); printf("3.查询星期几及节日,输入年月日:\n");printf("4.距您输入日期还有多少天,输入日期:\n"); printf("5.通过键盘上下控制不同年月日:\n");scanf("%d",&i);guanli(i);return 0;}int guanli(int i){switch(i){case 1:rili1();return main();case 2:rili2();return main();case 3:rili3();return main();case 4:rili4();return main();case 5:rili5();return main();}return 0;}int rili1(){int year;int n,i;printf("输入年份:");scanf("%d",&year);printf("the calendar of the year%d\n",year);printf("\n");printf("=============================\n"); for(i=1;i<13;i++){printf(" %d月份\n",i);rili(year,i);}n = leap(year);return 0;}void rili2(){int year,month,w;printf("输入年月:");scanf("%d%d",&year,&month);w=calday(year,month);print(year,month,w);}void rili3(){int year,month,day,number;printf("输入年月日:");scanf("%d%d%d",&year,&month,&day);festival(year,month,day);number= week(year,month,day);printf("星期%d",number);}void rili4(){int year,month,day;printf("输入年月日:");scanf("%d%d%d",&year,&month,&day); eachyeartotal( year,month,day);counterdays(year,month,day);}void rili5(){int year,month,date,sec,mini,hour;fan();show(year,month,date,sec,mini,hour);}int leap(int year){int n=(year%4==0 && year%100!=0 || year%100!=0); return n;}void rili(int year,int month){int i,day,first_day,flag,year1,year2;int temp = 6;flag =leap(year);year1=year/100;year2=year%100;if(year>2000){year1=year1-20;day = year1/4;day+=(YEAR+24)*year1+YEAR*year2+(year2-1)/4;if(year>2000)day++;switch(month){case 1:day; break;case 2:day+=31;break;case 3:day+=59+flag;break;case 4:day+=90+flag;break;case 5:day+=120+flag;break;case 6:day+=151+flag;break;case 7:day+=181+flag;break;case 8:day+=212+flag;break;case 9:day+=243+flag;break;case 10:day+=273+flag;break;case 11:day+=304+flag;break;case 12:day+=334+flag;break;}day+=temp;first_day=day%7;}else{year1 = 20-1-year;year2=100-year2-1;day+=(YEAR+24)*year1+YEAR*year2+year2/4; switch(month){case 12:day+=31;break;case 11:day+=61;break;case 10:day+=92;break;case 9:day+=122;break;case 8:day+=153;break;case 7:day+=184;break; case 6:day+=214;break; case 5:day+=245;break; case 4:day+=275;break; case 3:day+=306;break; case 2:day+=334+flag;break; case 1:day+=365+flag;break; }day-=temp;day = day%7;first_day=(7-day)%7;}switch(month){case 1:case 2:month=28+flag;break; case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:month=30;break; case 12:month =31;break;}for(i=1;i<4*first_day;i++) printf(" ");for(i=0;i<month;i++)< p="">{printf("%4d",i+1);if((first_day+i)%7==6)printf("\n");}printf("\n");printf("===============================\n");}///////////////////////////////////////////////////////////int counterdays(int year,int month,int day){int year1,days0,days1,month1,days,day1;time_t timep;struct tm*p;time(&timep);p=gmtime(&timep);year1=(1900+p->tm_year);month1=(1+p->tm_mon);day1=(p->tm_mday);days0=(year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400 +eachyeartotal (year,month,day);days1=(year1 - 1)*365+(year1-1)/4-(year1-1)/100 + (year1 - 1)/400 +eachyeartotal (year1,month1,day1);days=days0-days1;printf("\n今天距%d年%d月%d日还有%d天\n\n",year,month,day,days);return days;}int eachyeartotal(int year,int month,int day){int i,sum=0;for(i=1;i<month;i++)< p="">{sum+=maxDay(year,i);}sum+=day;return sum;}int IsLeap(int y){if(y%4==0 && y%100!=0 || y%400==0) return 1; else return 0;}int maxDay(int y,int month){int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};if(IsLeap(y))a[1]=29;return a[month-1];}///////////////////////////////////////void festival (int year,int month,int day){if (month==1 && day==1) printf (",这天是元旦");if (month==2 && day==14) printf (",这天是情人节"); if (month == 3)switch(day){case 8:printf (",这天是妇女节"); break;case 12:printf (",这天是植树节");}if (month==1 && day==1) printf (",这天是愚人节");if(month == 5)switch (day){case 1:printf(",这天是劳动节");break;case 4:printf(",这天是青年节");}if (month==6 && day==1) printf (",这天是儿童节");if (month==7 && day==1) printf (",这天是建党节");if (month==8 && day==1) printf (",这天是建军节");if (month==9 && day==10) printf (",这天是教师节");if (month==10 && day==1) printf (",这天是国庆节");printf("\n");}int week(int year,int month,int day){int number = (year-1)+(year-1)/4 - (year-1)/100+(year-1)/400+eachyeartotal(year,month,day);number = number%7;return number;}/////////////////////////////////////////////void print(int y,int m,int w){int i,l;printf("Calendar %d-%02d\n",y,m);printf("---------------------\n");printf("Su Mo Tu We Th Fr Sa \n");printf("---------------------\n");for (i=0;i<w;i++)< p=""> printf(" ");if (IsLeap(y))l=1;elsel=0;for (i=1;i<=numday[l][m-1];i++) {printf("%-3d",i);w++;if (w%7==0)printf("\n");}if (w%7) printf("\n");printf("---------------------\n"); }int calday(int y,int m){int d=0,w;while (y>1910){if (IsLeap(y)) d+=366;else d+=365;y--;}while (m>1){ --m;d+=numday[0][m-1];}w=(d+1)%7;return w;}//////////////////////////////////////////void show(int year,int month,int date,int sec,int mini,int hour) {const char month_str[][4]={"","Jan","Feb","Mar","Apl", "May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};const int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};int i,j,wdays,mdays,days;for(i=1,days=0;i<year;i++)< p="">{if(leap(i))days += 366;}else{days += 365;}}for(i=1;i<month;i++)< p="">{if(i==2 && leap(year)){days+=29;}else{days+=month_day[i];}}printf(" %s.%d.%d %d:%d:%d \n",month_str[month],date,year,hour,mini,sec);printf(" 一二三四五六日\n");wdays = days % 7;for( j = 0; j < wdays; j++){printf(" ");}if(month == 2 && leap(year)){mdays=29;}else{mdays= month_day[month];}for(i=1;i<=mdays;i++){if( i > 1 && days % 7 == 0 ){printf("\n");}printf("%4d",i);days=days+1; }printf("\n---------------------------\n\n\n");}{time_t rawtime;struct tm *info;int year,month,date,sec,mini,hour; char ch;time ( &rawtime );info = localtime ( &rawtime );year =info->tm_year + 1900; month =info->tm_mon + 1;date =info->tm_mday;hour =info->tm_hour;mini =info->tm_min;sec =info->tm_sec;while(1){show(year,month,date,sec,mini,hour); printf("↑......上一年\n\n");printf("↓......下一年\n\n");printf("←....前一个月\n\n");pr intf("→....后一个月\n\n");printf("Esc.......退出\n\n");ch=getch();switch(ch){case 27://Ecs exit(0);case -32://Navigatorch=getch();if(ch==77){//Rightyear+=(month==12)?1:0;month=month%12+1;}else if(ch==75){year-=(month==1)?1:0; month=(month-2+12)%12+1; }else if(ch==72)year--;else if(ch==80)year++;system("cls");}}</month;i++)<></year;i++)<></w;i++)<></month;i++)<></month;i++)<>。

C语言根据日期(年,月,日)判断星期几(使用基姆拉尔森计算公式)

C语言根据日期(年,月,日)判断星期几(使用基姆拉尔森计算公式)

C语⾔根据⽇期(年,⽉,⽇)判断星期⼏(使⽤基姆拉尔森计算公式)C语⾔根据⽇期判断星期⼏(使⽤基姆拉尔森计算公式)算法如下:基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7在公式中d表⽰⽇期中的⽇数,m表⽰⽉份数,y表⽰年数。

注意:在公式中有个与其他公式不同的地⽅:把⼀⽉和⼆⽉看成是上⼀年的⼗三⽉和⼗四⽉,例:如果是2004-1-10则换算成:2003-13-10来代⼊公式计算。

以公元元年为参考,公元元年1⽉1⽇为星期⼀程序如下:/*利⽤基姆拉尔森计算⽇期公式 w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)*/#include <stdio.h>const char * getWeekdayByYearday(int iY, int iM, int iD){int iWeekDay = -1;if (1 == iM || 2 == iM){iM += 12;iY--;}iWeekDay = (iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7;switch(iWeekDay){case0 : return"Sunday"; break;case1 : return"Monday"; break;case2 : return"Tuesday"; break;case3 : return"Wednesday"; break;case4 : return"Thursday"; break;case5 : return"Friday"; break;case6 : return"Saturday"; break;default : return NULL; break;}return NULL;}int main(){int year,month,day;char ch='1';while(ch != '\033'){printf("\n请输⼊⽇期:\n格式为:1900,1,1\n");scanf("%d,%d,%d",&year,&month,&day);const char * p = getWeekdayByYearday(year, month, day);printf("WeekDay : %s\n", p);ch = getchar();printf("\n");}}运⾏效果:$ ./getweekdaybyday请输⼊⽇期:格式为:1900,1,12008,4,29WeekDay : Tuesday请输⼊⽇期:格式为:1900,1,12015,2,4WeekDay : Wednesday请输⼊⽇期:格式为:1900,1,1编者注:⽤来算现在真实⽇期的星期是没有问题的。

C语言课程设计万年历 完整版

C语言课程设计万年历  完整版

目录一引言 (2)二系统功能和数据说明 (3)一)功能简介 (3)二)程序中的数据说明 (3)三程序总体设计及流程图 (4)一)应用到的c语言 (4)二)程序的总框架 (5)四功能模块设计及调试 (5)一)算法说明 (5)1.总天数的算法 (5)2.计算输入日期是星期几 (6)3.对输入信息的汇总 (8)4..界面的控制 (10)二)调试结果 (11)五程序清单 (12)六结束语 (17)一引言通过大一上学期对C语言的学习,了解到了很多C语言的相关知识。

学习的过程有很多困惑但是当自己能够独立的看懂,能过独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。

我可以里哟哦那个它看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对探究的兴趣。

C语言是近年在国内外得到迅速推广应用的一种语言。

C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。

因此,C语言特别适合于编写各种软件。

在这次的课程设计中我将把日常生活中最经常接触的——日期的查询利用C语言的程序编成一个简单的日历。

通过这个小小的日历可以实现很多功能。

在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。

在不断的调试中最终才获得最为完整的程序。

接下来就是我的C 语言课程设计的具体内容来了二系统功能和数据说明(一)功能简介在我们的日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简介明了的给我们最想要的日期信息。

在我的万年历当中,就是将日历,月历做的简单明了,很方便我们的使用。

下面是它要实现的一些基本功能:用C语言编写万年历1、输入年份,判断是否为闰年2、输入年月日,判断改日为星期几3、输入年份,打出12个月历,输入月份,打出该月的日历4、要求用多个函数实现[名称]万年历[修改]1、对输入的日期进行容错处理2、增加和修改为英文的月份和星期显示3、采用指针形式的weeks和month数组(二)程序中的数据说明①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。

万年历c语言代码讲解

万年历c语言代码讲解

万年历c语言代码讲解万年历是一种常见的日历形式,可以显示一年中每一天的日期和星期几。

在计算机编程中,我们可以使用C语言编写一个万年历的程序来实现这个功能。

我们需要了解一个概念:闰年。

闰年是指能被4整除但不能被100整除的年份,或者能被400整除的年份。

闰年的2月份有29天,而普通年份的2月份只有28天。

接下来,我们可以开始编写程序了。

首先,我们需要定义一个结构体来表示日期,结构体中包含年、月和日三个成员变量。

然后,我们可以编写一个函数来判断某一年份是否是闰年。

根据闰年的定义,我们可以使用取余运算符(%)来判断。

接下来,我们需要编写一个函数来计算某一年月的某一天是星期几。

这个函数的核心思想是根据已知的某一天是星期几,然后通过计算得出某一天之后或之前的日期是星期几。

我们可以使用一个数组来保存每个月份的天数,并根据年份是否是闰年来调整2月份的天数。

在计算星期几的过程中,我们可以使用蔡勒公式。

蔡勒公式是一种计算星期几的方法,根据蔡勒公式,我们可以得出某一天是星期几。

具体的计算公式可以在代码中实现,但是根据要求,我们不能输出公式,所以在这里就不展开讲解了。

接下来,我们可以编写一个主函数来调用上述的函数,并输出结果。

在主函数中,我们可以通过用户输入来获取需要查询的年月信息,然后调用函数来计算星期几,并输出结果。

为了使输出结果更加美观,我们可以使用制表符来对齐输出的结果。

在编写主函数的过程中,我们还可以加入一些错误处理的代码,例如判断用户输入的年月是否合法,以及判断计算结果是否正确。

这样可以增加程序的健壮性和用户体验。

我们还可以考虑加入一些额外的功能,例如输出某个月份的日历表格或者某一天所在的周的日期范围等。

这样可以提升程序的实用性和功能性。

通过以上的步骤,我们就可以完成一个简单的万年历程序的编写。

这个程序可以根据用户的输入来计算某一年月的某一天是星期几,并输出结果。

通过这个程序,我们可以更方便地查询任意日期的星期几,从而更好地了解和利用时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

万年历星期的算法(C语言)
#include <stdio.h>
code unsigned char WeekTab[] = { //闰年月星期表
(3 << 5) + 31,//1月
(6 << 5) + 29,//2月
(0 << 5) + 31,//3月
(3 << 5) + 30,//4月
(5 << 5) + 31,//5月
(1 << 5) + 30,//6月
(3 << 5) + 31,//7月
(6 << 5) + 31,//8月
(1 << 5) + 30,//9月
(4 << 5) + 31,//10月
(0 << 5) + 30,//11月
(2 << 5) + 31 //12月
};
/*------------2000年~2099年星期算法----------*/
unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d) {
unsigned char week, day;
day = WeekTab[m - 1]; //月表
week = day >> 5; //月星期数
day &= 0x1f; //月天数
if ((m < 3) && (y & 0x03))
{ //平年
if (m == 2) day--; //平年月天数
week++; //平年月表+1
}
y = y + (y >> 2); //年+年/4
week = (week + y + d + 2) % 7; //(星期=年+年/4+月表+2日)%7 return (week << 5) | day; //返回星期和月天数
}
/*--------------0000年~9999年星期算法------------*/
unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m, unsigned char d)
{
unsigned char week, day;
c &= 0x03; //百年%4
c = c | (c << 2); //百年%4*5
day = WeekTab[m - 1]; //月表
week = day >> 5; //月星期数
day &= 0x1f; //月天数 if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))) { //平年 if (m == 2) day--; //平年月天数 week++; //平年月表+1 }
y = y + (y >> 2); //年+年/4 week = (week + c + y + d + 2) % 7;
//(星期=百年%4*5+年+年/4+月表+日+2)%7 return (week << 5) | day; //返回星期和月天数
}
unsigned char BcdToBin(unsigned char val)
{
val = (val >> 4) * 10 + (val & 0x0f); //将BCD码转换为10进制数 return val; //返回10进制数
}
void main(void)
{
unsigned char c, y, m, d;
unsigned char cx, yx, mx, dx;
unsigned char WDay, Week, Day;
/*---------------------------------------------------------
0001年1月1日星期天
---------------------------------------------------------*/
c = 0x00;
y = 0x01;
m = 0x01;
d = 0x01;
cx = BcdToBin(c); //百年
yx = BcdToBin(y); //年
mx = BcdToBin(m); //月
dx = BcdToBin(d); //日
WDay = WeekDay(cx, yx, mx, dx); //取星期和月天数
Week = WDay >> 5; //得到星期
Day = WDay & 0x1f; //得到最大月天数
/*---------------------------------------------------------
1918年1月21日星期一
---------------------------------------------------------*/
c = 0x19;
y = 0x18;
m = 0x01;
d = 0x21;
cx = BcdToBin(c); //百年
yx = BcdToBin(y);/ /年
mx = BcdToBin(m); //月 dx = BcdToBin(d); //日 WDay = WeekDay(cx, yx, mx, dx); //取星期和月天数 Week = WDay >> 5; //得到星期 Day = WDay & 0x1f; //得到最大月天数/*--------------------------------------------------------- 9999年12月31日星期天
---------------------------------------------------------*/ c = 0x00;
y = 0x01;
m = 0x01;
d = 0x01;
cx = BcdToBin(c);//百年
yx = BcdToBin(y);//年
mx = BcdToBin(m);//月
dx = BcdToBin(d);//日
WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数
Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数
/*--------------------------------------------------------- 2004年6月18日星期五
---------------------------------------------------------*/ c = 0x20;
y = 0x04;
m = 0x06;
d = 0x18;
cx = BcdToBin(c);//百年
yx = BcdToBin(y);//年
mx = BcdToBin(m);//月
dx = BcdToBin(d);//日
WDay = WeekDay20(yx, mx, dx);//取星期和月天数
Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数
/*--------------------------------------------------------- 2018年3月8日星期四
---------------------------------------------------------*/ c = 0x20;
y = 0x18;
m = 0x03;
d = 0x08;
cx = BcdToBin(c);//百年
yx = BcdToBin(y);//年
mx = BcdToBin(m);//月
dx = BcdToBin(d);//日
WDay = WeekDay20(yx, mx, dx);//取星期和月天数 Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数
while(1);
}。

相关文档
最新文档