C语言编写方案万年历讲解Word格式.docx
- 文档编号:18223390
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:28
- 大小:100.09KB
C语言编写方案万年历讲解Word格式.docx
《C语言编写方案万年历讲解Word格式.docx》由会员分享,可在线阅读,更多相关《C语言编写方案万年历讲解Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
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<
stdio.h>
string.h>
stdlib.h>
conio.h>
math.h>
time.h>
#defineYUANDAN1
ints_year;
ints_month;
ints_day;
staticintt_year;
staticshorttoday=YUANDAN;
/*1900-2050年的农历数据*/
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);
%02d:
%02d:
%02d"
tm_hour,tp->
tm_min,tp->
tm_sec);
星期%s\t"
week[tp->
tm_wday]);
}
/**************************************************************************
延迟刷新时间
n:
秒
对应秒数
如buffer
(2)返回2秒后执行下一操作
***************************************************************************/
voidbuffer(intn)
time_tstart,end;
start=time(NULL);
end=time(NULL);
while(end-start<
n)
/***************************************************************************
返回阳历某年的天数,闰年返回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<
solar_year;
temp_num++)
{
total+=leap(temp_num);
}
for(temp_num=1;
solar_month;
total+=day(temp_num);
returntotal;
返回M年M月的1号为星期几,以1900.01.01为基准1为星期日
M年M月的一号是星期几
如get_week(2000,01)返回星期六
intget_week(intsolar_year,intsolar_month)
intweek;
/*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:
年
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编写 方案 万年历 讲解