




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计课程综合案例 常州信息职业技术学院难易程度中等开发语言C开发工具操作系统:Windows XP或更高开发平台:VC+ 6.0关键字万年历C语言程序设计课程综合案例案例06 万年历6.1需求分析本系统提供给用户一个万年历查询平台,用来查询1900-2050年任何一个月的月历。在使用本系统的过程中,用户除了可以查看到公历数据外,还可以查看相应的农历数据。要查询的年份和月份可以从键盘直接输入,另外还可以输入1和2来增加和减少年份,输入3和4来增加和减少月份。6.1.1 功能概述如图6-1所示,系统主要功能有:1. 显示当前日期和时间,以及星期信息。2. 显示要查询的某年某月的月历,包括
2、公历数据以及其相应的农历数据,如:天干地支、生肖、节气等。3. 要查询的年份和月份可以从键盘直接输入,也可以通过输入“1-4”四个数字键来增加减少年份和月份的方法查询。6.1.2 系统运行环境一、硬件环境l 处理器:Intel Pentium 166 MX或更高l 内存:32MBl 硬盘空间:1GBl 显卡:SVGA显示适配器二、软件环境l 操作系统:Windows 98/ME/2000/XP6.1.3 功能需求描述万年历查询平台为用户提供简单方便的日期查询功能,给出完整清晰的日期信息。本系统需要实现的基本功能如下:1. 取得系统当前时间:取得系统当前的日期、时间及星期信息。2. 判断某年是否
3、为闰年。3. 得到阳历某月的天数以及某年的总天数等信息。4. 判断某年月日为星期几。5. 得到某个具体日期的农历数据,包括农历日期、天干地支、节气等信息。图6-1 万年历界面6.2总体设计6.2.1系统流程描述系统的流程描述如图6-2所示。6.2.2功能模块设计根据功能需求描述,定义如下函数:void TIME():取得系统当前时间;int leap(int year):返回阳历某年的天数,闰年返回366天,平年返回365天;int day(int month):返回阳历当月的天数;int get_solar_total(int solar_year, int solar_month):返回1
4、900年01月01日到M年M月的天数;int get_week(int solar_year, int solar_month):返回M年M月的1号为星期几;int get_lunar_info(int solar_year, int solar_month, Lunar_info *l_info,Chinese_era *china_era):返回农历信息;int out_chinese(Lunar_info *l_info,char *chinese_str):输出农历日期信息;void sub_menue():界面输出。开始结束图6-2 系统流程图1:计算上一年份2:计算下一年份计算阳历
5、信息计算农历信息输入年份输入1-2输入3-4输入5输入月份界面输出1:计算上一月份2:计算下一月份6.2.3数据结构设计一、农历信息数据结构typedef struct int lunar_year; /农历年份int lunar_month; /农历月份int lunar_day; /农历日期int current_mday; /本月天数int leap_month; /本年闰月int leap_flag; /闰月标记Lunar_info;二、公历信息数据结构typedef structint era_year; /阳历年份int era_month; /阳历月份int era_day; /
6、阳历日期Chinese_era; 三、数组用来定义相关的农历信息,如天干地支、节气、生肖、农历日和月等数据。1. 1900-2050年的农历数据int lunar_info=0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b
7、60,0x09570,0x052f2,0x04970,0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,0x0aea6,0x0ab50,0x04b60,0x0aae4,0
8、x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,0x0c960,0x0d9
9、54,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0
10、x0dd45,0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,0x14b63;数据格式说明:数组中的每一个数字都是一个由5位十六进制数组成的数字, 例:04bd8。第0位表示当年有无闰月, 有的话为闰月的月份,没有的话,为0;第1、2、3位转换成二进制共12位,如:0100 1011 1101表示一年中的12个月分别有多少天(1为30天,0为29天);第4位表示闰月是大月还是小月,仅当存在闰月的情况下有意义。例如:1980年的数据是: 0x095b0其二进制为:0000 1001 0
11、101 1011 0000 表示1980年没有闰月,从1月到12月的天数依次为:30、29、29、30、29、30、29、30、30、29、30、30。2.天干、地支、生肖、节气等/*天干*/char Gan103="甲","乙","丙","丁","戊","己","庚","辛","壬","癸"/*地支*/char Zhi123="子","丑","寅
12、","卯","辰","巳","午","未","申","酉","戌","亥"/*生肖*/char Animals123="鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","
13、狗","猪"/*24节气*/char solar_term245= "小寒","大寒","立春","雨水","惊蛰","春分", "清明","谷雨","立夏","小满","芒种","夏至", "小暑","大暑","立秋","处暑","白露&
14、quot;,"秋分", "寒露","霜降","立冬","小雪","大雪","冬至"/*农历日*/char chinese_day305= "初一","初二","初三","初四","初五","初六","初七", "初八","初九","初十","十一&q
15、uot;,"十二","十三","十四", "十五","十六","十七","十八","十九","廿十","廿一", "廿二","廿三","廿四","廿五","廿六","廿七","廿八", "廿九","卅十"char bui
16、ld45="光绪","宣统","民国","建国"/*农历月*/char chinese_month125="正","二","三","四","五","六","七","八","九","十","冬","腊"6.3详细设计6.3.1程序预处理头文件calendar.h包含上节所描述的所有
17、数据。具体清单如下:#include<stdio.h>#include<string.h>#include<stdlib.h> #include<conio.h>#include<math.h>#include<time.h>#define YUANDAN 1typedef struct int lunar_year; /农历年份int lunar_month; /农历月份int lunar_day; /农历日期int current_mday; /本月天数int leap_month; /本年闰月int leap_fla
18、g; /闰月标记Lunar_info;typedef structint era_year; /阳历年份int era_month; /阳历月份int era_day; /阳历日期Chinese_era; int s_year;int s_month;int s_day;static int t_year;static short today = YUANDAN;/*1900-2050年的农历数据*/int lunar_info=0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,0x0
19、4ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2
20、,0x0a950,0x0b557,0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x0
21、6a50,0x06d40,0x0af46,0x0ab60,0x09570,0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,0x07954,0x06aa0,0x0ad50
22、,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,0x14b63;/*天干*/char Gan103="甲","乙","丙","丁",&
23、quot;戊","己","庚","辛","壬","癸"/*地支*/char Zhi123="子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"/*生肖*/char Animals123="鼠&quo
24、t;,"牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"/*24节气*/char solar_term245= "小寒","大寒","立春","雨水","惊蛰","春分", "清明","谷雨&q
25、uot;,"立夏","小满","芒种","夏至", "小暑","大暑","立秋","处暑","白露","秋分", "寒露","霜降","立冬","小雪","大雪","冬至"/*农历日*/char chinese_day305= "初一","初二&qu
26、ot;,"初三","初四","初五","初六","初七", "初八","初九","初十","十一","十二","十三","十四", "十五","十六","十七","十八","十九","廿十","廿一", "廿二
27、","廿三","廿四","廿五","廿六","廿七","廿八", "廿九","卅十"char build45="光绪","宣统","民国","建国"/*农历月*/char chinese_month125="正","二","三","四","五",&q
28、uot;六","七","八","九","十","冬","腊"6.3.2计算所查询日期的公历数据主要功能有:取得系统的当前日期、时间和星期信息;判断某年是否闰年并返回当年的天数;返回1900年01月01日到M年M月的天数;返回M年M月的1号为星期几。代码清单如下:#include "calendar.h"/*函数功能:取得系统当前时间入口参数:无 出口:系统当前时间 调用方式:如TIME() 返回系统当前时间*/void TIME() static
29、 char *week="日","一","二","三","四","五","六"time_t t;struct tm *tp;t=time(NULL);tp=localtime(&t);printf("%d年%02d月%02d日",tp->tm_year+1900,tp->tm_mon+1,tp->tm_mday); printf(" %02d:%02d:%02d ",tp->tm_ho
30、ur,tp->tm_min,tp->tm_sec); printf("星期%st ",weektp->tm_wday);/*函数功能:延迟刷新时间入口参数: n:秒出口: 对应秒数 调用方式:如buffer(2) 返回2秒后执行下一操作*/void buffer(int n) time_t start,end;start=time(NULL); end=time(NULL); while(end-start<n) end=time(NULL);/*函数功能:返回阳历某年的天数,闰年返回366天,平年返回365天入口参数: year:公历年出口: 对应
31、天数 调用方式:如leap(2000) 返回366天*/int leap(int year) if(year%4=0&&year%100!=0|year%400=0) return 366; else return 365; /*函数功能描述:返回阳历当月的天数入口参数: month:公历月出口: 对应天数 调用方式:如day(1) 返回31天*/int day(int month) if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) return 31; if(month=4|month=6|month=
32、9|month=11) return 30; if(month=2&&leap(s_year)=366) return 29; else return 28; /*函数功能:返回1900年01月01日到M年M月的天数入口参数: s_year,s_month:年份和月份 出口:M年M月-1900-01-01 调用方式:如get_solar_total(2000,01) 返回36555天*/int get_solar_total(int solar_year, int solar_month) int total;int temp_num;total=0;for (temp_num
33、=1900;temp_num<solar_year;temp_num+)total+=leap(temp_num);for(temp_num=1;temp_num<solar_month;temp_num+)total+=day(temp_num);return total;/*函数功能:返回M年M月的1号为星期几,以1900.01.01为基准1为星期日入口参数: s_year,s_month:年份和月份 出口: M年M月的一号是星期几 调用方式:如get_week(2000,01) 返回星期六*/int get_week(int solar_year, int solar_mon
34、th) int week;int total;/* 1900.01.01为星期一*/week=2; total=get_solar_total(solar_year, solar_month);total%=7;week=week+total;week%=7;if (week=0)week=7;return week;6.3.3计算所查询日期的农历数据主要功能有:计算农历当年总天数,当月天数,判断某年是否存在农历的闰月及闰月的天数等,代码清单如下:/*函数功能:确定是否存在农历的闰月入口参数: lunar_year :年份 出口: 是否存在闰月 调用方式:如get_leap_month(198
35、2) 返回存在闰4月*/int get_leap_month(int lunar_year) return lunar_infolunar_year-1900&0xf;/*函数功能:若存在闰月,返回闰月的天数,30?29入口参数: lunar_year:年份 出口: 存在的是大月还是小月 调用方式:如get_leap_month_day(1982) 返回30天*/int get_leap_month_day(int lunar_year) if (get_leap_month(lunar_year)return (lunar_infolunar_year-1900&0x1000
36、0)?30:29);elsereturn(0);/*函数功能:确定农历当月天数,30?29入口参数: lunar_year,lunar_month:年份和月份 出口: 存在的是大月还是小月 调用方式:如get_lunar_month_total(1982,4) 返回30天*/int get_lunar_month_total(int lunar_year, int lunar_month) return (lunar_infolunar_year-1900&(0x10000>>lunar_month)?30:29);/*函数功能:农历当年总天数,354?355入口参数: l
37、unar_year:年份 出口: 一年的总天数 调用方式:如get_lunar_year_total(1982) 返回355天*/int get_lunar_year_total(int lunar_year) int sum=348; /*348 = 29*12 */int i;for(i=0x8000;i>0x8; i>>=1)sum+=(lunar_infolunar_year-1900&i)?1:0;return(sum+get_leap_month_day(lunar_year);/*函数功能:确定天干地支入口参数: num:年份-1864,str:表示天干
38、地支的字符串 出口: 干+支 调用方式:如get_chinese_era(2007-1864,str) 返回str='丁亥'*/void get_chinese_era(int num, char *str) strcpy(str, Gannum%10);strcat(str, Zhinum%12);6.3.4输出农历信息根据以上计算的农历数据返回农历信息并输出农历信息。代码清单如下:/*返回农历信息*/int get_lunar_info(int solar_year, int solar_month, Lunar_info *l_info,Chinese_era *chin
39、a_era) int i;int total;int temp_num;/*阳历1900年01月31日为农历1900年01月01日*/total=get_solar_total(solar_year,solar_month)-30;china_era->era_day=total+40;/*将13和14月作为下一年的1月和2月,便于确定Y年M月D日是星期几蔡勒公式求星期几:W=C/4-2C+y+y/4+13×(M+1)/5+d-1*/china_era->era_month=14;for(i=1900;i<2051&&total>=0;i+)
40、/*temp_num记录从1900到2050年闰年和平年的天数*/ temp_num=get_lunar_year_total(i); total-=temp_num; /*累计月*/ china_era->era_month+=12;l_info->lunar_year=i;if(total<0) total+=temp_num; /*减年*/ l_info->lunar_year-; china_era->era_month-=12;/*1864年为农历甲子年*/china_era->era_year=l_info->lunar_year-1864
41、;/*返回是否存在闰月*/l_info->leap_month=get_leap_month(l_info->lunar_year);l_info->leap_flag=0;for(i=1;i<13 &&total>0;i+)if (l_info->leap_month>0&&i=(l_info->leap_month+1)&&l_info->leap_flag=0)-i;temp_num=get_leap_month_day(l_info->lunar_year);/*存在闰月*/l_
42、info->leap_flag=1;elsetemp_num=get_lunar_month_total(l_info->lunar_year, i);if (l_info->leap_flag=1&&i=(l_info->leap_month+1)l_info->leap_flag=0;total-=temp_num;if (l_info->leap_flag=0)china_era->era_month+;if(total=0&&l_info->leap_month>0&&i=l_info
43、->leap_month+1)if(l_info->leap_flag=1)l_info->leap_flag=0;else l_info->leap_flag=1; -i; -china_era->era_month;if(total<0) total+=temp_num; -i; -china_era->era_month;l_info->lunar_month=i;l_info->lunar_day=total+1;if (l_info->leap_flag=0)l_info->current_mday=get_lunar
44、_month_total(l_info->lunar_year,l_info->lunar_month);elsel_info->current_mday=get_leap_month_day(l_info->lunar_year);return 0;/*输出农历日期信息*/int out_chinese(Lunar_info *l_info,char *chinese_str) /*初一不打印*/if (l_info->lunar_day!=1)strcpy(chinese_str, chinese_dayl_info->lunar_day-1);if (
45、l_info->lunar_day=15&&l_info->lunar_month=1)strcpy(chinese_str, "元宵节");if(l_info->lunar_day=5&&l_info->lunar_month=5)strcpy(chinese_str, "端午节");if(l_info->lunar_day=7&&l_info->lunar_month=7)strcpy(chinese_str, "情人节");if(l_info-&
46、gt;lunar_day=15&&l_info->lunar_month=7)strcpy(chinese_str, "中元节");if (l_info->lunar_day=15&&l_info->lunar_month=8)strcpy(chinese_str, "中秋节");if (l_info->lunar_day=9&&l_info->lunar_month=9)strcpy(chinese_str, "重阳节");if(l_info->lu
47、nar_month=12)if(l_info->lunar_day=30)strcpy(chinese_str, "除夕");if(l_info->current_mday<30&&l_info->lunar_day=29)strcpy(chinese_str, "除夕");if (l_info->lunar_day=8)strcpy(chinese_str, "腊八节");if (l_info->lunar_day=23)strcpy(chinese_str, "小年&q
48、uot;);elseif (l_info->leap_flag=1)/如果存在闰月就将汉字闰复制到数组里,再连接农历月份strcpy(chinese_str, "闰");strcat(chinese_str,chinese_monthl_info->lunar_month-1);strcat(chinese_str, "月");elseif (l_info->lunar_month=1)strcpy(chinese_str, "春节");elsestrcpy(chinese_str,chinese_monthl_in
49、fo->lunar_month-1);strcat(chinese_str, "月");if(get_lunar_month_total(l_info->lunar_year,l_info->lunar_month)=30)strcat(chinese_str,"大");elsestrcat(chinese_str,"小");return 0;6.3.5系统界面输出代码清单如下:/*界面输出*/void sub_menue() int week,s_month_total,space_num,c_num; int i
50、,j,flag; char tmp_str9; Chinese_era c_ear; Lunar_info l_info; /*每个月一号为星期几*/ week=get_week(s_year,s_month); /*返回当月的天数*/ s_month_total=day(s_month); /*将已开辟内存空间tmp_str的首sizeof(tmp_str)个字节的值设为值0,作用在于可以方便的清空结构类型的数组或变量。*/ memset(&c_ear,0,sizeof(c_ear); memset(&l_info,0,sizeof(l_info); /*返回农历信息*/ g
51、et_lunar_info(s_year,s_month,&l_info,&c_ear); memset(tmp_str,0,sizeof(tmp_str); /*确定干支*/ get_chinese_era(s_year-1864,tmp_str); if(s_year>=1949) /中华人民共和国纪年 t_year=s_year-1949; flag=3; else if(s_year<1949&&s_year>1911) /民国纪年 t_year=s_year-1911; flag=2; else if(s_year<1912&a
52、mp;&s_year>1908) /宣统纪年 t_year=s_year-1908; flag=1; else /光绪纪年 t_year=s_year-1874; flag=0; system("cls"); printf("t n"); printf("t1、年 万年历 n"); printf("t n"); printf("t2、年 今天是:"); TIME(); printf("n"); printf("t n"); printf(&q
53、uot;t3、月 公历:%d年%02d月 %s%3d年 农历:%s年 【%s】 n", s_year,s_month,buildflag,t_year,tmp_str, Animals(s_year-1864)%12); printf("t n"); printf("t4、月星期日 星期一 星期二 星期三 星期四 星期五 星期六n"); printf("t n"); printf("t5、Exit "); space_num=week; for (i=1; i<space_num;i+) print
54、f(" "); c_num=0; for (i=1; i<=s_month_total;i+) s_day=i; printf("%02d",s_day); week+=1; if(week>7)|(i=s_month_total) week=1; printf("n ");if (i<7)for (j=1;j<space_num;j+)printf(" ");week=space_num;elseweek=1;while(1)week+=1;memset(tmp_str,0,sizeof(tmp_str);out_chinese(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国一缩二氨基乙酸数据监测研究报告
- 2025至2030年中国PVC吸塑育秧盘数据监测研究报告
- 2025至2030年中国KTP晶体数据监测研究报告
- 8的乘法(教学设计)-2024-2025学年二年级上册数学沪教版
- 2025年中国顶板输送链条市场调查研究报告
- 2025年中国防晒护理洗发露市场调查研究报告
- 2025年中国针织头带市场调查研究报告
- 2025年中国野生蜂花粉市场调查研究报告
- 2025年中国远程多媒体信息管理系统市场调查研究报告
- 2025年中国超高粘度双面胶市场调查研究报告
- 2025年有关“我为群众办实事”主题日活动工作方案
- 2025中国新型储能行业发展白皮书
- 海南省天一大联考2024-2025学年高三学业水平诊断(四)语文试题及答案
- 旅游合同签署委托协议
- 山东司法警官职业学院招聘笔试真题2024
- 家庭车辆挂别人名下协议书范文
- 新教科版小学1-6年级科学需做实验目录
- 组织环境、相关方分析及措施一览表
- 中考物理专题43 纯电阻电路与非纯电阻电路电热计算(解析版)
- 《不定期船营运管理模拟系统》实验指导书
- 伍桂清 基于单片机的光电计数器的设计.doc
评论
0/150
提交评论