C语言编写万年历~~速度

C语言编写万年历~~速度,第1张

/*C语言编程万年历

要求输入年月,判断是否闰年;

输入年月日,判断星期几;

输入年份,打出12个月的月历;

输入年份,月份,打印出本月日历;

要求用多个函数实现。*/

#include<stdio.h>

#include<time.h>

#include<string.h>int calendar[12][6][7]/*月历*/

char* week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Satarday"}

char* Monthname[]={"January","February","March","April","May","June","July",

"August","September","October","November","December"}

int monthday[]={31,28,31,30,31,30,31,31,30,31,30,31}

char* menu[]={/* *** 作菜单*/

"1.Input a year number,check whether it's a leap year.\n",

"2.Input year,month,day,check the weekday.\n",

"3.Input year,month,output the calendar of that month.\n",

"4.Input year,output all the month calendar.\n",

"0.Exit.\n"

}/*判断参数year传递的年份是否是闰年*/

int IsLeapyear(int year)

{

if(!(year%4)&&year%100||!(year%400)) return 1

else return 0

}/*输入年月日,判断星期几,利用Zeller公式w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

w是结果星期数,y是年份的后两位,c是年份的前两位,m是月份,3≤m≤14,也就是当

m≤2时,要算到前一年的13月份和14月份,最后要将w对7取模

*/

int WeekDay(int year,int month,int day)

{

int w,y,c,m,d

c=year/100

if(month<3){

m=12+month

y=year%100-1

}

else{

m=month

y=year%100

}

d=day

w=y+y/4+c/4-2*c+26*(m+1)/10+d-1

return (w%7+7)%7

}/*输入年份,月份,打印出本月的日历*/

void Monthly(int year,int month)

{

int weekday,i,j

if(month==2)

if(IsLeapyear(year)) monthday[1]+=1

weekday=WeekDay(year,month,1)

printf("%s\n",Monthname[month-1])

printf("Sun. Mon. Tue. Wed. Thu. Fri. Sat.\n")

for(i=1,j=weekdayi<=monthday[month-1]i++,j++){

calendar[month-1][j/7][j%7]=i

}

for(i=0i<6i++){

for(j=0j<7j++)

{

if(calendar[month-1][i][j]==0) printf("%5c",' ')

else printf("%-5d",calendar[month-1][i][j])

}

printf("\n")

}

}void allMonth(int year) /*输入年份,打印出12个月的月历*/

{

int i

for(i=1i<=12i++){

Monthly(year,i)

getch()/*按任意键继续执行*/

}

}void main(void)

{

int year,month,day,i,n,weekday

memset(&calendar,sizeof(calendar),0) /*初始化月历*/

for(i=0i<5i++)

printf("%s",menu[i])

while(1){

printf("Please choose the menu:")

scanf("%d",&n)

printf("\n")

switch(n){

case 1:

printf("Please input year:")

scanf("%d",&year)

if(IsLeapyear(year)) printf("\n%d is leap year.\n",year)

else printf("%d isn't leap year.\n",year)

break

case 2:

printf("Please input year month day:")

scanf("%d%d%d",&year,&month,&day)

printf("\n")

weekday=WeekDay(year,month,day)

printf("That day is %s\n",week[weekday])

break

case 3:

printf("Please input year month,then it output a calendar of that month:")

scanf("%d%d",&year,&month)

printf("\n")

Monthly(year,month)

break

case 4:

printf("Please input year,then it will output the calendar of that year:")

scanf("%d",&year)

printf("\n")

allMonth(year)

break

case 0:

return

default:

printf("The number you input is invalid.\n")

break

}

}

getch() /*按任意键,程序退出*/

}这个程序是可用的~~希望能帮到你~~~

除了天数差计算,基本上是完成了你所提出的功能(天数差计算其实已经提供了年内序数计算方方法,可以在此基础上完善即可)。包含星期计算、公历农历、农历转公历、节气查询。数据与算法均为原创,绝非网上复制而来。附件中有源代码,同时附带农历数据提取工具,可提取1600到7000年之间的任意年份区间,提取后的数据为压缩数据,占用空间小,同时数据包含数九、三伏、入梅和出梅,非常适合写一份完整的万年历。

部分核心算法函数如下:

//判断闰年,参数:年份,返回值:0-平年,1-闰年

int IsLeapYear(int iYear)

//计算日期在年内的序数,参数:年,月,日,年内序数,返回值:0-失败,1-成功

int GetDaysNumInYear(int iYear, int iMonth, int iDay,int *nDays)

//从年内序数计算月、日,参数:年,年内序数,月,日,返回值:0-失败,1-成功

int GetDateFromDays(int iYear, int nDays, int *iMonth, int *iDay)

//检验年、月、日的合法性,参数:年,月,日,返回值:0-失败,1-成功

int DateCheck(int iYear,int iMonth,int iDay)

//获取农历新年的公历年内序数,参数:农历年,返回值:农历新年的公历年内序数

int LunarGetNewYearOrdinal(int iLunarYear)

//获取农历月的天数,参数:农历年,农历月,是否为闰月,返回值:该农历月的天数,为0代表参数无效

int LunarGetDaysofMonth(int iLunarYear,int iLunarMonth,int IsLeapMonth)

//展开大小月数据表(某一年的),参数:农历年,从上一年十一月开始到当前年份(闰)十二月的每月天数,返回值:0-失败,1-成功

int LunarExpandDX(int iLunarYear,int iDayOfMonth[15])

//获取农历某一年的闰月情况,参数:农历年,返回值,该年的闰月月份,0表示无闰月

int LunarGetLeapMonth(int iLunarYear)

//公历转农历,参数:公历年、月、日,农历年、月、日,是否为闰月,返回值:0-失败,1-成功

int Gongli2Nongli(int iYear,int iMonth,int iDay,int *iLunarYear,int *iLunarMonth,int *iLunarDay,int *iIsLeapMonth)

//农历转公历,参数:家历年、月、日,是否为闰月,公历年、月、日,返回值:0-失败,1-成功

int Nongli2Gongli(int iLunarYear,int iLunarMonth,int iLunarDay,int iIsLeapMonth,int *iYear,int *iMonth,int *iDay)

//得到指定年份的节气信息,首个是小寒

int GetJieQi(int iYear,int uMonth,unsigned int uJieQi[2])

//计算星期

unsigned int GetDayOfWeek(int iYear,int uMonth,int uDay)

源代码请看

吧。提取码:ooj7


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

原文地址:https://54852.com/yw/7744584.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存