C语言 程序 打印日历

时间:2021-05-19 09:17:20

请打印出任意年份的日历


这个题目理解起来很简单,也没什么高深的算法,就是有一点点“啰嗦”。


#include <stdio.h>


int print_mon(int year,int mon ,int week)
{
    int day;
    int i;

    if(mon < 1 || mon > 12 || week < 0 || week > 6)//出现不可能的值退出程序
    {
exit(1);
    }
    switch(mon) //每个月的日期不同
    {
case 1:
{
   printf("1\n");
   day = 31;
   break;
}
case 2:
{
   printf("2\n");
   if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
   {
day = 29; 
   }
   else
   {
day = 28;
   }
   break;
}
case 3:
{
   printf("3\n");
   day = 31;
   break;
}
case 4:
{
   printf("4\n");
   day = 30;
   break;
}
case 5:
{
   printf("5\n");
   day = 31;
   break;
}
case 6:
{
   printf("6\n");
   day = 30;
   break;
}
case 7:
{
   printf("7\n");
   day = 31;
   break;
}
case 8:
{
   printf("8\n");
   day = 31;
   break;
}
case 9:
{
   printf("9\n");
   day = 30;
   break;
}
case 10:
{
   printf("10\n");
   day = 31;
   break;
}
case 11:
{
   printf("11\n");
   day = 30;
   break;
}
case 12:
{
   printf("12\n");
   day = 31;
   break;
}
default:
{
   exit(1);
}
    }
    printf("Sun Mon Tue Wed Thu Fir Sat\n");
    for(i = 0;i < week * 4;i++)//判断第一天星期几,输出空格
    {
printf(" ");
    }
    for(i = 1;i <= day;i++)
    {
if(i < 10)//对齐
{
   printf(" ");
}
printf("%d  ",i);
if((i + week - 1) % 7 == 6)//输出周六后换行
{
   printf("\n");
}
    }
    printf("\n\n");

    return (day + week) % 7;//返回下个月第一天星期几
}

int main()
{
    int year;
    int mon;
    int week;

    printf("please input the year\n");
    scanf("%d",&year);
    week = (year + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 ) % 7;//本年第一天星期几
    for(mon = 1;mon <= 12;mon++)//12个月循环
    {
week = print_mon(year,mon,week);
    }

    return 0;

}

这个程序理解起来简单,但总觉得会有更好的算法。


一个在努力中的未来程序员,如果有更好的想法,欢迎评论。