看看没人帮你,我来帮你吧,以下是我新写的,用了我自己原创的算法,完全不同于网上的程序,等于说是专门为你量身定制的。奉上程序:
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/f2deb48f8c5494ee35b7f7f32ff5e0fe98257e47?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
#include <stdio.h>
#include <windows.h>
char *NameOfMonth[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char *WeekDay[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
int IsLeapYear (int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;//闰年返回1
}else
{
return 0;//平年返回0
}
}
int DateCheck(int uYear,int uMonth,int uDay)//合法返回true,非法或超出范围返回false
{
if (uYear<1901||uYear>9999||uMonth<1||uMonth>12||uDay<1||uDay>31)
{
return 0;
}
if (uMonth==4||uMonth==6||uMonth==9||uMonth==11)
{
if (uDay>30)
{
return 0;
}
}else if (uMonth==2)
{
if (IsLeapYear(uYear))
{
if (uDay>29)
{
return 0;
}
}else
{
if (uDay>28)
{
return 0;
}
}
}
return 1;
}
int GetDays (int year,int month,int day)
{
int sum=0;
if (DateCheck(year,month,day)==0)
{
return -1;//日期有误
}
if(year>=1901)
{
int X=(int)(year/100);//世纪数
int Y=X-(int)(X/4);//如果按4年一闰来算,Y指的是比实际上多算的天数,在下面需要减去
if (month<=2&&month>0)
{
year--;//把1月、2月视为上一年的13月、14月(纯粹为了计算需要)
month+=12;
}
sum=(int)(365.25*(year-1900))+(int)(30.6*(month+1))+day-Y-49;//以365.25(本来实际太阳年是365.2425天)来计算是为了计算按4年一闰的整数年总天数,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的)
//月份以30.6天的平均值计算。最后减去的49,是多加的一个月以及其余相差天数的和,可得到1900年1月1日的积日为0
}
return sum;//返回距离1900年1月1日的总天数(积日)
}
int GetDayOfMonth(int month,int year)
{
int tmp_days=GetDays(year,month,1);//本月积日
int DayOfMonth=0;
month++;//下个月
if (month>12)
{
month=1;//遇到月份为12月的情况,月份为1,年份加1
year++;
}
DayOfMonth=GetDays(year,month,1);//下个月的积日
DayOfMonth-=tmp_days;//下月1日的总天数(距离1900年1月1日的积日)减去当前月1日的总天数
return DayOfMonth;//返回当前月总天数
}
int ShowCalendar(int year,int month,int day)
{
int i,j,count;
int jiri=0;//积日
int dayofweek=0;//星期
if (DateCheck(year,month,day)==0)
{
printf("输入日期有误!\r\n");//日期不合法或超出范围,年历从1901年开始
return 0;
}
printf("\t %d %s\r\n",year,NameOfMonth[month-1]);
printf("--------------------------------------\r\n");
printf(" Sun Mon Tue Wed Thu Fri Sat\r\n");
printf("--------------------------------------\r\n");
jiri=GetDays(year,month,1);//获取距离1900年1月1日的总天数
dayofweek=(1+jiri)%7;//月首星期,因为1900年1月1日星期一
count=GetDayOfMonth(month,year);
for(i=0;i<dayofweek;i++)
{
printf(" ");//填充前面空格
}
for(i=1,j=dayofweek;i<=count;i++,j++)
{
if (i<10)
{
printf(" %d",i);
}else
{
printf(" %d",i);
}
if((j+1)%7==0)
{
if (i!=count)
{
printf("\r\n");//满7天,换行
}
}
}
printf("\r\n--------------------------------------\r\n\r\n");
return 1;
}
int main()
{
int year,month,day,nChoise=0;
int totaldays=0;
while (1)//主循环
{
printf("******************欢迎使用万年历********************\r\n");
printf("$ 菜单 $\r\n");
printf("$ 1.闰年判断 2.星期计算 $\r\n");
printf("$ $\r\n");
printf("$ 3.月历查询 4.打印整年日历 $\r\n");
printf("$ $\r\n");
printf("****************************************************\r\n");
printf("输入对应的序号进行相关操作:Choise>");
scanf("%d",&nChoise);
switch (nChoise)
{
case 1:
printf("请输入要判断的年份:Year>");
scanf("%d",&year);
if (year<1900||year>9999)
{
printf("输入年份超出范围!");
break;
}
if (IsLeapYear(year)==1)
{
printf("%d年是闰年!\r\n\r\n",year);
}else
{
printf("%d年不是闰年!\r\n\r\n",year);
}
break;
case 2:
printf("请输入要判断的日期:Year Month Day>");
scanf("%d %d %d",&year,&month,&day);
totaldays=GetDays(year,month,day);
printf("%d年%d月%d日是%s\r\n\r\n",year,month,day,WeekDay[(totaldays+1)%7]);
break;
case 3:
printf("请输入要显示的月份:Year Month>");
scanf("%d %d",&year,&month);
ShowCalendar(year,month,1);
break;
case 4:
printf("请输入要判断的年份:Year>");
scanf("%d",&year);
for (month=1;month<=12;month++)
{
ShowCalendar(year,month,1);
}
break;
default:
printf("无效的菜单项!\r\n");
break;
}
system("pause");
system("cls");
}
return 0;
}