原来的思路太复杂了,整理了一个供参考
#include
#include
// 判断某年是否闰年的函数
int IsLeapYear (int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
return 0;
}
void main()
{
int year, month, i, x; // x 用于计算输入月份的1号是星期几
// 定义数组保存1~12每个月的天数。
// 因为数组下标从0开始,为直观起见,定义了13个,DaysOfMonth[1]为1月天数....
int DaysOfMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
printf("input: year month\n");
scanf("%d %d", &year, &month); // 改用空格分隔了,输入方便一点
// 计算依据是:1900年1月1日为星期一
x = 1;
// 普通年份365天,正好是52周加上1天,马上就知道1901年1月1日是星期二
// 由此可以推断对于普通年份,下一年的元旦的星期数是上一年元旦的星期数加1
// 如果碰上闰年,则全年多1天,下一年的元旦星期数再多加1
// 以下计算输入年份的1月1日是星期几
for(i=1900;i{
x++; // 普通年份,下一年元旦星期数加1
if (IsLeapYear(i)) // 如果碰上闰年就多加1
x++;
}
x = x % 7; // 求余后得到输入年份元旦是星期几
// 如果输入年份是闰年,则2月天数为29天
if (IsLeapYear(year))
DaysOfMonth[2] = 29;
// x 累加 month 前各月份的天数
for (i = 1; i < month; i++)
x += DaysOfMonth[i];
x = x % 7; // 求余后得到 month 月 1日是星期几
// 以下输出月历
printf(" 日 一 二 三 四 五 六\n");
for (i = 1; i <= x; i++)
printf(" "); // 根据 x 的值输出前导空格,每天占3个空格
for (i = 1; i <= DaysOfMonth[month]; i++)
{
printf("%3d",i);
if ((i + x) % 7 == 0)
printf("\n");
}
getch();
第4句 int year,month,sum=0,week,i,days; 要对days变量初始化
改为int year,month,sum=0,week,i,days=0;