QQ网名大全

急!~~~~ 用c或者c++编写 打印万年历 的程序 要求如下

基本功能已经实现:

/*****************************************************************

 *author  :wacs5

 *date   :**(yyymmdd)

 *email   :wacs5@126.com

 *function  :用c编写、打印万年历

 *targe   :http://

 *compiler  :tc2.0、gcc通过(如果是vc++的话,去掉#include <conio.h>)

 *    *另外getch()函数可以换成system("pause")语句.

 *****************************************************************/

#include <time.h>

#include <math.h>

#include <stdio.h>

#include <conio.h>

int daysinmonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int daysinyear[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};

char month**[13][4]={"","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};

char week**eng[8][4]={"sun","mon","tue","wed","thu","fri","sat"};

char week**chs[8][3]={"天","一","二","三","四","五","六"};

int main()

{

 int year,month,day;

 int flag=1;  /*是否输出到文件,1为输出,0为不输出*/

 long date1;

 

 int **loopyear(int year);

 int checkday(int year,int month,int day);

 long date2long(int year,int month,int day);

 int week(long day);

 int printnow(int flag);

 int monthcalendar(int year,int month,int flag);

 int yearcalendar(int year,int flag);

 int printnummask(int year,char ch,file *fp);

 

 printnow(flag);  /*输出当月月历并输出时间,flag=1代表输出到文件*/ 

 

 printf("year=");

 scanf("%d",&year);

 yearcalendar(year,flag); /*输出2010年年历,flag=1代表输出到文件*/

 

 getch();

}

/*判断闰年*/

int **loopyear(int year)

{

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

}

/*检查日期的合法性*/

int checkday(int year,int month,int day)

{

 int **loopyear(int year);

 /*年月日大于零,月份为1-12,日期为1至当月最大的天数,注意二月份的闰月*/

 if (year>=0 && month>0 && month<=12 && day>0 && \

  day<=( daysinmonth[month]+(month==2&&**loopyear(year)) )  )

 return 1;

 else

 return 0;

}

/*返回year年month月day日到0000年1月0日(抽象的时间)的天数*/

long date2long(int year,int month,int day)

{

 long days;

 days=year*365l+year/4-year/100+year/400 + (year>0);   /*year年1月0日经历的天数,0年是闰年*/

 days+=daysinyear[month-1]+ (month>2&&**loopyear(year)) + day;  /*加上月份以及天数*/

 return days;

}

/*计算星期*/

int week(long days)

{

 return (days+5)%7; 

}

 /*输出现在时刻,并输出当月日历*/

int printnow(int flag) 

{

 time_t now;

 struct tm *tm_1; 

 

 int week(long day);

 int checkday(int year,int month,int day);

 long date2long(int year,int month,int day);

 int monthcalendar(int year,int month,int flag);

 

 time(&now);

 tm_1=localtime(&now);

 

 monthcalendar(tm_1->tm_year+1900,tm_1->tm_mon+1,flag);

 

 printf("今天是:%4d年%02d月%02d日,星期%s\n",tm_1->tm_year+1900,tm_1->tm_mon+1,tm_1->tm_mday,week**chs[tm_1->tm_wday]);

 printf("当前时间是:%02d时%02d分%02d秒\n",tm_1->tm_hour,tm_1->tm_min,tm_1->tm_sec);

 return 1;

}

/*输出月历*/

int monthcalendar(int year,int month,int flag)  /*flag=1时,写文件*/

{

 int i,k,day,week;

 long days;

 char filename[80];

 int week(long day);

 int checkday(int year,int month,int day);

 long date2long(int year,int month,int day);

 file *fp;

 if (flag)

 {

  sprintf(filename,"%04d_%02d.txt",year,month);

  fp=fopen(filename,"w");

  if (fp==**)

  {

   printf("file open error in function:monthcalendar\npress any key to exit:");

   getch();

   exit(-1);

  } 

 }

 

 day=1;

 if (!checkday(year,month,day))

 {

  printf("format:%d-%d-1(yyyy-mm-dd) ** invaild in function:monthcalendar\n",year,month);

  return 0;

 }

 days=date2long(year,month,day);

 week=week(days);

 

 k=(4*7-9)/2;

 for (i=0;i<k;i++)

 filename[i]=' ';

 filename[k]='\0';

 

 printf("monthcalendar:\n%s%d--%s\n",filename,year,month**[month]);

 if (flag)

 fprintf(fp,"%s%d--%s\n",filename,year,month**[month]);

 for (i=0;i<7;i++)

 {

  printf("%s ",week**eng[i]);

  if (flag)

  fprintf(fp,"%s ",week**eng[i]);

 }

  

 printf("\n"); 

 if (flag)

 fprintf(fp,"\n");

 

 for (i=0;i<week;i++)

 {

  printf("    ");

  if (flag)

  fprintf(fp,"    ");

 }

  

 for (i=day;i<=daysinmonth[month]+(month==2)*(**loopyear(year));i++) /*闰年的2月份,要加一*/

 {

  printf("%3d ",i);

  if (flag)

  fprintf(fp,"%3d ",i);

  if ((i+week)%7==0)

  {

   printf("\n");

   if (flag);

   fprintf(fp,"\n");

  }   

 }

 printf("\n");

 if (flag)

 {

  fprintf(fp,"\n");

  fclose(fp);

 }

 return 1;

}

/*输出年历*/

int yearcalendar(int year,int flag)

{

 int month_col=2; /*每行几个月历*/

 int space_col=4; /*两个月历的空格数*/

 int month_row=(int)ceil(12.0/month_col);

 int line,end_day[13],keepgoing[13]={1};

 int i,j,k,month,day[13],week[13];

 long days[13];

 char space[3][80];

 int week(long day);

 int checkday(int year,int month,int day);

 long date2long(int year,int month,int day);

 int printnummask(int year,char ch,file *fp);

 

 file *fp;

 if (flag)

 {

  char filename[80];

  sprintf(filename,"%04d.txt",year);

  fp=fopen(filename,"w");

  if (fp==**)

  {

   printf("file open error in function:yearcalendar\npress any key to exit:");

   getch();

   exit(-1);

  } 

 }

 

 for (month=1;month<=12;month++)

 {

  day[month]=1;

  if (!checkday(year,month,day[month]))

  {

   printf("format:%d-%d-1(yyyy-mm-dd) ** invaild in function:yearcalendar\n",year,month);

   return 0;

  }

  days[month]=date2long(year,month,day[month]);

  week[month]=week(days[month]);

  keepgoing[month]=1;

 }

 

 k=(7*4-3)/2;

 for (i=0;i<k;i++)  /*月份标识前空格*/

 space[0][i]=' ';

 space[0][i]='\0'; 

 for (i=0;i<7*4-3-k;i++) /*月份标识后空格*/

 space[1][i]=' ';

 space[1][i]='\0';

 for (i=0;i<space_col;i++) /*两列之间的空格*/

 space[2][i]=' ';

 space[2][i]='\0';

 

 printnummask(year,'*',stdout);

 printnummask(year,'*',fp);

 

 month=1;

 for (i=0;i<month_row;i++)

 {

  for (j=0;j<month_col;j++) /*输出月份的缩写*/

  {

   printf("%s%s%s",space[0],month**[month+j],space[1]);  /*前导空格,月份缩写,后导空格*/

   if (flag)

   fprintf(fp,"%s%s%s",space[0],month**[month+j],space[1]);

   if (j<month_col-1)  /*月份列与列之间的空格*/

   {

    printf("%s",space[2]);

    if (flag)

    fprintf(fp,"%s",space[2]);

   }   

  }

  printf("\n");  /*换行*/

  if (flag)

  fprintf(fp,"\n"); 

  

  for (j=0;j<month_col;j++) 

  {

   for (k=0;k<7;k++)   /*星期的缩写*/

   {

    printf("%s ",week**eng[k]);

    if (flag)

    fprintf(fp,"%s ",week**eng[k]);

   }

   if (j<month_col-1)  /*月份列与列之间的空格*/

   {

    printf("%s",space[2]);

    if (flag)

    fprintf(fp,"%s",space[2]);

   }   

  }

  printf("\n");  /*换行*/

  if (flag)

  fprintf(fp,"\n"); 

  

  for (j=0;j<month_col;j++) /*横线*/

  {

   for (k=0;k<7;k++)   /*横线*/

   {

    printf("____",week**eng[k]);

    if (flag)

    fprintf(fp,"____",week**eng[k]);

   }

   if (j<month_col-1)  /*月份列与列之间的空格*/

   {

    printf("%s",space[2]);

    if (flag)

    fprintf(fp,"%s",space[2]);

   }   

  }

  printf("\n");  /*换行*/

  if (flag)

  fprintf(fp,"\n"); 

  

  for (j=0;j<month_col;j++)/*第一行*/

  {

   for (k=0;k<week[month+j];k++) /*1号之前的放空*/

   {

    printf("    ");

    if (flag)

    fprintf(fp,"    ");

   }

   for (k=1;k<=7;k++) 

   {

    printf("%3d ",k);

    if (flag)

    fprintf(fp,"%3d ",k);

    if ((k+week[month+j])%7==0)

    {

     end_day[month+j]=k+1;

     printf("%s",space[2]);

     if (flag)

     fprintf(fp,"%s",space[2]);

     break;

    }

   }

  }

  printf("\n");  /*换行*/

  if (flag)

  fprintf(fp,"\n"); 

 

  for (line=0;line<5;line++)

  {

   for (j=0;j<month_col;j++)

   {

    if (keepgoing[month+j]==0)  /*补一行空格行*/

     for (k=0;k<7;k++)

     {

      printf("    ");

      if (flag)

      fprintf(fp,"    ");

     }

    else

    {

     for (k=end_day[month+j];k<=daysinmonth[month+j]+(month==2)*(**loopyear(year));k++)

     {

      printf("%3d ",k);

      if (flag)

      fprintf(fp,"%3d ",k);

      if ((k+week[month+j])%7==0)

      {

       end_day[month+j]=k+1;

       break;

      }

     }

     if (k>=daysinmonth[month+j]+(month==2)*(**loopyear(year)))

      keepgoing[month+j]=0;     

     if (k>daysinmonth[month+j]+(month==2)*(**loopyear(year))) /*补空格*/     

     {

      for (;k<100;k++)

      {

       printf("    ");

       if (flag)

       fprintf(fp,"    ");

       if ((k+week[month+j])%7==0)

        break;

      }

     }

    }

    if (j<month_col-1)  /*月份列与列之间的空格*/

    {

     printf("%s",space[2]);

     if (flag)

     fprintf(fp,"%s",space[2]);

    }

   }   

   printf("\n"); /*换行*/

   if (flag)

   fprintf(fp,"\n"); 

   

   

   /*每行中各个月份是否都已经输出完毕*/

   k=0;

   for (j=0;j<month_col;j++)

   k+=keepgoing[month+j];

   if (k==0)

    break;

  

  }

  month += month_col;

  printf("\n");  /*换行*/

  if (flag)

  fprintf(fp,"\n"); 

 }

 

 

 if (flag)

 fclose(fp);

 return 1;

}

/*数字模输出*/

int printnummask(int year,char ch,file *fp)

{

 /*5*5数字模*/

 int mask[10][5]={ {31,17,17,17,31},{ 1, 1, 1, 1, 1},\

     {31,1 ,31,16,31},{31, 1,31, 1,31},\

     {17,17,31, 1, 1},{31,16,31, 1,31},\

     {31,16,31,17,31},{31, 1, 1, 1, 1},\

     {31,17,31,17,31},{31,17,31, 1,31}};

 int digit[16]={0};

 char space=' ';

 int i,j,k,n;

 

 n=0;

 while(year)

 {

  digit[n++]=year%10;

  year/=10;

 }

 for (i=0;i<5;i++)  /*行*/

 {

  for (k=0;k<n;k++) /*字的第i行*/

  {

    for (j=0;j<5;j++) /*列*/

   {

    if ( mask[digit[n-1-k]][i] & (1<<(4-j)) )

    fprintf(fp,"%c",ch);

    else

    fprintf(fp,"%c",space);

   }

   fprintf(fp,"%c",space);

  }

  fprintf(fp,"\n");

 }

 return 1;

}

输出结果:

当月月历以及2010年年历

佚名
2024-06-08 06:21:01
最佳回答
类似问题(10)