1、 C 语言课程设计 课程设计课程设计报告报告 安 安徽师范大学物理与电子信息学院 College of Physics and Electronic Information, Anhui Normal University 题 目 打印月历打印月历 学 号 姓 名 年级专业 指导教师 完成日期 年 月 日 一、问题描述及基本要求:一、问题描述及基本要求: 1)年份和月份由键盘输入,打印的月历按星期一到星期日排 列; 2)注意大小月,闰年等问题。 二二、程序程序分析和分析和具体具体设计设计 设计难点: 1.程序难点在于判断每月的第一日为星期几,但根据蔡勒公式,可 以很容易地有年月日推断出星 1)
2、s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/400- 40+c; 2)return (int)s%7); 3)year:要查询的年份; 4)s:从该年的一月一日起到该天的天数; 5)s%7:得出的星期数,s%7=0 表示星期天; 在打印月历时,只要知道第一天的星期,就可以依次输入后面的 日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出, 因此可以按照月历的格式输出; 2.闰年的判断,能被 4 整除但不能被 100 整除,或者能被 400 整 除的年份为闰年,否则为平年;大小月的判断,闰年的第二月为 29
3、 天,平年的第二月为 30 天; 3.判断日期是否合法,可以先判断年月日是否有小于 0 的值,月 和日是否有超出最大值 12 和 31 ,如果通过此判断合法,再判断是 否时闰年,如果时闰年,则判断二月份是否满足要求,闰年二月份不 能超过 29 天,平年二月份不能超过 28 天。在查询过程中,如果发现 输入不合法或者不满足输入要求,则要求重新输入。 设计思路 1)第一步:判断输入是否合法;int dayExame(int year,int month,int day) 2)第二步:判断是否为闰年;int IsLeapYear(int year) 3)第三步:判断二月份天数;int month_d
4、ay(int year,int month) 4)第四步:计算每月第一天的星期;int DaySearch(int year,int month,int day) 5)第五步:按月历格式输出;int PrintYearmonth(int year,int month) 6)第六步:整合;void main() 三、结构图:三、结构图: 输入日期输入日期 日期查询日期查询 四、流程图四、流程图 输入输入 int dayExmaeint dayExmae ( (判断二月的天数判断二月的天数) ) I Int month_daynt month_day ( (按星期一道星期日按星期一道星期日排排 列
5、列) )int daint daysearchysearch 判 断 是 否 为 判 断 是 否 为 闰 年 闰 年 月历显示月历显示 闰年判断,按星闰年判断,按星 期排列期排列 ( (计算计算每月每月 第一天的第一天的 星期星期) )int DaySearch year%4=0 else return 1; 输出结果输出结果: 打印月历打印月历 按月历格按月历格 式输式输出int PrintYearm onth int LeapYear(int year) if(year%4=0 else return 0; int month_day(int year,int month) int mon
6、_day=31,28,31,30,31,30,31,31,30,31,30,31; if( LeapYear(year) else return(mon_daymonth-1); int DaySearch(int year,int month,int day) int c=0; float s; int m; for(m=1;mmonth;m+) c=c+month_day(year,m); c=c+day; s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/40 0-40+c; return (int)s%7); int PrintYearmonth(int year,int month) int temp; int i,j; printf(“n%d 年年%d 月月n“,year,month); temp=DaySearch(year,month,1