
已经编译运行确认过。
#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(¤t);
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语言编译万年历等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)