编程珠玑 3.4编写 处理日期问题的函数

日期问题:给定两个日子,计算这两个日子之间的天数;给定某个日子,返回它在一周中属于第几天;给定某年某月,打印出这一月份的日历

 

 

#include <iostream>

using namespace std;

typedef struct{

  int year;  

  int month;

  int day;

} Date;

 

int isLeap(int year);

int days(Date date);

int datejian(Date date1,Date date2);

int whichDay(Date date);

void printCalenda(Date date);

 

static int nums[12]={0,31,59,90,120,151,181,212,243,273,304,334};

 

void main() {  

  Date date1,date2;  

  int flag=-1;

    int day=0;

  printf("insert year:");  

  scanf("%d",&date1.year);  

  printf("insert month:");  

  scanf("%d",&date1.month);

  printf("insert day:");  

  scanf("%d",&date1.day);

  printf("The date1 is:%d-%d-%d\n",date1.year,date1.month,date1.day);

  printf("insert year:");

  scanf("%d",&date2.year);

  printf("insert month:");

  scanf("%d",&date2.month);

  printf("insert day:");

  scanf("%d",&date2.day);

  printf("The date2 is:%d-%d-%d\n",date2.year,date2.month,date2.day);  

  /*  flag=isLeap(date1.year);

  printf("This year is:%d\n",flag);

  day=days(date1);

  printf("The date is %d day of the year\n",day);  */

  printf("%d-%d-%d 和%d-%d-%d 相差的天数:%d \n",

    date1.year,date1.month,date1.day,date2.year,date2.month,date2.day,datejian(date1,date2));

    printf("今天是星期%d\n",whichDay(date1));  

  printf("该月的日历如下:\n");

  printCalenda(date1);

}

int isLeap(int year)   //判断是否是润年

{

  return ((year%4==0&&year%100!=0)||(year%400==0));

}

int days(Date date)  //计算该日期是该年的第几天。

   int leap=isLeap(date.year);  

  int days=nums[date.month-1]+date.day+(date.month>2&&leap?1:0); 

   return days;

}

int datejian(Date date1,Date date2) //两个日期相差的天数

{  

  int year1=date1.year;

    int year2=date2.year;

    int days1=days(date1);

  int days2=days(date2);

  int leapdays=0;    //统计两个年份之间的润年的个数

  int tempyear;  

  if(year1>year2){

     tempyear=year2;  

     while(tempyear<year1){

         leapdays+=isLeap(tempyear++);  //计算两个年份之间的润年的个数

      }

      days1+=(year1-year2)*365+leapdays;  

    return (days1-days2);

   }else{

      tempyear=year1;  

     while(year1<year2){

         leapdays+=isLeap(tempyear++);   //计算两个年份之间的润年的个数  

     }

     days2+=(year2-year1)*365+leapdays;  

     return (days2-days1);

   }

}

int whichDay(Date date) {

   //1912年1月1日,是星期一,也是民国元年。

   Date dateStart;

   dateStart.year=1912;

   dateStart.month=1;

   dateStart.day=1;

   int day=datejian(date,dateStart);

   return (day%7+1);

}

void printCalenda(Date date) {

   date.day=1;

   int day=whichDay(date);  //首先求的该月的一号是星期几

   //printf("该月的1号是星期%d\n",day);  

  printf("    %d年 %d月\n",date.year,date.month);

   printf(" 一 二 三 四 五 六 七 \n");

    int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

   int days;

  if(2!=date.month)  {

    days=mon[date.month-1];

  }else{  

    days=mon[date.month-1]+isLeap(date.year);

  }

   int i=1;

   int j;

   for(j=1;j<day;j++)   //j 用于计数,每7天打印一个换行。

      printf("   ");

  while(i<=days){   

    printf("%3d",i++);

    if(0==j%7){

      printf("\n");  

    }

    j++;

   }

  printf("\n");

}

 

posted @ 2013-02-28 09:30  淡看浮华  阅读(235)  评论(0编辑  收藏  举报