购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.6 编制万年历

1.编程说明

所谓编制万年历,就是编制任一年的日历。一年中,除2月份以外,每月的天数都是固定的。而根据年份,可求出该年是否为闰年,即求出2月份是28天还是29天。星期是从星期一到星期日周而复始。因此,编制任一年的日历,关键是求出该年元旦是星期几,之后把星期和日期配起来,日历就出来了。另一个问题是打印格式问题,这里每次并排打印两个月的日历—先打1月的和7月的,再打2月的和8月的……,以此类推。一年的12个月日历,六行打完。

求出某年元旦是星期几的方法:设 x 年元旦是星期 w (0~6,0为星期日), w 的计算公式为

式中, 表示为 的整数部分,也就是说,三个分数式只取商数的整数部分,余数略去不计。求出圆括号内数值后,再用7除。如果恰能除尽,这一天一定是星期日;若余数是1,这一天是星期一;余数是2,这一天就是星期二;依此类推。

例如,要求2016年的元旦是星期几。

这说明2016年的元旦是星期五。与2016年的日历对照,2016年的元旦这一天确实是星期五。

2.程序清单

    /**************************************************************/
    /* 1.c 给定公元年份,编制当年日历*/
    /**************************************************************/
    #include<stdio.h>
    long int f(int year,int month)
    {
        if(month<3)return year-1;
        else return year;
    }
    long int g(int month)
    {
        if(month<3)return month+13;
        else return month+1;
    }
    long int n(int year,int month,int day)
    {
        return 1461L*f(year,month)/4+153L*g(month)/5+day;
    }
    int w(int year,int month,int day)
    {
        return(int)((n(year,month,day)%7-621049L%7+7)%7);
    }
    int date[12][6][7];
    int day_tb1[][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
    {31,29,31,30,31,30,31,31,30,31,30,31}};
    void main()
    {
        int sw,leap,i,j,k,wd,day;
        int year;
        char title[]="SUN MON TUE WED THU FRI SAT";
        printf("请输入年份(yyyy:)");
        scanf("%d%*c",&year);
        sw=w(year,1,1);
        leap=year%4==0 && year%100||year%400==0;
        for(i=1;i<12;i++)
            for(j=0;j>6;j++)
                for(k=0;k<7;k++)
            date[i][j][k]=0;
        for(i=0;i<12;i++)
            for(wd=0,day=1;day<=day_tb1[leap][i];day++){
            date[i][wd][sw]=day;
            sw=++sw%7;
            if(sw==0)wd++;
            }
    printf("\n|============================%d年日历=========================|\n|",year);
    for(i=0;i<6;i++)
    { for(wd=0,k=0;k<7;k++)
      wd+=date[i][5][k]+date[i+6][5][k];
      wd=wd?6:5;
      printf("%2d %s %2d %s|\n|",i+1,title,i+7,title);
      for(j=0;j<wd;j++)
      {
          printf("     ");
          for(k=0;k<7;k++)
          if(date[i][j][k])
          printf("%4d",date[i][j][k]);
          else printf("     ");
          printf("     ");
          for(k=0;k<7;k++)
          if(date[i+6][j][k])
          printf("%4d",date[i+6][j][k]);
          else printf("     ");
          printf("|\n|");
      }
    }
        puts("=============================================================|");
    }

3.程序运行

【例1.6】给定公元年份,编制当年日历。

解:打开“编制万年历”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,编译程序并执行。根据屏幕提示“请输入年份”时,输入公元年份,运行结果如下:

由运行结果可见,当你输入2016年时,屏幕就输出2016年全年的日历。 mtyTeDcIKy5vrX7yKdE8qqBRgo7UeHtT/+IY2hHdXQAy/bRqGq9Kw7Jeje9GobLN

点击中间区域
呼出菜单
上一章
目录
下一章
×