C语言程序设计 万年历查询程序。

C语言程序设计 万年历查询程序。,第1张

实验名称:万年历的查询及打印

【内容】:设计一个查询并打印万年历的程序。

【步骤】:

1.

画出程序流程图;

2.

编写程序;

3.

调试程序,对调试过程中出现的问题进行分析,找出错误的原因并予改正;

4.

写出通过调试并修改正确的原程序。

【要求】:

1.

程序运行后,首先在屏幕上显示主菜单:

1.

查询某年某月某日是星期几

2.

查询某年是否是闰年

3.

打印某年的全年日历

4.

退出

2.

在主菜单中输入1后,显示:

“请输入年月日(XXXX,XX,XX)”

运行后输出:XXXX年XX月XX日是星期X,是否继续查询(Y/N)?

如果输入Y,则重新显示

“请输入年月日(XXXX,XX,XX)”,否则回到主菜单。

3.

在主菜单中输入2后,显示:

“请输入要查哪一年?(XXXX)”

运行后输出:XXXX年是(否)是闰年,是否继续查询(Y/N)?

如果输入Y,则重新显示,“请输入要查哪一年?(XXXX)”,否则回到主菜单。

4.

在主菜单中输入3后,显示:

“请输入要打印的年份(XXXX)”

运行后输出XXXX年的日历,格式为:

XXXX

X(月数)

0

1

2

3

4

5

6

S

M

T

W

T

F

S

x

x

x

x

x

x

x

x

x

x

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

X(月数)

0

1

2

3

4

5

6

S

M

T

W

T

F

S

x

x

x

x

x

x

x

xx

 xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

xx

.

.

.

.

.

 运行完后显示:“是否继续打印(Y/N)?”

 如果输入Y,则重新显示,“请输入要打印的年份(XXXX)”,否则回到主菜单。

5.

在主菜单中输入4后,显示:“是否要真的退出(Y/N)?”

如果输入Y,结束程序运行,否则重新显示主菜单。

【提示】:

1.

闰年计算:满足下列二者之一,是闰年:

能被4整除,但不能被100整除

能被4整除,且能被400整除。

2.闰年的二月是29天,平年的二月是28天

3.星期几的计算:

S=X-1+(X-1)/4+(X-1)/100+(X-1)/400+C

X是年份,C是该年从元旦开始到到这一日的天数

S/7的余数既是星期数

例1:1982年12月26日

由于1982年不是闰年(不能被4整除),所以该年的二月是28天。

C=31+28+31+30+31+30+31+31+30+31+30+26=360

(1月到11月的天数+12月的实际天数)

S=1982-1+(1982-1)/4+(1982-1)/100+(1982-1)/400+360=2821.3925

S/7=2821/7=403

余数为0,所以该日是星期天。

例2:2000年3月8日

由于2000年是闰年(能被4整除,又能被100和400整除),所以该年的二月是29天。

C=31+29+8=68

(1月到2月的天数+3月的实际天数)

S=2000-1+(2000-1)/4+(2000-1)/100+(2000-1)/400+68=2551.757

S/7=2551/7=364

余数为3,所以该日是星期三。

这个程序:判断输入日期的合法性(年、月、日);如果合法,输出该月的日历。修改一下,就能达到你要求的效果。

http://hi.baidu.com/ctralt/blog/item/ee937c167e87db4b21a4e96b.html

#ifndef _CALENDAR_H

#define _CALENDAR_H

#include <windows.h>

struct myDATE{

int year

int month

int day

bool isRunYue

}

class calendar{

public:

calendar(){}

~calendar(){}

LONG lDaysFrom1900(myDATE date)//date与1900年相差的天数

UINT lYearDays(UINT y)//农历y年的总天数

UINT leapDays(UINT y)//传回农历 y年闰月的天数

UINT leapMonth(UINT y)// 传回农历 y年闰哪个月 1-12 , 没闰传回 0

UINT monthDays(UINT y,UINT m)//传回农历 y年m月的总天数

myDATE Lunar(myDATE date)//输入阳历日期,返回阴历日期

char* dayOfWeek(myDATE date)//输入阳历日期,返回星期几

char* getLunarString (myDATE date )// 输入阴历日期,得到表示农历的字串

UINT solarDays(UINT y,UINT m)//传回国历 y年某m+1月的天数

private:

char m_slunar[100]//用于存储农历信息

static DWORD lunarInfo[]//

static UINT solarMonth[]

static char sSolarTerm[]

static DWORD dTermInfo[]

static char sFtv[]

}

#endif

#include "calendar.h"

#include <stdio.h>

DWORD calendar::lunarInfo[]={

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,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,

0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,

0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,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

}

UINT calendar::solarMonth[]={31,28,31,30,31,30,31,31,30,31,30,31}

UINT calendar::lYearDays(UINT y)

{

UINT i, sum = 348

for(i=0x8000i>0x8i>>=1)

{

sum += (lunarInfo[y-1900] &i)? 1: 0

}

return(sum+leapDays(y))

}

