
要求输入年月,判断是否闰年;
输入年月日,判断星期几;
输入年份,打出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欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)