程序运行截图:
以下是C语言写的万年历的源代码,有点小错误:
#include<stdio.h>
int year,month;
int emonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int isrun(int y)//判断是否是闰年的自定义函数,原谅我英文渣拼音也掺了。。
{
if (y%4==0&&y%100!=0||y%400==0)
return 1;
else
return 0;
}
int ydays(int y)//传递年数,判断该年有多少天
{
if (isrun(y))
return 366;
else
return 365;
}
int yfd(int a)//传递年数,计算出该年第一天是星期几的自定义函数
{
int i,s=0;
if (a>2015)
{
for (i=2015;i<a;i++)
s+=ydays(i);
s=(s+4)%7;
}
else if (a<2015)
{
for (i=2015;i<a;i--)
s+=ydays(i);
s=(s+4)%7;
}
else
s=4;
return s;
}
int mfd(int yf,int n)//传递该月当年第一天是星期几以及第几月,返回该月第一天是星期几的自定义函数
{
int s=0,i;
if (isrun(year)&&n>2)//如果该年是闰年并且月数是二月以上就会多出一天加上
s=1;
for (i=0;i<n-1;i++)
s+=emonth[i];
s=(s+yf)%7;
return s;
}
void display(int f)//显示
{
int a,b=f,i;
a=emonth[month-1];
if((isrun(year)&&month==2)//如果正好是2月就要多加一天
a++;
printf(" 日 一 二 三 四 五 六\n");
while(b--)
printf(" ");
b=f;
for (i=1;i<=a;i++,b++)
{
printf("%4d",i);
if (b%7==6)
printf("\n");
}
printf("\n");
}
int main()
{
while (1)
{
printf("请输入年份,月数,空格隔开:");
scanf("%d%d",&year,&month);
display(mfd(yfd(year),month));
printf("\n");
}
return 0;
}
下面是codexia帮我纠正过的代码,运行正确,请对比你参考学习。
#include<stdio.h>
#include <time.h>
int year,month;
const int emonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
bool IsLeapYear(int iYear)//判断是否是闰年的自定义函数,原谅我英文渣拼音也掺了。。
{
if (iYear%4==0 && iYear%100!=0 || iYear%400==0)
return true;
else
return false;
}
int GetDayofYear(int iYear)//传递年数,判断该年有多少天
{
if (IsLeapYear(iYear))
return 366;
else
return 365;
}
int GetWeekofYearDay(int iYear)//传递年数,计算出该年第一天是星期几的自定义函数
{
struct tm * ptmDateTime;
time_t ttLocalTime;
time( &ttLocalTime ); // - 获取long型时间
ptmDateTime = localtime( &ttLocalTime ); // - 转换成本地时间
// - tm的解释,见《时间日期结构体tm详细解释 http://www.cjjjs.com/cpp/235531571769.aspx》
// - time和localtime的使用见《localtime函数(time_t转换tm)转换成本地时间 http://www.cjjjs.com/cpp/235142351873.aspx》
int i,iDay=0;
if (iYear > ptmDateTime->tm_year)
{
for (i=ptmDateTime->tm_year;i<iYear;i++)
iDay +=GetDayofYear(i);
iDay = (iDay+4)%7;
}
else if(iYear < ptmDateTime->tm_year)
{
for (i=ptmDateTime->tm_year;i<iYear;i--)
iDay +=GetDayofYear(i);
iDay=(iDay+4)%7;
}
else
{
iDay=4;
}
return iDay;
}
int GetWeekofMonthFirstDay(int iWeek,int iMonth)//传递该月当年第一天是星期几以及第几月,返回该月第一天是星期几
{
int iDay=0,i;
if(IsLeapYear(year)&&iMonth>2)//如果该年是闰年且月数大于二,会多出一天加上
iDay=1;
for(i=0;i<iMonth-1;i++)
iDay+=emonth[i];
int iRetWeek = (iDay+iWeek)%7;
return iRetWeek;
}
void display(int iWeek)//显示
{
int iDayOfMonth = emonth[month-1];
int b=iWeek-2,i;
if(IsLeapYear(year) && month==2)//如果正好是2月就要多加一天
iDayOfMonth++;
printf(" 日\t 一\t 二\t 三\t 四\t 五\t 六\t\n");
while(b--)
printf("\t");
for (i=1;i<=iDayOfMonth;i++,iWeek++)
{
if (iWeek%7==1)
{
printf("%4d\t\n",i);
}
else
{
printf("%4d\t",i);
}
}
printf("\n");
}
int main()
{
while (1)
{
printf("请输入年份,月数,空格隔开:");
scanf("%d%d",&year,&month);
display(GetWeekofMonthFirstDay(GetWeekofYearDay(year),month));
printf("\n");
}
return 0;
}