有两行没看懂,改成自己熟悉的代码
if((preDays>=0)&&(preDays < 7)) for(i = 1; i <= preDays; i++) printf("
");//在之前的空着的星期下打4个空格--------解决对齐问题;
if((i + preDays) % 7 ==0) printf("\n");//一行满7个数就换行
代码如下:
#include <stdio.h>
void PrintMonth(int year, int month)//定义函数(有两个参数)
{
int preDays, preMonth, preYears, monthDays, i;//声明。。
//前一月份,前一年份,一个月的天数
char Leap;//声明变量
闰年
preYears = year - 1;//计算前一年份
preDays = preYears * 365 + preYears / 4 - preYears / 100 + preYears / 400;//从公元元年到之前一年结束时的总天数
Leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) ? 1 : 0;//判断是否是闰年,是Leap=1否Leap=0
preMonth = month - 1;//前一月份
switch(preMonth)
{//这部分是计算从公元元年到今年这个月的前一个月末总的天数(平年)
case 1: preDays += 31; break;
case 2: preDays += 59; break;
case 3: preDays += 90; break;
case 4: preDays += 120; break;
case 5: preDays += 151; break;
case 6: preDays += 181; break;
case 7: preDays += 212; break;
case 8: preDays += 243; break;
case 9: preDays += 273; break;
case 10: preDays += 304; break;
case 11: preDays += 334; break;
}
if(preMonth >= 2 && Leap) preDays++;//由于上面是以平年算的一般情况,而此处月份(year)为3月份以上又为闰年所以2月有29天少加了一天
switch(month)
{//根据输入的月份给出这个月的天数(平年)
case 1: monthDays = 31; break;
case 2: monthDays = 28; break;
case 3: monthDays = 31; break;
case 4: monthDays = 30; break;
case 5: monthDays = 31; break;
case 6: monthDays = 30; break;
case 7: monthDays = 31; break;
case 8: monthDays = 31; break;
case 9: monthDays = 30; break;
case 10: monthDays = 31; break;
case 11: monthDays = 30; break;
case 12: monthDays = 31; break;
}
if(month == 2 && Leap) monthDays++;//闰年2月29天
switch(month)
{//输出月份
case 1: printf("1月"); break;
case 2: printf("2月"); break;
case 3: printf("3月"); break;
case 4: printf("4月"); break;
case 5: printf("5月"); break;
case 6: printf("6月"); break;
case 7: printf("7月"); break;
case 8: printf("8月"); break;
case 9: printf("9月"); break;
case 10: printf("10月"); break;
case 11: printf("11月"); break;
case 12: printf("12月"); break;
}
printf(" %d", year);//输出年份
if(Leap) printf(" 闰年");//输出闰年,平年为一般情况
printf("\n日
一
二
三
四
五
六\n");
preDays %= 7;//开始是星期几
if((preDays>=0)&&(preDays < 7)) for(i = 1; i <= preDays; i++) printf("
");//在之前的空着的星期下打4个空格
//if(preDays < 6) for(i = 0; i <= preDays; i++) printf("
");//在之前的空着的星期下打空格
for(i = 1; i <= monthDays; i++)
{
printf("%2d
", i);
if((i + preDays) % 7 ==0) printf("\n");//一行满7个数就换行
//if((i + preDays) % 7 ==6) printf("\n");//一行满7个数就换行
}
printf("\n");
}
int main()//主函数
{
int year, month;//声明年和月
for(;;)
//死循环,查完一个年份后,还可继续查
{
scanf("%d %d", &year, &month);
//输入年份和月份
if(year <= 0 || month <= 0) break;//判断输入的年份和月份是否符合要求
PrintMonth(year, month);//调用函数PrintMonth()
}
return 0;
}