#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
//非标准库控制台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日是%s\n",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;
}