C语言程序设计万年历_第1页
C语言程序设计万年历_第2页
C语言程序设计万年历_第3页
C语言程序设计万年历_第4页
C语言程序设计万年历_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、综合性程序设计报告设计题目: 万年历 指导教师: 班 级: 学 号: _ 设 计 者: 成 绩: 设计时间: 2012年 6 月 8 日题目描述用于利用计算机实现万年历功能,包括日期对星期的转换,根据指定日期对n天后是什么日期的计算。和显示当前日期,纪念日提醒等功能。主要功能:1. 日期推算2. 日期显示3. 纪念日提醒功能模块分解及说明根据题目要求,可以用结构体实现,这个系统可以分为:年历显示、月历查询、日期查询和日期推算四个部分。其中在日期查询中包括纪念日提醒。(1) 主函数main()主函数利用while(1)循环使得执行完每个部分之后还能回到主菜单,并利用switch函数当输入不同的值

2、时调用不同的模块。主函数如下:void main() /*主函数*/ int year,month,day,select; while(1) dushijian(); printf(n); getmenu(); printf( 请输入相应数字:); /*菜单选择 */ scanf(%d,&select); system(cls); switch(select) case 1: /*当选择为1时显示年历*/ printf( 年历显示:输入年(如2011):); scanf(%d,&year); if(year0&year0&year=1&month0&year=1&month=1&day=max

3、day(year,month) display3(year,month,day); printf( 提示 按pageup:前一天 按pagedown:后一天 按其他键:返回菜单nn); setday3( year,month, day); else system(cls); printf( 输入无效,重新输入!n); break; case 4: /*当选择4时为日期推算*/ riqituisuan(); break; case 5: exit(0); default: /*当输入其他数字时,输入无效,重新输入*/ system(cls); printf( 输入无效,重新输入!n); (2)

4、年历显示 用来显示某一年的日历。void display1(int year) /*输出年历*/ int i; printf(n); for(i=1;i=12;i+) printf(%d 年 %d 月nn ,year,i); display(year,i); void display(int year ,int month) /*输出年月*/ int max,number,i,j=1; max=maxday(year,month); number=week(year,month,1); printf( %4s %4s %4s %4s %4s %4s %4sn,sun,mon,tue,wed,

5、thu,fri,sat); for(i=0;inumber;i+) printf( ); /*1号前的星期补空格*/ while(j=max) printf(%6d,j); if (i%7=6) printf(n); /* 每7格换一行*/ i+; j+; printf(nn);(3) 输出月历 void display2(int year,int month) /*输出月历*/ printf(n%d 年 %d 月n ,year,month); display(year,month); void display(int year ,int month) /*输出年月*/ int max,num

6、ber,i,j=1; max=maxday(year,month); number=week(year,month,1); printf( %4s %4s %4s %4s %4s %4s %4sn,sun,mon,tue,wed, thu,fri,sat); for(i=0;inumber;i+) printf( ); /*1号前的星期补空格*/ while(jtm_year) ; month1=(1+p-tm_mon) ; day1=(p-tm_mday); /*获取系统时间year1、month1、day1分别为年、月、日*/ days0=(year-1)*365+(year-1)/4-(

7、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-days1; /*计算出两个日期之间的时间差*/ printf(n 今天距%d年%d月%d日还有%d天nn,year,month,day,days); return days; void whatweek(int year,int month,int day) /*判断是星期几

8、*/ 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日是星期日,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; ca

9、se 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日是星期五,year,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) /*判断是否公历节日*/

10、 if(month=1) switch(day) case 1: printf(,这天是元旦); if(month=2) switch(day) case 14: printf(,这天是情人节); if(month=3) switch(day) case 8: printf(,这天是妇女节); break; case 12: printf(,这天是植树节); if(month=4) switch(day) case 1: printf(,这天是愚人节); if(month=5) switch(day) case 1: printf(,这天是劳动节); break; case 4: printf

11、(,这天是青年节); if(month=6) switch(day) case 1: printf(,这天是儿童节); if(month=7) switch(day) case 1: printf(,这天是建党节); if(month=8) switch(day) case 1: printf(,这天是建军节); if(month=9) switch(day) case 10: printf(,这天是教师节); if(month=10) switch(day) case 1: printf(,这天是国庆节); (5) 日期推算 if (info/10000000)0) xyear = info

