完整代码如下:
#include#include #include #include #include //非标准库控制台I/O //平年月份表 const int mons[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31} ; //闰年月份表 const int mons2[13]={ 0,31,29,31,30,31,30,31,31,30,31,30,31} ; //中文星期列表 char *wd[]= { "周日", "周一","周二", "周三","周四", "周五","周六", "unknown" } ; //系统当前日期时间 int *nowdatetime() { char str1[200]; char years[10]; int *ym=(int*)malloc(2*sizeof(int)); time_t dtime; time(&dtime); struct tm *tt; tt=localtime(&dtime); strftime(str1,200,"n公元%Y年%m月%d日%H时%M分%S秒n第%W周 第%j天n",tt); printf(str1); printf("%s",wd[tt->tm_wday]); strftime(years,10,"%Y",tt); *(ym+1)=tt->tm_mon+1; *(ym+0)=atoi(years); return ym; } //获得星期几索引 int wday(int year,int mon,int mday) { struct tm Timestr; Timestr.tm_year=year-1900; Timestr.tm_mon=mon-1; Timestr.tm_mday=mday; Timestr.tm_hour=0; Timestr.tm_min=0; Timestr.tm_sec=1; Timestr.tm_isdst=-1; if(mktime(&Timestr)==-1) return 7; return Timestr.tm_wday; } //判断是否闰年 int isleapyear(int year) { int bool=0; if((year%4==0 && year%100!=0) || year%400==0) { bool=1; } return bool; } //输出月历明细 是2月判断平年还是闰年/判断1号是星期几 int showmon(int year ,int mon) { int flag=0; //平闰年真假 int index; //星期数组索引 int mdays=mons[mon]; //该月天数 int m; //空格个数 int k=0; //第一行个数 if(mon==2) { //判断是否是2月,2月则判断平/闰年 flag=isleapyear(year); mdays=mons[mon]+flag; } index=wday(year,mon,1); k=7-index; //获得该月1号是星期几索引 printf("n_________________________________________n"); printf("公元%d年%d月份n",year,mon); printf("_________________________________________n"); printf(" 周日 周一 周二 周三 周四 周五 周六 n"); printf("_________________________________________n"); int i; for(i=0;i<6*index+3;i++) { printf(" "); } printf("1"); for(i=2;i<=k;i++) { printf("%6d",i); } for(i=k+1;i<=mdays;i++) { if((i-k-1)%7==0) printf("n%4d",i); else printf("%6d",i); } printf("n_________________________________________n"); return 0; } int showmenu() { int n; int year=2022; int mon=6; int day; int wdindex; int *p=NULL; printf("n***************************************n"); printf("* 万年历 *n"); printf("* ___________________ *n"); printf("* 1–>系统日期时间 *n"); printf("* 2–>年月日查星期 *n"); printf("* 3–>输出整年月历 *n"); printf("* 4–>输出某月月历 *n"); printf("* 5–>判断闰年平年 *n"); printf("* 6–>某月最大天数 *n"); printf("* 7–>跳到今月月历 *n"); printf("* 0–>退出整个程序 *n"); printf("* *n"); printf("***************************************n"); printf("请选择功能:"); scanf("%d",&n); switch(n) { case 0: return 0; break; case 1: nowdatetime(); break; case 2: printf("输入年份:"); scanf("%d",&year); printf("输入月份:"); scanf(" %d",&mon); printf("输入几日:"); scanf(" %d",&day); wdindex=wday(year,mon,day); printf("n公元%d年%d月%d日是%sn",year,mon,day,wd[wdindex]); break; case 3: printf("输入年份:"); scanf("%d",&year); for(int i=1;i<13;i++) showmon(year ,i); break; case 4: printf("输入年份:"); scanf("%d",&year); printf("输入月份:"); scanf(" %d",&mon); showmon(year ,mon); break; case 5: printf("输入年份:"); scanf(" %d",&year); if(isleapyear(year)) { printf("n公元%d年是闰年n",year); } else { printf("n公元%d年平年n",year); } break; case 6: printf("输入年份:"); scanf(" %d",&year); printf("输入月份:"); scanf(" %d",&mon); if(mon==2) { printf("n公元%d年%d月,本月一共%d天n",year,mon,mons[mon]+isleapyear(year)); } else printf("n公元%d年%d月,本月一共%d天n",year,mon,mons[mon]); break; case 7: //int *p=NULL; p=nowdatetime(); showmon(*p ,*(p+1)); free(p); break; default: break; } getchar(); return 0; } int main(int argc, char** argv) { while(1) { showmenu(); getchar(); clrscr(); } return 0; }



