【C语言】经典——万年历

  1 #include <stdio.h>
  2 
  3 
  4 void Wnl(int y);
  5 
  6 int main(void)
  7 {
  8     int year;
  9     printf("请输入年份(大于1990):");
 10     scanf("%d", &year);
 11     Wnl(year); //调用函数Wnl打印当年日历
 12     return 0;
 13 }
 14 
 15 /*
 16 函数功能:打印日历
 17 函数形参:年份
 18 函数返回值:无
 19 备注:无
 20 */
 21 void Wnl(int y){
 22     // 1   2   3   4   5  6   7   8   9    10   11   12
 23     //31  28  31  30  31  30  31  31  30   31   30   31
 24     int mon;
 25     int rn = 0;  //闰年标志
 26     int sum = 0;//存储天数
 27     int mon_one_day = 0;//知道每个月第一天的星期几
 28     int mon_days = 0;//保存每个月的总天数
 29     int i, j = 0;
 30     int k = 0;
 31 
 32     int w = (y + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400) % 7; //记录所求年份第一天的星期数
 33 
 34     if( (y%4 ==0)&&(y%100 != 0) || (y%400 == 0) )  //闰年
 35     {
 36         rn = 1;
 37     }
 38 
 39     for(mon = 1; mon <= 12; mon++)
 40     {
 41 
 42         sum = 0;         //总天数
 43         mon_days = 0;    //每个月的天数
 44         mon_one_day = 0; //用于记录每个月的第一天的星期数
 45         j = k;
 46 
 47         switch(mon)//记录每个月的天数
 48         {
 49             case 12: mon_days = 31; break;
 50             case 11: mon_days = 30; break;
 51             case 10: mon_days = 31; break;
 52             case  9: mon_days = 30; break;
 53             case  8: mon_days = 31; break;
 54             case  7: mon_days = 31; break;
 55             case  6: mon_days = 30; break;
 56             case  5: mon_days = 31; break;
 57             case  4: mon_days = 30; break;
 58             case  3: mon_days = 31; break;
 59             case  2: mon_days = 28 + rn; break; //加上闰年(0或1)
 60             case  1: mon_days = 31; break;
 61         }
 62 
 63         switch(mon) //记录从1月到当前月份的总天数
 64         {
 65             case 12: sum += 30;
 66             case 11: sum += 31;
 67             case 10: sum += 30;
 68             case  9: sum += 31;
 69             case  8: sum += 31;
 70             case  7: sum += 30;
 71             case  6: sum += 31;
 72             case  5: sum += 30;
 73             case  4: sum += 31;
 74             case  3: sum += 28 + rn;
 75             case  2: sum += 31;
 76             case  1: sum += 0;
 77         }
 78 
 79         sum += (w-1); //减去当天
 80         mon_one_day = sum % 7;  //每个月第一天的星期数
 81 
 82         /*********打印***********/
 83         printf("/***********%d月**************/\r\n", mon);
 84         printf("  一  二  三  四  五  六  日\r\n");
 85 
 86 
 87         for(i = 0 ; i < mon_one_day; i++)  //对齐
 88         {
 89             printf("    ");
 90             j++;
 91         }
 92 
 93         for(i = 1; i <= mon_days; i++)
 94         {
 95             printf("%4d", i); //对齐
 96             j++;
 97             if(j%7 == 0)    //每7天换行
 98             {
 99                 printf("\r\n");
100             }
101         }
102 
103         printf("\r\n");
104     }
105 }

注:该程序可以作为C语言基本语句的作业题

注:switch语句中如果没有break,运行完所跳转语句后会继续运行之后的语句,例如

运行:

  int i = 1,sum = 0;

  switch(i){
case 1: sum += 1; case 2: sum += 2; case 3: sum += 3; }
  后,sum的值为0+1+2+3 = 6

猜你喜欢

转载自www.cnblogs.com/xdorz/p/11391019.html