(一)课题内容
用C或C++编程实现一个简单、实用的万年历程序。主要功能为在屏幕上显示任意年月的月历,按每行两个月的格式输出当年或指定的任意年的年历。通过此课题,熟练掌握数组、格式输出、字符串处理、时间函数的调用、文件的各种操作,以及一些基本的日期算法思想。
(二)课题要求
课题分基本要求和扩展要求,基本要求是必须完成的,扩展要求视能力自选一个或多个完成。
1. 基本要求。
(1) 读取系统时钟,计算与日期相关的信息,首先打印出当月的月历,在当月月历的最下方也下列两行方式显示与当前有关的信息:
今天是: 2005年12月20日,星期二
当前时间是:22时40分43秒
(2) 输入任意年号能得到指定年的年历(万年历)。
(3) 将屏幕上显示的月历和年历均存为文本文件以便今后读取。
(4) 按每行两个月的格式显示任一年的日历,形式如下(可以每个字设计一个字库):
***** ***** ***** *****
* * * * * * *
***** * * * * *****
* * * * * *
***** ***** ***** *****
Jan Feb
________________________________ ________________________________
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12
…… ……
2. 扩展要求。
(1) 重要节假日用一个文本文件进行设置,文件格式为txt。程序应通过读取节假日文件的信息来对日历上的节假日日期进行标注。从而在日历上显示节假日信息。如十月份的1号显示为:国庆节 1。其他节日如母亲节、父亲节。
(2) 提供按年上下翻页的功能来实现对上一年或下一年的年历的查询功能。
扩展要求任选一个完成~~
如果哪位大神回答了小弟我的问题 请发到我的邮箱773901291◎qq.com 小弟万分感谢~~~ 小弟的所有分可都在这了 肯请各位不胜麻烦 帮帮忙哈~~~ 别忘了发邮箱哦~~
基本功能已经实现:
/*****************************************************************
*Author :wacs5
*DATE :20101110(YYYMMDD)
*Email :[email protected]
*Function :用C编写、打印万年历
*Targe :http://zhidao.baidu.com/question/195084859.html
*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 MonthInfo[13][4]={"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
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;
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&&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_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==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," ");
}
else
{
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");
}
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年年历