《打印月历》年月日
《打印月历》
年月日
《C语言课程设计》
课程设计报告
题 目
学 号
姓 名
年级专业
指导教师
完成日期
安徽师范大学物理与电子信息学院
、问题描述及基本要求:
年份和月份由键盘输入,打印的月历按星期一到星期日排
列;
注意大小月,闰年等问题。
二、程序分析和具体设计
设计难点:
1.程序难点在于判断每月的第一日为星期几,但根据蔡勒公式,可
以很容易地有年月日推断出星
s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/400-
40+c;
return ((int)s%7);
year:要查询的年份;
s:从该年的一月一日起到该天的天数;
s%7:得出的星期数,s%7==0表示星期天;
在打印月历时,只要知道第一天的星期,就可以依次输入后面的 日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出, 因此可以按照月历的格式输出;
2?闰年的判断,能被4整除但不能被100整除,或者能被400整 除的年份为闰年,否则为平年;大小月的判断,闰年的第二月为29
天,平年的第二月为30天;
3?判断日期是否合法,可以先判断年月日是否有小于0的值,月
和日是否有超出最大值12和31,如果通过此判断合法,再判断是 否时闰年,如果时闰年,则判断二月份是否满足要求,闰年二月份不 能超过29天,平年二月份不能超过28天。在查询过程中,如果发现 输入不合法或者不满足输入要求,则要求重新输入。
设计思路
第一步:判断输入是否合法;int dayExame(i nt year,i nt
mon th,i nt day)
第二步:判断是否为闰年;int IsLeap Year(i nt year)
第三步:判断二月份天数;int mon th_day(i nt year,i nt mon th)
第四步:计算每月第一天的星期;int DaySearch(i nt year,i nt
mon th,i nt day)
第五步:按月历格式输出;int PrintY earmo nth(i nt year,i nt
mon th)
第六步:整合;void mai n()
三、结构图:
月历显示'闰年判断,按星
月历显示
期排列
<
四、流程图
丿
输出结果:
打印月历
五、程序清单:
#in clude<>
int dayExame(i nt year,i nt mon th,i nt day) {
if(year<0||mo nth<1||mo nth>12) return 0;
else return 1;
int Leap Year(i nt year) {
if((year%4==0&& year%100!=0)||(year%400==0))
return 1;
else
return 0;
}
int mon th_day(i nt year,i nt mon th)
{
int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if( Leap Year(year)&&mon th==2)
return 29;
else
return(m on _day[m on th-1]);
}
int DaySearch(i nt year,i nt mon th,i nt day)
{
int c=0;
float s;
int m;
for(m=1;m< mon th;m++)
c=c+m on th_day(year,m);
c二c+day;
s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/400-40+c
return ((i nt)s%7);
}
int PrintY earm on th(i nt year,i nt mon th)
{
int temp;
int i,j;
printf("\n%d 年%d 月 \n",year,month);
temp二DaySearch(year,m on th,1);
printf("星期一星期二星期三星期四星期五星期六星期天\n");
for(j=1;j< mon th_day(year,m on th)+temp;j++)
{
if(j-temp<0)
printf("");
else
prin tf("%3d",j-temp+1);
prin tf("%3d
",j-temp+1);
if(j%7==0)
prin tf("\n");
}
return 0;
}
void mai n()
{
int year,m on t