C语言课程设计报告-----万年历设计人:贾伟涛学号:2013010901班级:13电信应电班指导老师:张伟日期:2014年6月11日内容提要(这个你最好自己写)通过大一下学期对C语言的学习,了解到了很多C语言的相关知识。学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对c语言的兴趣。C语言是近年在国内外得到迅速推广应用的一种机器语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。在这次的课程设计中我将把日常生活中最经常接触的——日历的查询,利用C语言的程序编成一个简单的万年历查询系统。通过这个小小的系统可以实现很多功能。在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的C语言课程设计的具体内容来了,大家拭目以待吧!目录一、系统功能和数据说明-----------------------二、问题分析---------------------------------三、程序总体设计及功能结构框图---------------四、程序流程图-------------------------------五、源程序代码-------------------------------六、使用说明---------------------------------七、个人心得---------------------------------八、参考文献---------------------------------一、系统功能和数据说明(一)功能简介在日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简单明了的给我们最想要的日期信息。在我的万年历系统当中,就是将日历,月历做的简单明了,很方便我们的查询使用。下面是它要实现的一些基本功能:C语言编写万年历查询系统:(1)输入年份,判断是否为闰年(2)输入年月日,判断是星期几(3)输入年份,打印出12个月的月历(4)输入年月,打印出本月的日历(5)输入指令错误的提示(二)程序中的数据说明①unsignedintrun[12]={31,29,31,30,31,30,31,31,30,31,30,31};unsignedintping[12]={31,28,31,30,31,30,31,31,30,31,30,31};;这是定义的关于每个月天数的数组,根据大小月以及二月份的特殊情况将每个月的天数变为数组中的元素存入数组当中。其中run[1]=29,是将闰年二月的天数28天作为初始元素存入。另一个ping[1]=28,是将平年二月的天数28天作为初始元素存入。②charmonth_str[][10]={一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月};这个数组是定义12个月份的数组。二、问题分析对于闰年的判断,能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。日期的查询,就是直接打印改天所在月份的月历。程序难点在于判断星期,但根据公式,我们可以很容易地用年月日推断出星期:c=days+day;w=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+c)%7;//求星期公式其中year:要查询的年份day:从该年的一月一日起到该天的天数w:得出的星期数。在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过一定长度输出日期,在遇到某天时星期天时,就换行输出,因此可以按照月历的格式输出。判断日期是否合法,if((nian6000)||(nian==0)||(yue12)||(yue==0)||(ri31)||(ri==0)){printf(输入错误,请重新输入\n);gotozailai;}可以先判断年月日是否有小于0的值,月和日是否有超出最大值12和31,如果通过此判断合法,再判断是否是闰年,如果是闰年,则判断二月份是否满足要求,闰年二月份不能超过29天,平年二月份不能超过28天。在查询过程中,如果发现输入不合法或者不满足输入要求,则提示错误,并返回主菜单。三、程序总体设计及功能结构框图(一)功能结构框图主菜单闰年判断输出年历输出月历星期查询(二)程序设计头文件:#includestdio.h//基本输入输出函数#includestdlib.h//调用清屏函数#includewindows.h//调用延时函数在程序中运用了大量的自定义函数,都涉及为了使程序更简介明了。其中有:intmenu()//选择菜单voidnian_yue()//输入年月函数voidin_nian()//只输入年函数void_in()//年,月,日输入,范围判别int_nian2(intyear)//判断是否为闰年intyue_day(intyear,intmonth)//计算某年某月有多少天函数intxingqi_(intyear,intmonth,intday)//判断某年某月某日是星期几的函数void_4(intyear,intmonth)//第四功能:显示某月的月历int_3(intyear)//第三功能:显示某年的月历void_2()//第二功能:计算某年是否为闰年void_1()//第一功能:计算某年某月某日是星期几这些函数的定义及其相应的内部程序共同构筑起了这个万年历查询系统的总程序。其中int_nian2函数是用来判断输入的年份是否为闰年,实现了预计功能的第一个方面;intxingqi函数则是为了实现判断星期而编写的;void_4函数则是为了实现单个月的月历而编写的,int_3函数则是为了实现某年的月历而编写的。四、程序流程图(一)总流程图(二)算法说明1.总天数的算法:int_nian2函数的使用,判断出了输入年份是否为闰年的信息。判断一年是否为闰年的方法是:该年分而能被4整除但不能被100整除,或者是能被400整除。开始计算是否为闰年计算星期数按键1?按键3和44输出星期数输出是否为闰年计算编辑接收到的数据输出具体年历和月历按键1?是是是是计算是否为闰年计算星期数按键2?是是是计算星期数计算是否为闰年是是是是结束退出判断是否为闰年的流程图:2.输入日期计算星期几:利用intxingqi_函数可以判断出星期,然后对于输入的日期可以通过公式c=days+day;w=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+c)%7计算就可以输出相应的星期数。/*判断某年某月某日是星期几的函数,返回星期对应的数字,如返回对应星期天*/intxingqi_(intyear,intmonth,intday){intc,i,days=0,t,w;for(i=1;imonth;i++)//月份循环{t=yue_day(year,i);//调用求某年某月有多少天函数days+=t;}c=days+day;w=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+c)%7;//求星期公式returnw;}3.对输入信息的汇总:void_4(intyear,intmonth)//打印某年某月的月历,int_3(intyear)//打印某年的月历。/*--------------第四功能:显示某月的月历--------*/void_4(intyear,intmonth){inti,temp,k;temp=xingqi_(year,month,1);//调用判断某年某月某日是星期几的函数printf(\n%d--%d\n,year,month);printf(\n0123456\n);printf(\nSMTWTFS\n);/*以下是月历排版*/for(i=1;i=temp;i++)printf();for(k=1;k=yue_day(year,month);k++,i++){printf(%-2d,k);if(i%7==0)printf(\n);}}/*--------------第三功能:显示某年的月历--------*/int_3(intyear){inttemp;inti,j,k;printf(\n\n%d年\n,year);for(i=1;i=12;i++){printf(\n\n%s(%d)\n,month_str[i-1],i);printf(0123456\n);printf(SMTWTFS\n\n);temp=xingqi_(year,i,1);//调用判断某年某月某日是星期几的函数/*以下是月历排版*/for(j=1;j=temp;j++)printf();for(k=1;k=yue_day(year,i);j++,k++){printf(%-2d,k);if(j%7==0)printf(\n);}}}五、源程序代码#includestdio.h//基本输入输出函数#includestdlib.h//调用清屏函数#includewindows.h//调用延时函数unsignedintnian,yue,ri;//全局变量unsignedintrun[12]={31,29,31,30,31,30,31,31,30,31,30,31};unsignedintping[12]={31,28,31,30,31,30,31,31,30,31,30,31};charmonth_str[][10]={一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月};/*---------------选择菜单--------*/intmenu(){inta;printf(\n\n----------------万年历系统----------------\n\n\n);printf(1.计算某年某月某日是星期几\n);printf(2.计算某年是否为闰年\n);printf(3.显示某年的月历\n);printf(4.显示某月的日历\n);printf(5.退出系统\n\n);printf(请输入相应的数字,并回车请输入);scanf(%d,&a);printf(您输入的是%d\n,a);printf(请稍后,正在执行...);Sleep(1000);//延时秒system(cls);//清屏return(a);//返回值}/*------------------输入年月函数------------------*/voidnian_yue(){printf(请输入要显示的年,月并以逗号隔开\n);printf(\n例如:\n);printf(要显示2014年月则输入:2014,6回车\n);printf(请输入);scanf(%d,%d,&nian,&yue);}/*-----------------只输入年函数-----------------*/voidin_nian(){printf(请输入年份,并回车\n);printf(请输入);scanf(%d,&nian);}/*----------------年,月,日输入,范围判别--------*/void_in(){zailai://跳转标志printf(请输入要计算的年份,输入的年,月,日请以逗号隔开\n);printf(\n例如:\n);printf(要计算年月日输入格式为:2014,6,11回车\n\n);printf(请输入:);scanf(%d,%d,%d,&nian,&yue,&ri);if((nian6000)||(nian==0)||(yue12)||(yue==0)||(ri31