1、C 语 言 课 程 设 计 报 告-万 年 历设计人:贾伟涛学号:2013010912班级:13 电信应电班指导老师:张伟日期:2014 年 6 月 9 日内 容 提 要通过大一下学期对 C 语言的学习,了解到了很多 C 语言的相关知识。学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对 c 语言的兴趣。C 语言是近年在国内外得到迅速推广应用的一种机器语言。C 语言功能丰
2、富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C 语言特别适合于编写各种软件。在这次的课程设计中我将把日常生活中最经常接触的日历的查询,利用 C 语言的程序编成一个简单的万年历查询系统。通过这个小小的系统可以实现很多功能。在程序中你能看到很多熟悉的 C 语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的 C 语言课程设计的具体内容来了,大家拭目以待吧!目 录一、 系统功能和数据说明-二、 问题分析-三、 程序总体设计及功能结构框图-四、 程序流程图-五、 源程
3、序代码-六、使用说明-七、个人心得-八、参考文献-一、系统功能和数据说明(一)功能简介在日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简单明了的给我们最想要的日期信息。在我的万年历系统当中,就是将日历,月历做的简单明了,很方便我们的查询使用。下面是它要实现的一些基本功能:C 语言编写万年历查询系统:(1)输入年份,判断是否为闰年(2)输入年月日,判断是星期几(3)输入年份,打印出 12 个月的月历(4)输入年月,打印出本月的日历另新增:(1)对输入指令错误的提示(2)加入了调用系统时间函数(3)还添加了欢迎界面并进行界面优化(二)程序中的数据说明int days12 = 31,
4、 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;这是定义的关于每个月天数的数组,根据大小月以及二月份的特殊情况将每个月的天数变为数组中的元素存入数组当中。其中 days1=28,是将闰年二月的天数 28 天作为初始元素存入。在经过 yearMonth 函数后就可以给 days1中存入正确的月天数。 tm *tp;char *week=“一“,“二“,“三“,“四“,“五“,“六“,“日“; 这两组数据设计都利用了指针定义,利用指针可以提高程序的可读性,可以更方便使用。这两个数组的作用是用于调用系统时间,而定义的星期数组*week和年月日变量*tp,由于还
5、没学到指针,在这里查阅了很多资料,并也借鉴了前辈们的很多程序。二、问题分析对于闰年的判断,能被 4 整除但不能被 100 整除,或者能被 400 整除的年份为闰年,否则为平年。日期的查询,就是直接打印改天所在月份的月历。程序难点在于判断星期,但根据公式,我们可以很容易地用年月日推断出星期:weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;其中 year:要查询的年份day:从该年的一月一日起到该天的天数weekday:得出的星期数。在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过一定长度输出
6、日期,在遇到某天时星期天时,就换行输出,因此可以按照月历的格式输出。对于初始输入当前系统时间,可以通过中的 time 和 localtime 函数取出系统时间进行初始化。判断日期是否合法,if(year=3000|year=12|month=31|day/标准输入输出函数#include/清屏函数 system()#include/延时函数 Sleep()#include /调用系统时间函数 time()在程序中运用了大量的自定义函数,都涉及为了使程序更简介明了。其中有:int isLeapYear(int year)/判断是否为闰年void hy()/欢迎信息; void Time() /获
7、取系统时间;int whichWeekday(int year, int month, int day)/判断某天为星期几; void yearMonth(int year, int month)/打印某年某月的月历;void monthDay(int year)/输入年份,打出个月历;void menu()/主菜单;void main()/主函数;这些函数的定义及其相应的内部程序共同构筑起了这个万年历查询系统的总程序。其中 isLeapYear 函数是用来判断输入的年份是否为闰年,实现了预计功能系统时间显示主菜单星期查询 输出年历 输出月历闰年判断欢迎使用的第一个方面;whichWeekda
8、y 函数则是为了实现判断星期而编写的;yearMonth 函数则是为了实现月历而编写的;Time()函数则是为调用系统时间而编写,该 Time()函数采用指针形式定义了*week数组和*tp 变量;yearMonth,monthDay 这两个函数的共同使用就能够完成输出年历的功能。四、程序流程图(一)总流程图开始计算是否为闰年 计算星期数按键 1? 按键 3 和 4输出是否为闰年输出星期数计算编辑接收到的数据输出具体年历和月历按键 5?是 是 开 始 计 算 是 否 为 闰 年 计 算 星 期 数 按 键 1? 按 键 2? 按 键 3? 输 出 是 否 为闰 年 输 出 星 期 数 计 算
9、编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 0?是 是 是 开 始 计 算 是 否 为 闰 年 计 算 星 期 数 按 键 1? 按 键 2? 按 键 3? 输 出 是 否 为闰 年 输 出 星 期 数 计 算 编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 0?是 是是 开 始 计 算 是 否 为 闰 年 计 算 星 期 数 按 键 1? 按 键 2? 按 键 3? 输 出 是 否 为闰 年 输 出 星 期 数 计 算 编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 0?是 是计算是否为闰年 计算星期数按键 2?是 是 开 始计 算 是 否 为 闰 年
10、 计 算 星 期 数按 键 ? 按 键 ? 按 键 ?输 出 是 否 为闰 年 输 出 星 期 数 计 算 编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 ?是 是 是 开 始计 算 是 否 为 闰 年 计 算 星 期 数按 键 ? 按 键 ? 按 键 ?输 出 是 否 为闰 年 输 出 星 期 数 计 算 编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 ?是 是计算是否为闰年 计算星期数是 开 始计 算 是 否 为 闰 年 计 算 星 期 数按 键 ? 按 键 ? 按 键 ?输 出 是 否 为闰 年 输 出 星 期 数 计 算 编 辑 接 收 到 的数 据输 出 具
11、体 月 历 按 键 ?是 是 是 开 始计 算 是 否 为 闰 年 计 算 星 期 数按 键 ? 按 键 ? 按 键 ?输 出 是 否 为闰 年 输 出 星 期 数 计 算 编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 ?是 是是 开 始计 算 是 否 为 闰 年 计 算 星 期 数按 键 ? 按 键 ? 按 键 ?输 出 是 否 为闰 年 输 出 星 期 数 计 算 编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 ?是 是 是 开 始计 算 是 否 为 闰 年 计 算 星 期 数按 键 ? 按 键 ? 按 键 ?输 出 是 否 为闰 年 输 出 星 期 数 计 算
12、编 辑 接 收 到 的数 据输 出 具 体 月 历 按 键 ?是 是结束 退出(二)算法说明1. 总天数的算法:isLeapYear 函数的使用,判断出了输入年份是否为闰年的信息。判断一年是否为闰年的方法是:该年分而能被 4 整除但不能被 100 整除,或者是能被 400 整除。判断是否为闰年的流程图:2.输入日期计算星期几:利用 whichWeekday 函数可以判断出星期,然后对于输入的日期可以通过公式weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7 计算就可以输出相应的星期数。int whichWeek
13、day(int year, int month, int day)/判断某天为星期几int weekday;if (month = 1 | month = 2)/公式中要把月和月换成是上一年的月和月 month += 12; year -= 1; weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7; /计算星期的公式return weekday+1;3. 对输入信息的汇总:void yearMonth(int year, int month)/打印某年某月的月历,void monthDay(int year)/
14、输入年份,打出个月历;通过这两个函数可以将输入数据的具体信息通过完整日历的形式表示出来。void yearMonth(int year, int month)/打印某年某月的月历int i,j=0;int weekday; /计算这个月第一天是星期几weekday = whichWeekday(year, month, 1);printf(“n %d 年%d 月n“,year,month);printf(“ -n“);printf(“ 星期一星期二星期三星期四星期五星期六星期天n“);if(isLeapYear(year) printf(“ “);for(i = 1; i /标准输入输出函数#
15、include/清屏函数 system()#include/延时函数 Sleep()#include /调用系统时间函数 time()int days12=31,28,31,30,31,30,31,31,30,31,30,31;/每月的天数,闰年二月要加int isLeapYear(int year)/判断是否为闰年if(year%4 = 0 else return 0;void hy()/欢迎信息printf(“n 欢迎使用万年历查询系统nn“); Sleep(700);/延时毫秒printf(“ 祝您每天好心情!nnn“); Sleep(1000);printf(“ 版本:v2.0nnn“
16、);Sleep(1000);printf(“ 正在进入功能菜单,请稍候n“);Sleep(5000);/延时秒void Time() /获取系统时间 time_t t;struct tm *tp;static char *week=“一“,“二“,“三“,“四“,“五“,“六“,“日“;t=time(NULL);tp=localtime(printf(“t n“);printf(“tt 系统时间日期:%d 年%d 月%d 日“,tp-tm_year+1900,tp-tm_mon+1,tp-tm_mday); printf(“ %d:%d:%d “,tp-tm_hour,tp-tm_min,tp
17、-tm_sec);printf(“星期%sn“,week(tp-tm_wday)-1);printf(“t n“);int whichWeekday(int year, int month, int day)/判断某天为星期几int weekday;if (month = 1 | month = 2)/公式中要把月和月换成是上一年的月和月 month += 12; year -= 1; weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7; /计算星期的公式return weekday+1;void yearMo
18、nth(int year, int month)/打印某年某月的月历int i,j=0;int weekday; /计算这个月第一天是星期几weekday = whichWeekday(year, month, 1);printf(“n %d 年%d 月n“,year,month);printf(“ -n“);printf(“ 星期一星期二星期三星期四星期五星期六星期天n“);if(isLeapYear(year) printf(“ “);for(i = 1; i =3000|year=3000|year=12|month=31|day=3000|year=3000|year=12|month
19、0)system(“CLS“);printf(“ 输入错误,系统及即将返回!“);Sleep(3000);goto tz;yearMonth(year,month);if(isLeapYear(year) printf(“提示:n 如继续运行请按n 如回首菜单请按n 如退出请按n 请选择:“);ch=getch();if(ch=1)goto t4;if(ch=2)goto tz;if(ch=0)exit(0);break;case 5:printf(“n 是否确定退出?n“);printf(“ 确定请按,取消请按“);ch=getch();if(ch = 2)goto tz;elseprint
20、f(“ “);exit(0);/退出break;default:system(“CLS“);printf(“ 您的输入的指令有误,请重新输入!nn“);printf(“提示:n 如回首菜单请按n 如退出请按n 请选择:“);ch=getch();if(ch=1)goto tz;if(ch=0)exit(0);break;六、使用说明运行程序,首先进入欢迎界面,等待 3 秒后,进入主菜单界面,可看到以下界面系统时间日期:2014 年 6 月 10 日 16:55:14 星期二-万年历查询系统* 1、输入年份,判断是否为闰年 * 2、输入年月日,判断该日为星期几 * 3、输入年份,打出 12 个月
21、历 * 4、输入月份,打出该月的日历 * 5、退出 *请输入对应操作:1、在“请输入对应操作:”后面输入功能序号,如需“输入年份,判断是否为闰年” ,请输入“1”,其他功能雷同。2、进入附属界面后会出现以下界面:请输入年份,确定按回车 (格式:2014):3、可在“请输入年份,确定按回车 (格式:2014):”语句后输入年份”2014” ,会出现下面界面:请输入年份,确定按回车 (格式:2014):20142014 年不是闰年。提示:如继续运行请按 1如回首菜单请按 2如退出请按 0请选择:4、可在“请选择:”后面填写序号,即可得到相应的提示功能。5、 其他功能做法于上相同,就不一一赘述。七、个人心得(略)八、参考文献1谭浩强。C 程序设计(第四版).北京:清华大学出版社,20102杜 恒。C 程序程序设计(理实一体化教程).北京:机械工业出版社,20133部分资料来源网络,作者不详。在这里对他们表示由衷的感谢