UINT calendar::leapDays(UINT y)

{

if(leapMonth(y))

{

return (lunarInfo[y-1900] &0x10000)? 30: 29

}

else

{

return 0

}

}

UINT calendar::leapMonth(UINT y)

{

return lunarInfo[y-1900] &0xf

}

UINT calendar::monthDays(UINT y,UINT m)

{

return (lunarInfo[y-1900] &(0x10000>>m))? 30: 29

}

LONG calendar::lDaysFrom1900(myDATE date)

{

LONG days

days=365*date.year+(date.year-1)/4-(date.year-1)/100+(date.year-1)/400-

(365*1900+(1900-1)/4-(1900-1)/100+(1900-1)/400)

for(int i=0i<date.month-1i++)

{

days+=solarMonth[i]

}

days+=date.day

if((date.year%4==0&&date.year%100!=0)||date.year%400==0)

{

if(date.month>2)

{

days++

}

}

return days

}

myDATE calendar::Lunar(myDATE date)

{

LONG offset

int i, leap=0, temp=0

myDATE retdate

offset=lDaysFrom1900(date)-30

for(i=1900i<2050 &&offset>0i++)

{

temp = lYearDays(i)

offset -= temp

}

if(offset<0)

{

offset += temp

i--

}

retdate.year = i

leap = leapMonth(i)

bool isLeap = false

for(i=1i<13 &&offset>0i++)

{

if(leap>0 &&i==(leap+1) &&isLeap==false)

{

--i

isLeap = true

temp = leapDays(retdate.year)

}

else

{

temp = monthDays(retdate.year, i)

}

if(isLeap==true &&i==(leap+1))

{

isLeap = false

}

offset -= temp

}

if(offset==0 &&leap>0 &&i==leap+1)

{

if(isLeap)

{

isLeap = false

}

else

{

isLeap = true

--i

}

}

if(offset<=0)

{

offset += temp

--i

}

retdate.month = i

retdate.day = offset

retdate.isRunYue=isLeap

return retdate

}

char* calendar::getLunarString (myDATE date)

{

TCHAR szNongli[30], szNongliDay[10],szShuXiang[10]

const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"}/*天干名称*/

const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午", "未","申","酉","戌","亥"}/*地支名称*/

const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"}/*属相名称*/

const char *cDayName[] = { "*","初一","初二","初三","初四","初五", /*农历日期名*/

"初六","初七","初八","初九","初十",

"十一","十二","十三","十四","十五",

"十六","十七","十八","十九","二十",

"廿一","廿二","廿三","廿四","廿五",

"廿六","廿七","廿八","廿九","三十"}

const char *cMonName[] = {"*","正","二","三","四","五","六", "七","八","九","十","十一","腊"}

/*--生成农历天干、地支、属相 ==>wNongli--*/

int nShuXiang = ((date.year - 4) % 60) % 12

if ( nShuXiang <0 || nShuXiang >= sizeof(cShuXiang)/sizeof(cShuXiang[0]) )

{

return NULL

}

wsprintf(szShuXiang,"%s",cShuXiang[nShuXiang])

int nTianGan = ((date.year - 4) % 60) % 10

if ( nTianGan <0 || nTianGan >= sizeof(cTianGan)/sizeof(cTianGan[0]) )

{

return NULL

}

int nDiZhi = ((date.year - 4) % 60) % 12

if ( nDiZhi <0 || nDiZhi >= sizeof(cDiZhi)/sizeof(cDiZhi[0]) )

{

return NULL

}

wsprintf(szNongli,"%s(%s%s)年",szShuXiang,cTianGan[nTianGan],cDiZhi[nDiZhi])

/*--生成农历月、日 ==>wNongliDay--*/

if ( date.month <0 || date.month >= sizeof(cMonName)/sizeof(cMonName[0]) )

{

return NULL

}

if (date.isRunYue)

{

wsprintf(szNongliDay,"闰%s",cMonName[date.month])

}

else

{

strcpy(szNongliDay,cMonName[date.month])

}

strcat(szNongliDay,"月")

if ( date.day <0 || date.day >= sizeof(cDayName)/sizeof(cDayName[0]) )

{

return NULL

}

strcat(szNongliDay,cDayName[date.day])

strcat(szNongli,szNongliDay)

sprintf(m_slunar,szNongli)

return m_slunar

}

char* calendar::dayOfWeek(myDATE date)

{

char *cWeekName[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}

if(date.month==1||date.month==2)

{

date.month+=12

date.year--

}

return cWeekName[(date.day+1+2*date.month+3*(date.month+1)/5+date.year+date.year/4-date.year/100+date.year/400)%7]

}

UINT calendar::solarDays(UINT y,UINT m)

{

if(m==1)//2月

{

return(((y%4 == 0) &&(y%100 != 0) || (y%400 == 0))? 29: 28)

}

else

{

return(solarMonth[m])

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12148115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存