目录
一、设计内容
用户有两个选择,可以输入某年某月输出单月的日历,也可以输入一个年份得到全年的
日历。
二、概要设计
1. 功能模块:if—else 语句实现功能选择
2. 各个模块详细的功能描述:
主函数运行后,程序提供给用户两个选项,用户可以输出某年某月的日历或某年全
年的日历。用户输入选择后,判断选择的合法性。根据用户的选择调用不同的函数实现
对应功能。
三、实验流程图
四、源程序
#include<stdio.h>
int firstdayofyear(int year);
int firstdayofmonth(int year ,int month );
int isleapyear(int year);
int dayofmonth(int year ,int month);
int main()//输入年打印出此年的日历。
{ int a[12][6][7]={0};
int year,yue;//年,月
int i,j,k,z,n,shu;//z标记星期,n为几号
printf("请输入年份:");
scanf("%d",&year);
printf("请输入月份:");
scanf("%d",&yue);
z=firstdayofyear(year);
//printf("%d",z);
for(i=0;i<12;i++)
{ k=z%7;//确定从周几开始
n=1;//每个月1号开始
for(j=0;j<6;j++)
{ for( ;k<7;k++,n++)
{ if(n>dayofmonth(year,i+1))//确保日期不超
break;
a[i][j][k]=n;//将日期赋给每天
//printf("%d",a[i][j][k]);
z=k+1;//记录明天是周几
}
k=0;//下一行周日开始
}
}
//printf("%d",z);
printf("-----------%d年%d月-----------\n",year,yue);//输出月历
printf("%3d SUN MON TUE WED THU FRI SAT\n",yue);
for(j=0;j<6;j++)
{ printf(" ");
for(k=0;k<7;k++)
{ if(a[yue-1][j][k]!=0)
printf("%2d ",a[yue-1][j][k]);
else
printf(" ");//无日期的空格代替输出
}
printf("\n");
}
printf("\n-------------------------%d年的年历-------------------------\n",year);//输出年历
for(i=0;i<6;i++)//六次大输出
{ printf("%3d SUN MON TUE WED THU FRI SAT ",i+1);
printf("%3d SUN MON TUE WED THU FRI SAT \n",i+7);
for(j=0;j<6;j++)//每月6行
{ printf(" ");//对齐
for(k=0;k<7;k++)//每天
{ if(a[i][j][k]!=0)
printf("%2d ",a[i][j][k]);//i+1月的日期
else
printf(" ");//无日期的空格代替输出
}
printf(" ");//对齐
for(k=0;k<7;k++)
{ if(a[i+6][j][k]!=0)
printf("%2d ",a[i+6][j][k]);//i+7月日期
else
printf(" ");//无日期的空格代替输出
}
printf("\n");
}
}
return 0;
}
int firstdayofyear(int year) /*求某年的第一天是星期几*/
{ int i;
long n,days=year;
days=days*365; /* printf("\n%ld",days);*/
for(i=1;i<year;i++)days=days+isleapyear(i); /*printf("\n%ld",days);*/
n=days%7;
return n;
}
int firstdayofmonth(int year ,int month ) /* 求某年某月的第一天是星期*/
{ int i,days=0, weekdays;
weekdays=firstdayofyear(year);
for(i=1;i<month;i++)days+=dayofmonth(year,i);
return (days+weekdays)%7;
}
int isleapyear(int year)//编写函数int isleapyear(int year);判某年是否为闰年,如该年为闰年返回1,否则返回0。编写主函数输入年份给出该年是否为闰年。
{ int z;
if( (year%4==0 && year%100!=0) || year%400==0 )
z=1;
else
z=0;
//printf("%d",z);
return z;
}
int dayofmonth(int year ,int month)//编写函数int dayofmonth(int year ,int month);计算某年某月有几天。主函数中输入任意的年和月,给出此年该月有几天。
{ int z;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
z=31;
else if(month==4||month==6||month==9||month==11)
z=30;
else if(month==2)
if(isleapyear(year))
z=29;
else
z=28;
return z;
}
五、运行结果
六、总结反思
问题不大,耐心写程序。