fjfjfjfjfjfj

[C语言学习]之打印万年历

#include "stdio.h"

//functions define
void outputcalendar(void);
void outputtitle(int);
void outputbody(int *, int maxday);
int *getweek(int, int, int);

//variables and constants
const char CON_STR4SPACE[5]  = "    ";
const char CON_STR1SPACE[2] = " ";
const int CON_DAYCOUNTS31 = 31;
const int CON_DAYCOUNTS30 = 30;
int daycountsofFeb;

 

//function main
int main()
{
  outputcalendar();
    return 0;
}


//functions
void outputcalendar(void)
{
 while(true)
 {
  int year,month;
  int *weekp;

  printf("please input year:");
  scanf("%d",&year);

  if(year < 0 || year > 9999)
  {
   printf("the input year must between 0 to 9999!\n",year);
   continue;
  }

  //get week the first day of year
  weekp = getweek(year,1,1);

  //get the days of Feb
  daycountsofFeb = 28;
  if(year%4==0 && year%100!=0 || year%400==0)
   daycountsofFeb++;

  printf("[Calendar Of Year %d]\n",year);

  for(month=1; month<13; ++month)
  {
   outputtitle(month);

   switch (month)
   {
    case 1:
     /*no break;*/
    case 3:
     /*no break;*/
    case 5:
     /*no break;*/
    case 7:
     /*no break;*/
    case 8:
     /*no break;*/
    case 10:
     /*no break;*/
    case 12:
     outputbody(weekp, 31);
     break;
    case 2:
     outputbody(weekp, daycountsofFeb);
     break;
    case 4:
     /*no break;*/
    case 6:
     /*no break;*/
    case 9:
     /*no break;*/
    case 11:
     outputbody(weekp, 30);
     break;
   }//end of switch
   printf("\n");
  }//end of For
  printf("\n");
 }//end of while
}//end of function

void outputtitle(int month)
{
 char *monthname[4] ;
 switch (month)
 {
  case 1:
   *monthname = "Jan";
   break;
  case 2:
   *monthname = "Feb";
   break;
  case 3:
   *monthname = "Mar";
   break;
  case 4:
   *monthname = "Apr";
   break;
  case 5:
   *monthname = "May";
   break;
  case 6:
   *monthname = "Jun";
   break;
  case 7:
   *monthname = "Jul";
   break;
  case 8:
   *monthname = "Aug";
   break;
  case 9:
   *monthname = "Sep";
   break;
  case 10:
   *monthname = "Oct";
   break;
  case 11:
   *monthname = "Nov";
   break;
  case 12:
   *monthname = "Dec";
   break;
 }//end of switch

 printf("------------%s------------\n",*monthname);
 printf("  S- -1- -2- -3- -4- -5- -6\n");
}
void outputbody(int *m, int maxday)
{
 int i,c = 0;
 for(i=1; i<=*m; i++)
 {
  c++;
  printf(CON_STR4SPACE);
 }
 for(i=1; i<=maxday; i++)
 {
  c++;
  if(c%7-1==0 && c!=1)
   printf("\n");
  if(i<10)
   printf(CON_STR1SPACE);
  printf(" %d ",i);
  *m = ++(*m)%7;
 }
}

int *getweek(int year, int month, int day)
{
 static int week;
 int *p;
 int lastyear, i, days = 0;
 int mont[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
 //char wek[][9] = { {'S','u','n','d','a','y'},
 //    {'M','o','n','d','a','y'},
 //    {'T','u','e','s','d','a','y'},
 //    {'W','e','d','n','s','d','a','y'},
 //    {'T','h','u','r','s','d','a','y'},
 //    {'F','r','i','d','a','y'},
 //    {'S','a','t','u','r','d','a','y'}
 //    };

 if (year%4==0||year%100==0||year%400==0)
  mont[2] += 1;

 if ((year < 0 || year > 9999) ||
  (month < 1 || month > 12) || 
  (day > mont[month] || day < 1)
  )
 {
  //error date return -1
  week = -1;
  p = &week;
  return p;
 }

 for (i=1;i<month;i++)
  days += mont[i];

 days += day;

 lastyear = year - 1;
 days += lastyear*365 + (int)(lastyear/4) - (int)(lastyear/100) + (int)(lastyear/400);
 week = days % 7;

 p = &week;
 return p;
}

 

posted on 2010-12-10 18:56  撬棍  阅读(279)  评论(0编辑  收藏  举报

导航