#要求
输入任意一年将显示出该年的所有月份日期,对应的星期
其显示格式要求如下
1、月份用中文显示
2、下一行显示星期,从周日到周六,中英文都可以
3、下一行开始显示日期,从一号开始,并按其实周期实际情况与上面的星期数垂直对齐
4、可以查询闰年
#函数功能
(1)函数 welcome(),欢迎界面。
(2)函数 all_month() ,月历输出函数,循环输出该年一月到十二月的月历
(3)函数 putm() ,输出中文月份
(4)函数 leap_year(),判断是否为闰年
#模块设计
主功能模块:all_month()
输入年份 | |
---|---|
定义数组month[12]用来存放非闰年时,每月天数,如果是闰年则month[1]=29 | 定义数组ri[12]用于存放某一年每个月的第一天是星期几.ri[0]=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+leap_year(year))%7计算某一年1月1日为星期几ri[m]=((month[m-1]-(7-ri[m-1]))%7)第一个值来推出该年其他月份第一天是周几并存入数组 |
用for循环循环输出1到12月的月历,先根据ri[12]输出每月第一日前的空格,再根据month[12]输出每月的日期e=e+1;if(e%7==0){ printf("\n"); printf("\n"); printf(" "); } 因为月历的第一个星期是星期天,所以月历的第一行到了 星期六就要换行了。逢七换行 ,就是到了星期六就会换行, 换行的下一个星期是星期天 |
源代码:
#include<stdio.h>
#include<conio.h>
#include<windows.h>//清屏
char welcome();//欢迎界面
void all_month(int year);//月历输出函数
void putm(int m);//输出中文月份
int leap_year(int year);//判断是否为闰年
int main()
{
int a,b,c,year,month;
char number;
number=welcome();
number=welcome();
if(number == '1')//如果number是1则判断闰年
{
system("cls");//清屏
printf("请输入年份:\n");
scanf("%d",&year);
if(year>1000000000 && year<-1000000000)
{printf("年份计算错误");}//防止计算量过大
else{
if(leap_year(year) ==366)//闰年判断
{printf("%d年是闰年\n",year);}
else
{printf("%d年是平年\n",year);}}
printf("\n");
printf("是否继续?(y/n):\n");
number = getch();
if(number == 'y')//判断是否继续
{system("cls");main();}//继续,清屏并且主函数调用主函数本身
else{system("cls");}//否则,清屏结束
}
else if(number == '2')//如果number是2就输出该年的全部月历
{
system("cls");//清屏
printf("* Input the year: *\n");
scanf("%d",&year);//输入年份
if(year>1000000000)//防止计算量过大
{printf("年份计算错误");}
else{
printf("* The calendar of the year:%d *\n",year);
printf("\n");
all_month(year);}//输出该年的全部月历
printf("\n");
printf("是否继续?(y/n):\n");
number = getch();
if(number == 'y')//判断是否继续
{system("cls");main();}//继续,清屏并且主函数调用主函数本身
else{system("cls");}//否则,清屏结束
}
else if(number == '3')
{
//待续
}
return 0;
}
char welcome()//设置欢迎界面
{
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" ******************************************************\n");
printf(" ** * * **\n");
printf(" ** * 欢迎来到万年历系统 * **\n");
printf(" ** * * **\n");
printf(" *****************************************************\n");
printf(" *-------请选择你的操作------* \n");
printf(" * 1.查询闰年 *\n");
printf(" * 2.查询某年全部日期 *\n");// 通过不同的选项进行操作
printf(" * 3.退出 *\n");
printf("\n");
char number;//定义用户输入字符
number = getch();
return number;
}
void all_month(int year)//输出全部月历
{
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//非闰年时,每月天数
int ri[12];//定义数组,用于存放某一年每个月的第一天是星期几
int e,i,j,flag,m,b;
if(leap_year(year) == 366)
{
month[1]=29;//如果是闰年则二月有29天
}
ri[0]=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+leap_year(year))%7;
//计算某一年1月1日为星期几的递推公式
for(m=1;m<12;m++)
{ri[m]=((month[m-1]-(7-ri[m-1]))%7);}
//用上一个递推公式可以算出第一个月的一号是周几
//用第一个值来推出该年其他月份第一天是周几并存入数组
for(b=1;b<13;b++)//循环输出
{
e=ri[b-1];//e表示在该年某个月第一天是周几
i=b-1;
putm(b);//输出中文的月份
printf(" ******************************************************\n");
printf("\n");
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
printf(" 日 一 二 三 四 五 六\n");
flag=1;
printf(" ");
for(j=0;j<e;j++)
{
printf(" ");//输出每月第一日前的空格
}
while(flag<=month[i])//输出每月的日期
{
printf(" %3d ",flag);//输出第一天
flag++;//日期增加
e=e+1;//该月的第一天也跟着增加
if(e%7==0)
{
printf("\n");
printf("\n");
printf(" ");
}
/**因为月历的第一个星期是星期天,所以月历的第一行到了
星期六就要换行了。逢七换行 ,就是到了星期六就会换行,
换行的下一个星期是星期天
*/
}
printf("\n");
printf("\n");
printf(" =============================================\n");
printf("\n");
printf("\n");
}
printf("\n");
}
void putm(int m)//输出中文月份
{
switch(m)//使用switch函数
{
case 1:printf(" 一月:\n"); printf("\n"); break;
case 2:printf(" 二月:\n"); printf("\n"); break;
case 3:printf(" 三月:\n"); printf("\n"); break;
case 4:printf(" 四月:\n"); printf("\n"); break;
case 5:printf(" 五月:\n"); printf("\n"); break;
case 6:printf(" 六月:\n"); printf("\n"); break;
case 7:printf(" 七月:\n"); printf("\n"); break;
case 8:printf(" 八月:\n"); printf("\n"); break;
case 9:printf(" 九月:\n"); printf("\n"); break;
case 10:printf(" 十月:\n"); printf("\n"); break;
case 11:printf(" 十一月:\n"); printf("\n"); break;
case 12:printf(" 十二月:\n"); printf("\n"); break;
default:printf("Error!");
}
}
int leap_year(int year)//判断闰年
{
int i;
if(year%4 == 0 && year%100 != 0)
{i=366;}
else if(year%1000 == 0 && year%400 == 0)
{i=366;}
else
{i=365;}
return i;//单一出口原则
}
##后记
课程设计是检验C语言学习的一个炼金石,也同样是整合所学知识的一次训练,课程设计的过程中,有无数道Bug等着你,无论是语法上的还是逻辑上的,在这个过程中是很锻炼人的耐心的,只有将他们一一降伏,你才会发现走过的路也不过如此,通过一个课程设计,可以说你已经就此简单入门,但是C语言学习的路还很长,还需继续努力。