1、C 语言课程设计一、题目及功能描述题目:万年历的设计利用 C 语言设计出万年历,使其实现如下要求1、输入一个年份,在屏幕上输出该年的年历(包括每月的天数和所对应的星期几) ,并且在每月的左上角或右上角打印出相应的年份和月份,要求输出界面尽可能整齐、美观,符合年历显示规范。假定输入的年份在 1-9999 年之间。2、输入年月,输出该月的月历。3、输入年月日,输出距今天还有多少天,是星期几,是否是公历节日。:4、指定键盘的某些键,用于控制变换不同年、月、日的显示。即:当前若正在显示 2011 年的年历,按下键盘“”方向键后,年历变为 2010 年的。二、使用的所有变量的说明变量说明:(以下均为整型
2、变量)year 表示年份的变量month 表示月份的变量day 表示日期的变量select 表示菜单选择的变量i 表示月份的变量j 表示一个月中的某一天的变量sum 判断某天是一年中的第几天的变量number 判断某天离公元 1 年 1 月 1 日还有几天的变量a 表示每月天数的数组变量year1 系统时间年份的变量month1 系统时间月份的变量day1 系统时间日期的变量三、程序清单及其说明#include “time.h“ /*包含的头文件*/#include “stdio.h“#include “math.h“#include “windows.h“#include “conio.h“
3、#define KEYNUMUp 0x48 /*宏定义*/#define KEYNUMDown 0x50 #define KEYNUMLeft 0x4b #define KEYNUMRight 0x4d#define KEYNUMPageUp 0x49 #define KEYNUMPageDown 0x51 int eachyeartotal(int year,int month,int day); /*函数声明*/int counterdays(int year,int month,int day);int nowtime(int year,int month,int day);int we
4、ek(int year,int month,int day);int maxDay(int year,int month);int isleap(int year);void whatweek(int year,int month,int day);void display(int year ,int month);void display2(int year,int month);void display3(int year,int month,int day) ;void setDay1(int year,int month,int day);void setDay2(int year,i
5、nt month,int day);void setDay3(int year,int month,int day);void jieri(int month,int day);void display1(int year);void getmenu();void main() /*主函数*/int year,month,day,select; while(1)getmenu();printf(“ 请输入相应数字:“); /*菜单选择 */scanf(“%d“,system(“cls“);switch(select)case 1: /*当选择为 1 时显示年历*/printf(“ 年历显示:输
6、入年(如 2011):“);scanf(“%d“,if(year0month1=(1+p-tm_mon) ;day1=(p-tm_mday); /*获取系统时间year1、 month1、day1 分别为年、月、日*/days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+eachyeartotal(year1,month1,day1);days=days0-d
7、ays1; /*计算出两个日期之间的时间差 */printf(“n 今天距%d 年%d 月%d 日还有%d 天nn“,year,month,day,days);return days;void whatweek(int year,int month,int day) /*判断是星期几*/ int number;number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);number=number%7 ;switch( number)case 0:printf( “n %d 年%d 月%d
8、日是星期日“,year,month,day);break;case 1:printf( “n %d 年%d 月%d 日是星期一“,year,month,day);break;case 2:printf( “n %d 年%d 月%d 日是星期二“,year,month,day);break;case 3:printf( “n %d 年%d 月%d 日是星期三“,year,month,day);break;case 4:printf( “n %d 年%d 月%d 日是星期四“,year,month,day);break;case 5:printf( “n %d 年%d 月%d 日是星期五“,yea
9、r,month,day);break;case 6:printf( “n %d 年%d 月%d 日是星期六“,year,month,day);break;default:system(“cls“);printf(“ 出现错误!n“ );void jieri(int month,int day) /*判断是否公历节日*/if(month=1)switch(day)case 1:printf(“,这天是元旦“); if(month=2)switch(day)case 14:printf(“,这天是情人节“);if(month=3)switch(day)case 8:printf(“,这天是妇女节“
10、);break;case 12:printf(“,这天是植树节“);if(month=4)switch(day)case 1:printf(“,这天是愚人节“); if(month=5)switch(day) case 1:printf(“,这天是劳动节“);break;case 4:printf(“,这天是青年节“);if(month=6)switch(day)case 1:printf(“,这天是儿童节“);if(month=7)switch(day) case 1:printf(“,这天是建党节“);if(month=8)switch(day) case 1:printf(“,这天是建军
11、节“);if(month=9)switch(day) case 10:printf(“,这天是教师节“);if(month=10)switch(day) case 1:printf(“,这天是国庆节“);void setDay1(int year,int month,int day) /*通过键盘“” “”控制年历的变换*/ char k;getch();k=getch();switch(k) case KEYNUMUp: /*“”年份减小*/if(year11)month-=12;year+;if(yearmaxDay(year,month)day=1;month+;if(month12)m
12、onth-=12;year+;if(year10000);display3(year , month,day);setDay3(year,month,day);break;default:system(“cls“);void getmenu() /* 显示菜单选择 */printf(“ *主菜单*nn“);printf(“ * 欢迎进入万年历系统 *nn“);printf(“ * 1、年历显示 *nn“);printf(“ * 2、月历查询 *nn“);printf(“ * 3、日期查询 *nn“);printf(“ * 4、退出系统 *nn“);printf(“ *nn“);四、运行结果清单
13、打开软件,进入如下菜单界面,输入数字进行选择1 年历的显示(1)输入数字 1 进入年历的显示(2)输入年份 2011,显示 2011 年的年历如下(3)按键盘显示上一年(2010 年)的年历,显示如下(4)按键盘显示上一年(2012 年)的年历,显示如下2、月历的显示(1)在菜单中选择 2,进入月历的显示,输入 2011,6,显示 2011 年 6 月份的月历,显示效果如下(2)按键盘显示上一个月(5 月)的月历,显示效果如下(3)按键盘显示上上个月(7 月)的月历,显示效果如下3、日历的显示(1)输入选择 3 进入日历的显示,如图输入 2011,10,1 显示这天的星期,是否为公历节日,距离
14、现在还有多少天(2)按 PagDown 显示前一天的日历,显示如下(3)按 PagUp 显示后一天的日历,显示如下4 退出程序输入选择 4,显示如下界面,按任意键退出程序五、总结和体会。本次用 C 语言编写的万年历系统主要实现了年历、月历、日历的显示,并且可通过键盘来变换相应的年月日,最终的设计结果达到的这些要求,是一次成功的课程设计。在设计初期,首先温习了课本内容,再次熟熟悉了 C 程序,然后广泛的查找有关万年历的资料,并结合查找到的资料,整理出设计的主要思路,画出流程图,最终写出了源程序,并编译成功,在实验中,碰到了不少问题,其中包括如何获取系统时间,如何计算任意时间的时间差,这些困难,都通过查阅资料和问同学得到了解决。当然,由于时间和能力的原因,选作部分农历的显示没有实现。通过这次课程设计,使我对 C 语言了解不在停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。附:参考文件1 谭浩强. C 程序设计(第三版).北京:清华大学出版社.20052 谭浩强. C 程序设计题解与上机指导(第三版).北京:清华大学出版社.20053 徐慧 林锐 C 语言实例解析精粹 .武汉:华中理工大学出版社.19964 戴建鹏译 C 语言大全(第三版) .北京:电子工业大学出版社.1994