正文

万年历全集2006-01-02 15:14:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/9201.html

分享到:

程序可以实现如下三种功能:求某个日期对应的星期求某年某月有的天数 输出某年的日历.例如,打印2006年日历如下:--------------------------------------------------------------------------                               2006 年--------------------------------------------------------------------------               一   月                                二   月                周日 周一 周二 周三 周四 周五 周六  周日 周一 周二 周三 周四 周五 周六   1    3    5    7    9   11   13                    1    3    5    7   14   15   16   17   18   19   20     8    9   10   11   12   13   14   21   22   23   24   25   26   27    15   16   17   18   19   20   21   28   29   30   31                   22   23   24   25   26   27   28                  三   月                                四   月                周日 周一 周二 周三 周四 周五 周六  周日 周一 周二 周三 周四 周五 周六                  1    3    5    7                                   1    8    9   10   11   12   13   14     2    3    4    5    6    7    8   15   16   17   18   19   20   21     9   10   11   12   13   14   15   22   23   24   25   26   27   28    16   17   18   19   20   21   22   29   30   31                        23   24   25   26   27   28   29                                       30                                                五   月                                六   月                周日 周一 周二 周三 周四 周五 周六  周日 周一 周二 周三 周四 周五 周六        1    3    5    7    9   11                         1    3    5   12   13   14   15   16   17   18     6    7    8    9   10   11   12   19   20   21   22   23   24   25    13   14   15   16   17   18   19   26   27   28   29   30   31         20   21   22   23   24   25   26                                       27   28   29   30                                 七   月                                八   月                周日 周一 周二 周三 周四 周五 周六  周日 周一 周二 周三 周四 周五 周六                                 1               1    3    5    7    9    2    3    4    5    6    7    8    10   11   12   13   14   15   16    9   10   11   12   13   14   15    17   18   19   20   21   22   23   16   17   18   19   20   21   22    24   25   26   27   28   29   30   23   24   25   26   27   28   29    31                                 30   31                                                                               九   月                                十   月                周日 周一 周二 周三 周四 周五 周六  周日 周一 周二 周三 周四 周五 周六                            1    3     1    3    5    7    9   11   13    4    5    6    7    8    9   10    14   15   16   17   18   19   20   11   12   13   14   15   16   17    21   22   23   24   25   26   27   18   19   20   21   22   23   24    28   29   30   31                  25   26   27   28   29   30                                                           十一 月                                十二 月                周日 周一 周二 周三 周四 周五 周六  周日 周一 周二 周三 周四 周五 周六                  1    3    5    7                              1    3    8    9   10   11   12   13   14     4    5    6    7    8    9   10   15   16   17   18   19   20   21    11   12   13   14   15   16   17   22   23   24   25   26   27   28    18   19   20   21   22   23   24   29   30                             25   26   27   28   29   30   31   原代码如下: 一,非打印版(:即只能输出到屏幕,不可输出到文件)   /*万年历全集:程序可以实现如下三种功能:求某个日期对应的星期求某年某月有的天数 输出某年的日历*//*2006-1-2   梁见斌*/#include<stdio.h>#include<stdlib.h> struct mon{ int maxdata; int data;}; void SeekWeekDay(void); //求某个日期对应的星期函数 int WeekDay(int year, int month, int day); //根据输入的日期,返回对应的星期void HowManyDays(void);//求某年某月有的天数函数 int MonthDays(int year, int month);//根据输入的年号和月份,返回该月的天数    void PrintWeek(int weekday);//打印星期几 void PrintMonth(int month); //打印月份 void PrintData(); //打印日历 int main(void){ int choice;  while(1) {   puts("------------------------------------------");   puts("请输入您的选择:");   puts("输入1求某个日期对应的星期");   puts("输入2求某年某月有的天数");   puts("输入3输出某年的日历");   puts("输入4结束程序");   puts("------------------------------------------");  scanf("%d", &choice); fflush(stdin);  switch(choice)  {   case 1: SeekWeekDay();  break;   case 2: HowManyDays();  break;   case 3: PrintData();  break;   case 4: return 0;   default: puts("输入错误,请重新输入"); break;  }  printf("\n");   printf("\n"); }  system("pause");  return 0;} void HowManyDays(void) //求某年某月有的天数函数{ int year, month, days;  puts("请输入年号和月份:"); scanf("%d%d", &year, &month); fflush(stdin); printf("你的输入为 %d年%d月,", year, month); days = MonthDays(year, month); //根据输入的年号和月份,返回该月的天数     printf(" %d年%d月有%d天\n", year, month, days);}void SeekWeekDay(void) //求某个日期对应的星期函数  { int year, month, day, weekday;  puts("请输入年,月, 日:"); scanf("%d%d%d", &year, &month, &day); fflush(stdin); printf("你的输入为 %d年%d月%d日\n", year, month, day); weekday = WeekDay(year, month, day); //根据输入的日期,返回对应的星期 printf("这天是 "); PrintWeek(weekday); //打印星期几 }void PrintWeek(int weekday)//打印星期几 { switch(weekday) {  case 0 : printf("%s","周日 "); break;  case 1 : printf("%s","周一 "); break;  case 2 : printf("%s","周二 "); break;  case 3 : printf("%s","周三 "); break;  case 4 : printf("%s","周四 "); break;  case 5 : printf("%s","周五 "); break;  case 6 : printf("%s","周六 "); break; }}void PrintMonth(int month)  //打印月份 { switch(month) {  case 1 : printf("%s","一   月 "); break;  case 2 : printf("%s","二   月 "); break;  case 3 : printf("%s","三   月 "); break;  case 4 : printf("%s","四   月 "); break;  case 5 : printf("%s","五   月 "); break;  case 6 : printf("%s","六   月 "); break;   case 7 : printf("%s","七   月 "); break;  case 8 : printf("%s","八   月 "); break;  case 9 : printf("%s","九   月 "); break;  case 10: printf("%s","十   月 "); break;  case 11: printf("%s","十一 月 ");   break;  case 12: printf("%s","十二 月 ");   break; }}int WeekDay(int year, int month, int day) //根据输入的日期,返回对应的星期{ int i; int run=0, ping=0; long sum;  for(i=1; i<year; i++) //累积闰年和平年  {  if(i%4==0 && i%100!=0 || i%400==0)   run++;  else   ping++; } sum = 366*run + 365*ping; for(i=1; i<month; i++)  sum += MonthDays(year, i); sum += day;   //计算总天数  return (int)sum%7;}int MonthDays(int year, int month)//根据输入的年号和月份,返回该月的天数    { switch(month) {  case 1:  case 3:  case 5:  case 7:  case 8:  case 10:  case 12:  return 31;  case 4:  case 6:  case 9:  case 11:  return 30;  case 2:   if(year%4==0 && year%100!=0 || year%400==0)        return 29;        else        return 28;  default: puts("这是一个错误的月份!"); system("pause"); return 0;   }} void PrintData(void)//打印日历,对输出格式的控制较复杂 { struct mon month[13]; int i, j, k; int year, mon, week;  puts("请输入年号:"); scanf("%d", &year);  for(i=1; i<13; i++) //存储该年每个月的总天数和初始日期  {  month[i].data = 1;  month[i].maxdata = MonthDays(year, i); } for(i=0; i<6; i++) //总共输出6排  {  for(j=1; j<=2; j++) //每排输出2个月   {   mon = 2*i + j;   printf("%15s", " ");   PrintMonth(mon);   //第一行打印月份    printf("%15s", " ");   if(j==1)    printf("\t");  }  printf("\n");   printf("\n");  for(j=1; j<=2; j++)  {   for(k=0; k<7; k++)   {     PrintWeek(k);   //第2行打印星期    }   printf("\t");  }  printf("\n");   for(j=1; j<=2; j++)  {   mon = 2*i + j;   week = WeekDay(year, mon, 1);//根据输入的日期,返回对应的星期   printf("%*d   ", week*5+2, month[mon].data++); //控制输出格式,把每月的1日打印在对应星期的下面    week++;   while(week < 7) //接着在该行打印该周剩余的日期    {    printf("%2d   ", month[mon].data++);    week++;   }   if(j==1)    printf("\t");  }  printf("\n");   printf("\n");//从第4行起打印该月剩余的日期,每7个一行;直至该月日期打印完毕   while(month[2*i+1].data<=month[2*i+1].maxdata || month[2*i+2].data<=month[2*i+2].maxdata)   {   for(j=1; j<=2; j++)   {    mon = 2*i + j;    for(k=0; k<7; k++)    {  //如果该月日期未打印完,打印该日期      if(month[mon].data<=month[mon].maxdata)      printf("%2d   ", month[mon].data++);     else  //否则输出空格       printf("     ");    }    if(j==1)    printf("\t");   }   printf("\n"); printf("\n");  }  printf("\n");  }} 二,打印版(:即既能输出到屏幕,又可输出到文件) //*万年历全集:程序可以实现如下三种功能:求某个日期对应的星期求某年某月有的天数 输出某年的日历*//*2006-1-2   梁见斌*/#include<stdio.h>#include<stdlib.h> struct mon{ int maxdata; int data;}; void SeekWeekDay(void); //求某个日期对应的星期函数 int WeekDay(int year, int month, int day); //根据输入的日期,返回对应的星期void HowManyDays(void);//求某年某月有的天数函数 int MonthDays(int year, int month);//根据输入的年号和月份,返回该月的天数    void PrintWeek(int weekday, FILE *fp);//打印星期几 void PrintMonth(int month, FILE *fp); //打印月份 void PrintData(); //打印日历 int main(void){ int choice;  while(1) {   puts("------------------------------------------");   puts("请输入您的选择:");   puts("输入1求某个日期对应的星期");   puts("输入2求某年某月有的天数");   puts("输入3输出某年的日历");   puts("输入4结束程序");   puts("------------------------------------------");  scanf("%d", &choice); fflush(stdin);  switch(choice)  {   case 1: SeekWeekDay();  break;   case 2: HowManyDays();  break;   case 3: PrintData();  break;   case 4: return 0;   default: puts("输入错误,请重新输入"); break;  }  printf("\n");   printf("\n"); }  system("pause");  return 0;} void HowManyDays(void) //求某年某月有的天数函数{ int year, month, days;  puts("请输入年号和月份:"); scanf("%d%d", &year, &month); fflush(stdin); printf("你的输入为 %d年%d月,", year, month); days = MonthDays(year, month); //根据输入的年号和月份,返回该月的天数     printf(" %d年%d月有%d天\n", year, month, days);}void SeekWeekDay(void) //求某个日期对应的星期函数  { FILE *fp; int year, month, day, weekday;  if ( (fp=fopen("wnlweek.txt","w+")) == NULL)  {    fprintf(stderr,"\nError opening file\n");   exit(1);  }  puts("请输入年,月, 日:"); scanf("%d%d%d", &year, &month, &day); fflush(stdin); printf("你的输入为 %d年%d月%d日\n", year, month, day); weekday = WeekDay(year, month, day); //根据输入的日期,返回对应的星期 printf("这天是 "); PrintWeek(weekday, fp); //打印星期几 }void PrintWeek(int weekday, FILE *fp)//打印星期几 { switch(weekday) {  case 0 : fprintf(stdout, "%s","周日 "); fprintf(fp, "%s","周日 "); break;  case 1 : fprintf(stdout, "%s","周一 "); fprintf(fp, "%s","周一 ");break;  case 2 : fprintf(stdout, "%s","周二 "); fprintf(fp, "%s","周二 ");break;  case 3 : fprintf(stdout, "%s","周三 "); fprintf(fp, "%s","周三 ");break;  case 4 : fprintf(stdout, "%s","周四 "); fprintf(fp, "%s","周四 "); break;  case 5 : fprintf(stdout, "%s","周五 "); fprintf(fp, "%s","周五 ");break;  case 6 : fprintf(stdout, "%s","周六 "); fprintf(fp, "%s","周六 ");break; }}void PrintMonth(int month, FILE *fp)  //打印月份{ switch(month) {  case 1 : fprintf(stdout, "%s","一   月 "); fprintf(fp, "%s","一   月 ");break;  case 2 : fprintf(stdout, "%s","二   月 "); fprintf(fp, "%s","二   月 ");break;  case 3 : fprintf(stdout, "%s","三   月 "); fprintf(fp, "%s","三   月 ");break;  case 4 : fprintf(stdout, "%s","四   月 "); fprintf(fp, "%s","四   月 ");break;  case 5 : fprintf(stdout, "%s","五   月 "); fprintf(fp, "%s","五   月 ");break;  case 6 : fprintf(stdout, "%s","六   月 "); fprintf(fp, "%s","六   月 ");break;   case 7 : fprintf(stdout, "%s","七   月 "); fprintf(fp, "%s","七   月 ");break;  case 8 : fprintf(stdout, "%s","八   月 "); fprintf(fp, "%s","八   月 ");break;  case 9 : fprintf(stdout, "%s","九   月 "); fprintf(fp, "%s","九   月 ");break;  case 10: fprintf(stdout, "%s","十   月 "); fprintf(fp, "%s","十   月 ");break;  case 11: fprintf(stdout, "%s","十一 月 "); fprintf(fp, "%s","十一 月 ");  break;  case 12: fprintf(stdout, "%s","十二 月 "); fprintf(fp, "%s","十二 月 ");  break; }}int WeekDay(int year, int month, int day)  //根据输入的日期,返回对应的星期{ int i; int run=0, ping=0; long sum;  for(i=1; i<year; i++)  //累积闰年和平年  {  if(i%4==0 && i%100!=0 || i%400==0)   run++;  else   ping++; } sum = 366*run + 365*ping; for(i=1; i<month; i++)  sum += MonthDays(year, i); sum += day;   //计算总天数  return (int)sum%7;}int MonthDays(int year, int month)//根据输入的年号和月份,返回该月的天数    { switch(month) {  case 1:  case 3:  case 5:  case 7:  case 8:  case 10:  case 12:  return 31;  case 4:  case 6:  case 9:  case 11:  return 30;  case 2:   if(year%4==0 && year%100!=0 || year%400==0)        return 29;        else        return 28;  default: puts("这是一个错误的月份!"); system("pause"); return 0;   }} void PrintData(void)//打印日历,对输出格式的控制较复杂{ FILE *fp; struct mon month[13]; int i, j, k; int year, mon, week;  if ( (fp=fopen("wnldata.txt","w+")) == NULL)  {    fprintf(stderr,"\nError opening file\n");   exit(1);  }  puts("请输入年号:"); scanf("%d", &year); fprintf(stdout, "--------------------------------------------------------------------------\n"); fprintf(fp, "--------------------------------------------------------------------------\n"); fprintf(stdout, "%35d %s\n", year, "年"); fprintf(fp, "%35d %s\n", year,"年");  fprintf(stdout, "--------------------------------------------------------------------------\n"); fprintf(fp, "--------------------------------------------------------------------------\n"); for(i=1; i<13; i++) //存储该年每个月的总天数和初始日期  {  month[i].data = 1;  month[i].maxdata = MonthDays(year, i); }  for(i=0; i<6; i++) //总共输出6排  {  for(j=1; j<=2; j++)//每排输出2个月   {   mon = 2*i + j;   fprintf(stdout, "%15s", " ");  fprintf(fp, "%15s", " ");   PrintMonth(mon, fp);  //第一行打印月份    fprintf(stdout, "%15s", " ");  fprintf(fp, "%15s", " ");   if(j==1)   { fprintf(stdout, "\t");     fprintf(fp, "\t"); }  }  fprintf(stdout, "\n");  fprintf(stdout, "\n");  fprintf(fp, "\n");  fprintf(fp, "\n");  for(j=1; j<=2; j++)  {   for(k=0; k<7; k++)   {     PrintWeek(k, fp);    //第2行打印星期    }   fprintf(stdout, "\t");   fprintf(fp, "\t");  }  printf("\n");    fprintf(fp, "\n");  for(j=1; j<=2; j++)  {   mon = 2*i + j;   week = WeekDay(year, mon, 1);   //根据输入的日期,返回对应的星期   //控制输出格式,把每月的1日打印在对应星期的下面    fprintf(stdout, "%*d   ", week*5+2, month[mon].data);  fprintf(fp, "%*d   ", week*5+2, month[mon].data);   month[mon].data++;   week++;   while(week < 7) //接着在该行打印该周剩余的日期    {    fprintf(stdout, "%2d   ", month[mon].data++);  fprintf(fp, "%2d   ", month[mon].data++);    week++;   }   if(j==1)   { fprintf(stdout, "\t");   fprintf(fp, "\t"); }  }  fprintf(stdout, "\n");  fprintf(stdout, "\n");   fprintf(fp, "\n");   fprintf(fp, "\n");  //从第4行起打印该月剩余的日期,每7个一行;直至该月日期打印完毕   while(month[2*i+1].data<=month[2*i+1].maxdata || month[2*i+2].data<=month[2*i+2].maxdata)   {   for(j=1; j<=2; j++)   {    mon = 2*i + j;    for(k=0; k<7; k++)    {     if(month[mon].data<=month[mon].maxdata)     {  //如果该月日期未打印完,打印该日期       fprintf(stdout, "%2d   ", month[mon].data);        fprintf(fp, "%2d   ", month[mon].data);       month[mon].data++;     }     else    //否则输出空格      { fprintf(stdout, "     ");     fprintf(fp,"     "); }    }    if(j==1)    { fprintf(stdout, "\t");   fprintf(fp, "\t");  }   }   fprintf(stdout, "\n"); fprintf(stdout, "\n");   fprintf(fp, "\n"); fprintf(fp, "\n");  }  fprintf(stdout, "\n");  fprintf(fp, "\n");  } fclose(fp);}

阅读(2801) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册