两星期来的课程设计,现拿出来和大家一起探讨,因将考试,不再详细编辑。希望可以给大家带来帮助。1.算法分析
本设计的目的主要是从键盘输入年月信息,并在液晶屏上显示该年月的月历信息,那么只要知道该月第一天的星期值和天数,就可以将月历排列并显示出来。
经分析发现各年1月1日的星期值有如下规律:
1950.1.1
1951.1.1
1952.1.1(闰年)
1953.1.1
1954.1.1
1955.1.1
星期日
`
星期一
星期二
星期四
星期五
星期六
1956.1.1(闰年) 1957.1.1
1958.1.1
1959.1.1
1960.1.1
星期日
星期二
星期三
星期四
星期五
也就是说紧挨着的两年,如果前一年是平年,那么后一年的第一天(1月1日)在星期(7天)的排列上肯定比前一年的第一天(1月1日)推后一天;如果前一年是闰年,那么就是推后两天。比如2007年1月1日是星期一,因为2007年是平年,所以2008年1月1日就是星期二;又因为2008年是闰年,所以2009年1月1日就是星期四。依次类推就可以知道任意一年的1月1日的星期值。以上规律可以用一个式子来计算:
在本设计中,我们以1950年为起点(1950年1月1日为星期日,定其星期值为0),输入年份为NNNN,设NNNN年1月1日的星期值为firsr,那么有:
First=((NNNN-1950)+(NNNN-1950+1)/4)%7
若first=3,就说明NNNN年1月1日是星期三。
另外,一年内各个月的第一天(1日)相对于该年1月1日在星期的排列上也是有规律的。分析如下:
设NNNN年1月1日的星期值是first,该年YY月1日的星期值为yihao,那么这两者之间有如下关系:
yihao=(first+a)7
(a=P[YY-1]或a=R[YY-1],P[]={0,3,3,6,1,4,6,2,5,0,3,5}
R[]={0,3,4,0,2,5,0,3,6,1,4,6})
若YY=4,如果NNNN为平年,则yihao=first+6;如果NNNN为闰年,则yihao=first+0。
每个月的天数可以很容易得出,而2月的天数只要根据当年是否为闰年来取值。
通过以上前两步就可以求出所输入年月的第一天的星期值,再根据第三步所求得的天数,可以在屏幕上显示月历信息。
2.月历算法子程序
/********************************************************************
*名称:FirstDay()
*功能:求取所输入年月的第一天(1号)相对于该年1月1号的星期值的偏移量。
*入口参数:year--所输入的年份
month--所输入的月份
*出口参数:firstday--该月1号的星期值
********************************************************************/
uint8
FirstDay(uint16 year,uint8 month)
{
uint8 firstday,January;
uint8 yyh1[12]={0,3,3,6,1,4,6,2,5,0,3,5};
/*平年每月第一天的星期值相对于
该年1月1号星期值的偏移量*/
uint8 yyh2[12]={0,3,4,0,2,5,0,3,6,1,4,6};
/*闰年每月第一天的星期值相对
该年1月1号星期值的偏移量 */
January=((year-qidian)+(year-qidian+1)/4)%7;
// 求取该年1月1日的星期
值(1950年 1月1号的星期值为0)
if(year%4)
firstday=yyh1[month-1];
//平年偏移量
else
firstday=yyh2[month-1];
//闰年偏移量
firstday=(firstday+January)%7;
//求取该月1日的星期值
return(firstday);
//返回该月1日的星期值
}
|