C语言编写方案万年历讲解.docx
《C语言编写方案万年历讲解.docx》由会员分享,可在线阅读,更多相关《C语言编写方案万年历讲解.docx(28页珍藏版)》请在冰豆网上搜索。
![C语言编写方案万年历讲解.docx](https://file1.bdocx.com/fileroot1/2022-12/14/e469d57b-ab5f-4faf-a1ae-e0d9c355f34e/e469d57b-ab5f-4faf-a1ae-e0d9c355f34e1.gif)
C语言编写方案万年历讲解
难易程度
中等
开发语言
C
开发工具
操作系统:
WindowsXP或更高
开发平台:
VC++6.0
关键字
万年历
《C语言程序设计》课程综合案例
——案例06万年历
6.1需求分析
本系统提供给用户一个万年历查询平台,用来查询1900-2050年任何一个月的月历。
在使用本系统的过程中,用户除了可以查看到公历数据外,还可以查看相应的农历数据。
要查询的年份和月份可以从键盘直接输入,另外还可以输入1和2来增加和减少年份,输入3和4来增加和减少月份。
6.1.1功能概述
如图6-1所示,系统主要功能有:
1.显示当前日期和时间,以及星期信息。
2.显示要查询的某年某月的月历,包括公历数据以及其相应的农历数据,如:
天干地支、生肖、节气等。
3.要查询的年份和月份可以从键盘直接输入,也可以通过输入“1-4”四个数字键来增加减少年份和月份的方法查询。
6.1.2系统运行环境
一、硬件环境
●处理器:
IntelPentium166MX或更高
●内存:
32MB
●硬盘空间:
1GB
●显卡:
SVGA显示适配器
二、软件环境
●操作系统:
Windows98/ME/2000/XP
6.1.3功能需求描述
万年历查询平台为用户提供简单方便的日期查询功能,给出完整清晰的日期信息。
本系统需要实现的基本功能如下:
1.取得系统当前时间:
取得系统当前的日期、时间及星期信息。
2.判断某年是否为闰年。
3.得到阳历某月的天数以及某年的总天数等信息。
4.判断某年月日为星期几。
5.得到某个具体日期的农历数据,包括农历日期、天干地支、节气等信息。
图6-1万年历界面
6.2总体设计
6.2.1系统流程描述
系统的流程描述如图6-2所示。
6.2.2功能模块设计
根据功能需求描述,定义如下函数:
voidTIME():
取得系统当前时间;
intleap(intyear):
返回阳历某年的天数,闰年返回366天,平年返回365天;
intday(intmonth):
返回阳历当月的天数;
intget_solar_total(intsolar_year,intsolar_month):
返回1900年01月01日到M年M月的天数;
intget_week(intsolar_year,intsolar_month):
返回M年M月的1号为星期几;
intget_lunar_info(intsolar_year,intsolar_month,Lunar_info*l_info,Chinese_era*china_era):
返回农历信息;
intout_chinese(Lunar_info*l_info,char*chinese_str):
输出农历日期信息;
voidsub_menue():
界面输出。
6.2.3数据结构设计
一、农历信息数据结构
typedefstruct
{
intlunar_year;//农历年份
intlunar_month;//农历月份
intlunar_day;//农历日期
intcurrent_mday;//本月天数
intleap_month;//本年闰月
intleap_flag;//闰月标记
}Lunar_info;
二、公历信息数据结构
typedefstruct
{
intera_year;//阳历年份
intera_month;//阳历月份
intera_day;//阳历日期
}Chinese_era;
三、数组
用来定义相关的农历信息,如天干地支、节气、生肖、农历日和月等数据。
1.1900-2050年的农历数据
intlunar_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,0x02b60,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,0x0a570,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,0x0d954,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,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
0x14b63
};
数据格式说明:
数组中的每一个数字都是一个由5位十六进制数组成的数字,例:
04bd8。
第0位表示当年有无闰月,有的话为闰月的月份,没有的话,为0;第1、2、3位转换成二进制共12位,如:
010010111101表示一年中的12个月分别有多少天(1为30天,0为29天);第4位表示闰月是大月还是小月,仅当存在闰月的情况下有意义。
例如:
1980年的数据是:
0x095b0
其二进制为:
00001001010110110000
表示1980年没有闰月,从1月到12月的天数依次为:
30、29、29、30、29、30、29、30、30、29、30、30。
2.天干、地支、生肖、节气等
/*天干*/
charGan[10][3]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
/*地支*/
charZhi[12][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
/*生肖*/
charAnimals[12][3]={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
/*24节气*/
charsolar_term[24][5]=
{
"小寒","大寒","立春","雨水","惊蛰","春分",
"清明","谷雨","立夏","小满","芒种","夏至",
"小暑","大暑","立秋","处暑","白露","秋分",
"寒露","霜降","立冬","小雪","大雪","冬至"
};
/*农历日*/
charchinese_day[30][5]=
{
"初一","初二","初三","初四","初五","初六","初七",
"初八","初九","初十","十一","十二","十三","十四",
"十五","十六","十七","十八","十九","廿十","廿一",
"廿二","廿三","廿四","廿五","廿六","廿七","廿八",
"廿九","卅十"
};
charbuild[4][5]={"光绪","宣统","民国","建国"};
/*农历月*/
charchinese_month[12][5]={"正","二","三","四","五","六","七","八","九","十","冬","腊"};
6.3详细设计
6.3.1程序预处理
头文件calendar.h包含上节所描述的所有数据。
具体清单如下:
#include
#include
#include
#include
#include
#include
#defineYUANDAN1
typedefstruct
{
intlunar_year;//农历年份
intlunar_month;//农历月份
intlunar_day;//农历日期
intcurrent_mday;//本月天数
intleap_month;//本年闰月
intleap_flag;//闰月标记
}Lunar_info;
typedefstruct
{
intera_year;//阳历年份
intera_month;//阳历月份
intera_day;//阳历日期
}Chinese_era;
ints_year;
ints_month;
ints_day;
staticintt_year;
staticshorttoday=YUANDAN;
/*1900-2050年的农历数据*/
intlunar_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,0x02b60,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,0x0a570,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,0x0d954,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,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
0x14b63
};
/*天干*/
charGan[10][3]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
/*地支*/
charZhi[12][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
/*生肖*/
charAnimals[12][3]={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
/*24节气*/
charsolar_term[24][5]=
{
"小寒","大寒","立春","雨水","惊蛰","春分",
"清明","谷雨","立夏","小满","芒种","夏至",
"小暑","大暑","立秋","处暑","白露","秋分",
"寒露","霜降","立冬","小雪","大雪","冬至"
};
/*农历日*/
charchinese_day[30][5]=
{
"初一","初二","初三","初四","初五","初六","初七",
"初八","初九","初十","十一","十二","十三","十四",
"十五","十六","十七","十八","十九","廿十","廿一",
"廿二","廿三","廿四","廿五","廿六","廿七","廿八",
"廿九","卅十"
};
charbuild[4][5]={"光绪","宣统","民国","建国"};
/*农历月*/
charchinese_month[12][5]={"正","二","三","四","五","六","七","八","九","十","冬","腊"};
6.3.2计算所查询日期的公历数据
主要功能有:
①取得系统的当前日期、时间和星期信息;②判断某年是否闰年并返回当年的天数;③返回1900年01月01日到M年M月的天数;④返回M年M月的1号为星期几。
代码清单如下:
#include"calendar.h"
/****************************************************************************
函数功能:
取得系统当前时间
入口参数:
无
出口:
系统当前时间
调用方式:
如TIME()返回系统当前时间
****************************************************************************/
voidTIME()
{
staticchar*week[]={"日","一","二","三","四","五","六"};
time_tt;
structtm*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_hour,tp->tm_min,tp->tm_sec);
printf("星期%s\t",week[tp->tm_wday]);
}
/**************************************************************************
函数功能:
延迟刷新时间
入口参数:
n:
秒
出口:
对应秒数
调用方式:
如buffer
(2)返回2秒后执行下一操作
***************************************************************************/
voidbuffer(intn)
{
time_tstart,end;
start=time(NULL);
end=time(NULL);
while(end-startend=time(NULL);
}
/***************************************************************************
函数功能:
返回阳历某年的天数,闰年返回366天,平年返回365天
入口参数:
year:
公历年
出口:
对应天数
调用方式:
如leap(2000)返回366天
***************************************************************************/
intleap(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)return366;
elsereturn365;
}
/*****************************************************************************
函数功能描述:
返回阳历当月的天数
入口参数:
month:
公历月
出口:
对应天数
调用方式:
如day
(1)返回31天
****************************************************************************/
intday(intmonth)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return31;
if(month==4||month==6||month==9||month==11)return30;
if(month==2&&leap(s_year)==366)return29;
elsereturn28;
}
/****************************************************************************
函数功能:
返回1900年01月01日到M年M月的天数
入口参数:
s_year,s_month:
年份和月份
出口:
M年M月-1900-01-01
调用方式:
如get_solar_total(2000,01)返回36555天
****************************************************************************/
intget_solar_total(intsolar_year,intsolar_month)
{
inttotal;
inttemp_num;
total=0;
for(temp_num=1900;temp_num{
total+=leap(temp_num);
}
for(temp_num=1;temp_num{
total+=day(temp_num);
}
returntotal;
}
/****************************************************************************
函数功能:
返回M年M月的1号为星期几,以1900.01.01为基准1为星期日
入口参数:
s_year,s_month:
年份和月份
出口:
M年M月的一号是星期几
调用方式:
如get_week(2000,01)返回星期六
****************************************************************************/
intget_week(intsolar_year,intsolar_month)
{
intweek;
inttotal;
/*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;
returnweek;
}
6.3.3计算所查询日期的农历数据
主要功能有:
计算农历当年总天数,当月天数,判断某年是否存在农历的闰月及闰月的天数等,代码清单如下:
/****************************************************************************
函数功能:
确定是否存在农历的闰月
入口参数:
lunar_year:
年份
出口:
是否存在闰月
调用方式:
如get_leap_month(1982)返回存在闰4月
***************************************************************************/
intget_leap_month(intlunar_year)
{
returnlunar_info[lunar_year-1900]&0xf;
}
/****************************************************************************
函数功能:
若存在闰月,返回闰月的天数,30?
29
入口参数:
lunar_year:
年