C语言编写万年历系统

C语言编写万年历系统,第1张

已经编译运行确认过。

#include <stdioh>

#include <stdlibh>

int leap(int); /判断是否为闰年/

int md(int m,int y); /返回本月的天数/

void prtweek(void); /输出表头/

int fw(int m,int y); /返回本月一号是星期几/

void prtmonth(int m); /输出月份表头/

int main(void)

{

int y,m,i,test,week;

printf("please import year of you want to select : ");

scanf("%d",&y);

for (m=1; m<=12; m++) {

test=1;

prtmonth(m);

prtweek();

week=fw(m,y);

if (week!=6)

for (i=0; i<=week; i++) {

putchar('\t');

test++;

}

for (i=1; i<=md(m,y); i++,test++) {

printf("%d\t",i);

if (test%7==0) {

putchar('\n');

}

}

putchar('\n');

system("pause");//暂停,以便观察输出

}

return 0;

}

int leap(int y)

{

return (y%4==0&&y%100||y%400==0)1:0;

}

int md(int m,int y)

{

int d;

switch (m) {

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:d=31;break;

case 4:

case 6:

case 9:

case 11:d=30;break;

case 2:d=leap(y)29:28;break;

}

return d;

}

void prtweek(void)

{

printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n","Sun","Mon","Tue","Wed","Thur","Fri","Sat");

}

int fw(int m,int y)

{

int f;

if (m<3) {

m+=12;

y--;

}

f=(1+2m+3(m+1)/5+y+y/4-y/100+y/400)%7;

return f;

}

void prtmonth(int m)

{

switch (m) {

default:

case 1:puts("===January===");break;

case 2:puts("===February===");break;

case 3:puts("===March===");break;

case 4:puts("===April===");break;

case 5:puts("===May===");break;

case 6:puts("===June===");break;

case 7:puts("===July===");break;

case 8:puts("===August===");break;

case 9:puts("===September===");break;

case 10:puts("===October===");break;

case 11:puts("===November===");break;

case 12:puts("===December===");break;

}

}

除了天数差计算,基本上是完成了你所提出的功能(天数差计算其实已经提供了年内序数计算方方法,可以在此基础上完善即可)。包含星期计算、公历农历、农历转公历、节气查询。数据与算法均为原创,绝非网上复制而来。附件中有源代码,同时附带农历数据提取工具,可提取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

//我写的代码,我自己改吧。当年水平有限,忘了考虑闰年,楼主莫怪

没有纯c环境,不知道还有没有错

#include <stdioh>

#include <timeh>

int days[]={0,31,59,90,120,151,181,212,243,273,304,334,365};

int month[]={31,28,31,30,31,30,31,31,30,31,30,31};

char weekday[7][7]={"一","二","三","四","五","六","七"};

char weeks[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

//判闰年

inline int leap(int year)

{

return (year%4==0&&year%100!=0)||year%400==0;

}

//判合法性

inline int legal(int y,int m,int d){

if(m<0||m>12)

return 0;

if(m==2)

return d>0 && d<=28+leap(y);

return d>0 && d<=month[m-1];

}

int week(int y,int m,int d)

{

int day = days[m-1]+d-1+(m>2leap(y):0);

return (y-1+(y-1)/4-(y-1)/100+(y-1)/400+day)%7;

}

void print()

{

puts("1Week(查询某天是星期几)");

puts("2Month(打印某月日历)");

puts("3Calendar(打印某年日历)");

puts("4Exit(退出)");

}

void printmonth(int y,int m)

{

int i,j,w;

w=(week(y,m,1)+1)%7;

puts(" SUN MON TUE WED THU FRI SAT");

for(i=1;i<=w;i++)

printf("%5c",' ');

for(j=i;j<i+month[m-1]+(m==2&&leap(y));j++)

{

printf("%5d",j-i+1);

if(j%7==0)

puts("");

}

if((j-1)%7)

puts("");

}

int main()

{

int i,y,m,d,c;

char op[5],s[105];

time_t current = time(NULL);

tm date = localtime(&current);

print();

while(scanf("%d",&c)==1)

{

if(c==1)

{

strftime(s,100,"%Y %m %d",date);

do

{

printf("请输入年月日(例如:%s)\n",s);

scanf("%d%d%d",&y,&m,&d);

printf("%44d年%22d月%22d日是星期%s,是否继续查询(Y/N)?\n",y,m,d,weekday[week(y,m,d)]);

scanf("%s",op);

}while(op[0]=='Y'||op[0]=='y');

}

if(c==2)

{

strftime(s,100,"%Y %m",date);

do

{

printf("请输入要打印的月份(例如:%s)\n",s);

scanf("%d%d",&y,&m);

printf(" %44d年%22d月\n",y,m);

printmonth(y,m);

puts("是否继续打印(Y/N)?");

scanf("%s",op);

}while(op[0]=='Y'||op[0]=='y');

}

if(c==3)

{

strftime(s,100,"%Y",date);

do

{

printf("请输入要打印的年份(例如:%s)\n",s);

scanf("%d",&y);

printf(" %44d\n",y);

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

{

printf(" %22d月\n",i);

printmonth(y,i);

}

puts("是否继续打印(Y/N)?");

scanf("%s",op);

}while(op[0]=='Y'||op[0]=='y');

}

if(c==4)

{

puts("是否要真的退出(Y/N)?");

scanf("%s",op);

if(op[0]=='Y'||op[0]=='y')

return 0;

}

print();

}

}

以上就是关于C语言编写万年历系统全部的内容,包括:C语言编写万年历系统、万年历查询程序. C语言代码、用c语言编译万年历等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9325688.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存