12、/10000;xmonth = (info - xyear*10000)/100;xday = info - xyear*10000 - xmonth*100;printf(您要查询的是%d年%d月%d日。n,xyear, xmonth, xday);counter = getwday(xyear,xmonth,xday);printf(%d年%d月%d日是星期,xyear, xmonth, xday);if (counter = 0)counter = 7;printf(%dn, counter);day_differ = the_day(xyear,xmonth,xday);printf(

13、距离今天相差%d天n,day_differ);int the_day(int year,int month,int day) /*判断要查询的日期据今天的时间*/int year,month,day,flag,i,q;long sum=0;struct tm *gmt=getday();year = gmt-tm_year+1900; /*系统当前年*/month = gmt-tm_mon+1; /*系统的当前月份*/day = gmt-tm_mday; /*系统当前天*/if(year!=year)if(yearyear)q=year;year=year;year=q;q=month;mon

14、th=month;month=month;q=day;day=day;day=day;for(i=year;iyear;i+)flag = checkyear(i);if(flag=1)sum=sum+366;elsesum=sum+365;flag = checkyear(year);for(i=1;i=1;i-)sum=sum+daysofmonthflagi-1;sum = sum+day;else if(year=year)flag = checkyear(year);if(month!=month)if(monthmonth)q=month;month=month;month=q;q

15、=day;day=day;day=day;for(i=month+1;i=month;i+)sum=sum+daysofmonthflagi-1;sum=sum+daysofmonthflagmonth-1-day;sum = sum+day;else if(month=month)sum = day - day;if(sum0)sum = -sum;return sum;struct tm* getday() /*从系统取得当前时间*/time_t timer;struct tm* gmt;time(&timer);gmt=localtime(&timer);return gmt;int c

16、heckyear(int year) /*判断是否是闰年*/int flag=0;if(year%400=0|(year%4=0&year%100!=0)flag=1;return flag;int getwday(int year,int month,int day)/*取得某年某月某日是星期几*/int nday=0, nday, i, w;for (i=0;imonth-1;i+)nday+=daysofmonthcheckyear(year)i;nday+=day;nday=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;w=nday%

17、7;return w; /*返回星期几*/(6)菜单显示 void getmenu() /* 显示菜单选择*/ printf( *主菜单*nn); printf( * 欢迎进入万年历系统 *nn); printf( * 1、年历显示 *nn); printf( * 2、月历查询 *nn); printf( * 3、日期查询 *nn); printf( * 4、日期推算 *nn);printf( * 5、退出系统 *nn); printf( *nn);(7) 通过“”“”“”“”和“pgup”“pgdn” 控制年历,月历以及日期的翻页。 void setday1(int year,int mon

18、th,int day) /*通过键盘控制年历的变换*/ char k; getch(); k=getch(); switch(k) case keynumup: /*年份减小*/ if(year2) system(cls); printf( 警告!超出范围!n); break; year-; display1(year); setday1(year,month,day); break; case keynumdown: /*年份变大*/ year+; display1(year); setday1(year,month,day); break; default: system(cls); vo

19、id setday2(int year,int month,int day) /*通过键盘控制月历的变换*/ char k; getch(); k=getch(); switch(k) case keynumleft: /*月份变小*/ if(month2) month+=12; year-; if(year11) month-=12; year+; if(year9999) month+; display2(year , month); setday2(year,month,day); break; default: system(cls); ; void setday3(int year,

20、int month,int day) /*通过键盘pageuppagedown控制日期的变换*/ char k; getch(); k=getch(); switch(k) case keynumpageup: /*pageup日期变小*/ if(day2) month-; day=maxday(year,month); if(month1) month+=12; year-; if(yearmaxday(year,month) day=1; month+; if(month12) month-=12; year+; if(year0&year0&year=1&month0&year=1&mo

21、nth=1&day=maxday(year,month) display3(year,month,day); printf( 提示 按pageup:前一天 按pagedown:后一天 按其他键:返回菜单nn); setday3( year,month, day); else system(cls); printf( 输入无效,重新输入!n); break; case 4: /*当选择4时为日期推算*/ riqituisuan(); break; case 5: exit(0); default: /*当输入其他数字时,输入无效,重新输入*/ system(cls); printf( 输入无效,

22、重新输入!n); int isleap(int year) /*判断是否为闰年*/ if(year%4=0&year%100!=0|year%400=0) return 1; else return 0; int maxday(int year,int month) /*每月的天数*/ int a=31,28,31,30,31,30,31,31,30,31,30,31; /*每个月中的天数*/ if(isleap( year) a1=29; /*闰年2月份有29天*/ return amonth-1; int eachyeartotal(int year,int month,int day) /*判断某天是一年中的第几天*/ int i,sum=0; for(i=1;imonth;i+) sum+=maxday(year,i); sum+=day; return sum; int week(int year,int month,int day) /*对天数进行判断确定是星期几*/ int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400 +eachyeartotal(year,month,day); number=number%7 ; return number;void display(int year

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论