打印年历
- 格式:wps
- 大小:133.00 KB
- 文档页数:10
打印年历要求:输入一个年份输出这年的年历,每行两月。
打印年历问题的程序设计的关键三点:1.确定当年1月一日是星期几;2.确定每月有多少天,关键是确定是否是闰年;3.设计数据存储方式和打印格式;4.#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};charMonthInfo[13][4]={"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","De c"};char WeekInfoEng[8][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};char WeekInfoChs[8][3]={"天","一","二","三","四","五","六"};int main(){int year,month,day;int flag=1; /*是否输出到文件,1为输出,0为不输出*/long date1;int IsLoopYear(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 IsLoopYear(int year){return year%400==0 || (year%100 && year%4==0);}/*检查日期的合法性*/int CheckDay(int year,int month,int day){int IsLoopYear(int year);/*年月日大于零,月份为1-12,日期为1至当月最大的天数,注意二月份的闰月*/if (year>=0 && month>0 && month<=12 && day>0 && \day<=( DaysInMonth[month]+(month==2&&IsLoopYear(year)) ) )return 1;elsereturn 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&&IsLoopYear(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,WeekInfoChs[tm_1->tm_wda y]); 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==NULL){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) is 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,MonthInfo[month]);if (flag)fprintf(fp,"%s%d--%s\n",filename,year,MonthInfo[month]);for (i=0;i<7;i++){printf("%s ",WeekInfoEng[i]);if (flag)fprintf(fp,"%s ",WeekInfoEng[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)*(IsLoopYear(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==NULL){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) is 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],MonthInfo[month+j],space[1]); /*前导空格,月份缩写,后导空格*/if (flag)fprintf(fp,"%s%s%s",space[0],MonthInfo[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 ",WeekInfoEng[k]);if (flag)fprintf(fp,"%s ",WeekInfoEng[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("____",WeekInfoEng[k]);if (flag)fprintf(fp,"____",WeekInfoEng[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," ");}{for(k=end_day[month+j];k<=DaysInMonth[month+j]+(month==2)*(IsLoopYear(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)*(IsLoopYear(year)))keepgoing[month+j]=0;if (k>DaysInMonth[month+j]+(month==2)*(IsLoopYear(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");}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);elsefprintf(fp,"%c",space);}fprintf(fp,"%c",space);}fprintf(fp,"\n");}return 1;}。