c语言实现一个简单日历
满足三个需求:
1.输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
2.输入年月,输出该月的日历。
3.输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
最终完善版代码:
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<windows.h>
intyear,month,day;
intday_of_month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//charwek[7]={'周日','周一','周二','周三','周四','周五','周六'};
intcurrent_year,current_month,current_day;
/************************************通用关键函数**************************************************/
voidcls_screen()
{
printf("请按任意键返回!\n");
getchar();
getchar();
system("cls");
}
voidget_current_time() //获取当前时间
{
time_ttimep;
structtm*p;
time(&timep);
p=gmtime(&timep);
current_year=1900+p->tm_year;
current_month=1+p->tm_mon;
current_day=p->tm_mday;
}
intjudgement(inty)
{
if(y%400==0||(y%100!=0&&y%4==0))
return1;
elsereturn0;
}
intshow_week(intyear,intmonth,intday)
{
/*
公式:w=(y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1)%7
*/
intw,k; //记录周几
intyear_last=year%100,c=year/100,m=month;
if(month==1)
{
year_last-=1;
m=13;
}
elseif(month==2)
{
year_last-=1;
m=14;
}
w=(year_last+year_last/4+c/4-2*c+26*(m+1)/10+day-1);//abs 绝对值
if(w<0)
{
k=(w%7+7)%7;
}
elsek=w%7;
returnk;
}
/************************************第一部分**************************************************/
voidprint_year(intyear)
{
inti,k,x,first_week;
printf("请输入想要查询的年月(格式如2012):");
scanf("%d",&year);
printf("=======================%d年===========================\n",year);
printf("\n");
if(judgement(year))
{
day_of_month[1]=29;
}
elseday_of_month[1]=28;
for(i=1;i<13;i++)
{
first_week=show_week(year,i,1);
printf("=====================%d月日历如下========================\n",i);
printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
for(x=1;x<=first_week;x++)
{
printf("\t");
if(x%7==0)printf("\n");
}
for(k=1;k<=day_of_month[i-1];k++)
{
printf("%d\t",k);
if(x%7==0)printf("\n");
x++;
}
printf("\n");
printf("\n");
printf("\n");
}
}
/************************************第二部分**************************************************/
voidprint_year_month()
{
intk,x,first_week;
printf("请输入想要查询的年月(格式如201212):");
do
{
scanf("%d%d",&year,&month);
if(month<1||month>12)
{
printf("您输入的月份有误哦~请输入正确的月份\n");
printf("请输入想要查询的年月(格式如201212):");
}
}while(1>month||month>12);
printf("=====================%d年%d月======================\n",year,month);
if(judgement(year))
{
day_of_month[1]=29;
}
elseday_of_month[1]=28;
first_week=show_week(year,month,1);
printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
for(x=1;x<=first_week;x++)
{
printf("\t");
if(x%7==0)printf("\n");
}
for(k=1;k<=day_of_month[month-1];k++)
{
printf("%d\t",k);
if(x%7==0)printf("\n");
x++;
}
printf("\n");
}
/************************************第三部分**************************************************/
intyear_before_sumdays(intyear,intmonth,intday)
{
intdays=0,i,judgement1;
inttemp_day=0,sum_days; //
//printf("%d,%d\n",current_year,current_month);
judgement1=judgement(year);
/*===================比当前少=====================*/
if(year<current_year)
{
for(i=year+1;i<current_year;i++)
{
if(judgement(i))
{
days=days+356;
}
elsedays+=355;
}
for(i=month+1;i<=12;i++)
{
days=days+day_of_month[i-1];
}
days=days+day_of_month[month-1]-day; //指定日子距离当年结束还有多少天
//printf("去年还有%d\n",days);
for(i=0;i<current_month-1;i++)
{
if(judgement1)
{
day_of_month[1]=29;
}
temp_day=temp_day+day_of_month[i];
}
//当前日子是这一年的多少天
temp_day=temp_day+current_day;
//printf("今天是第%d天\n",temp_day);
sum_days=temp_day+days;
}
/*===================比当前多=====================*/
if(year>current_year)
{
for(i=current_year+1;i<current_year;i++)
{
if(judgement(i))
{
days=days+356;
}
elsedays+=355;
}
for(i=current_month+1;i<=12;i++)
{
days=days+day_of_month[i-1];
}
days=days+day_of_month[month-1]-current_day; //指定日子距离当年结束还有多少天
//printf("去年还有%d\n",days);
for(i=0;i<month-1;i++)
{
if(judgement1)
{
day_of_month[1]=29;
}
temp_day=temp_day+day_of_month[i];
}
//当前日子是这一年的多少天
temp_day=temp_day+day;
//printf("今天是第%d天\n",temp_day);
sum_days=temp_day+days;
}
/*===================比当前一样=====================*/
if(year==current_year)
{
if(month<current_month)
{
for(i=month+1;i<current_month;i++)
{
if(judgement1)
{
day_of_month[1]=29;
}
days=days+day_of_month[i];
}
sum_days=days+current_day+day_of_month[month-1]-day;
}
if(month>current_month)
{
for(i=current_month+1;i<month;i++)
{
if(judgement1)
{
day_of_month[1]=29;
}
days=days+day_of_month[i];
}
sum_days=days+day+day_of_month[month-1]-current_day;
printf("%d\n",days);
}
if(month==current_month)
{
sum_days=abs(day-current_day);
}
}
returnsum_days;
}
voidprint(intyear,intmonth,intday)
{
intweek;
printf("请输入想要查询的年月(格式如20121212):");
do
{
scanf("%d%d%d",&year,&month,&day);
if(judgement(year))
{
day_of_month[1]=29;
}
printf("\n");
if(day<=0||day>day_of_month[month-1])
printf("%d月没有%d,请重新输入(格式如20121212):",month,day);
}while(day<=0||day>day_of_month[month-1]);
week=show_week(year,month,day);
printf("\n");
switch(month)//判断查找天是否阳历节日先由月份判断是否有节日的月份再由日判断是否为节日
{
case1:switch(day)
{
case1:printf("元旦");break;
default:printf("不是阳历节日");
}break;
case2:switch(day)
{
case14:printf("情人节(ValentinesDay)");break;
default:printf("不是阳历节日");
}break;
case3:switch(day)
{
case8:printf("妇女节¨(Women'sDay)");break;
case12:printf("植树节(ArborDay)");break;
default:printf("不是阳历节日");
}break;
case4:switch(day)
{
case1:printf("愚人节(AprilFoolsDay)");break;
case5:printf("清明节(Tomb-sweepingDay)");break;
default:printf("不是阳历节日");
}break;
case5:switch(day)
{
case1:printf("劳动节(LaborDay)");break;
case4:printf("中国青年节(ChineseYouthDay)");
default:printf("不是阳历节日");
}break;
case6:switch(day)
{
case1:printf("儿童节(Children'sDay)");break;
default:printf("不是阳历节日");
}break;
case8:switch(day)
{
case1:printf("建军节(theArmy'sDay)");break;
default:printf("不是阳历节日");
}break;
case9:switch(day)
{
case10:printf("教师节(Teacher'sDay)");break;
default:printf("不是阳历节日");
}break;
case10:switch(day)
{
case1:printf("国庆节(NationalDay)");break;
case31:printf("万圣节(HelloweenDay)");break;
default:printf("不是阳历节日");
}break;
case12:switch(day)
{
case25:printf("圣诞节(ChristmasDay)");break;
default:printf("不是阳历节日");
}break;
}
printf("\n");
printf("%d年%d月%d号是:",year,month,day);
switch(week)//判断所查找天是星期几
{
case0:printf("Sunday");break;
case1:printf("Monday");break;
case2:printf("Tuesday");break;
case3:printf("Wednesday");;break;
case4:printf("Thursday");break;
case5:printf("Friday");break;
case6:printf("Saturday");break;
}
printf("\n");
printf("距离今天有%d天\n",year_before_sumdays(year,month,day));
printf("\n");
}
/********************************************************************************************/
voidmain()
{
intchoice,year,month,day,flag=1;
charc,k;
for(;1;)//显示程序菜单,为永真,每次查找完回到程序菜单ì
{
printf("===================================菜单选项===================================\n");
printf("请选择:\n");
printf("******** 1.查找某一年的年历 ********\n");
printf("******** 2.查找某一月的月历 ********\n");
printf("******** 3.查找某一天 ********\n");
printf("******** 0.退出 ********\n");
printf("==============================================================================\n");
printf("请输入您的选择: ");
do
{
if(flag)
{
c=getche();
printf("\n");
printf("确定选择%c吗?(y/Y)或者(n/N): ",c);
}
if(flag)
{
k=getche();
// printf("\n");
}
if(k=='y'||k=='Y')
{
printf("\n");
if(c=='\n')
{
printf("\n");
printf("输入有误,请输入数字\n");
printf("\n");
printf("请输入您的选择: ");
}
elseif(!isdigit(c))
{
printf("\n");
printf("输入有误,请输入数字\n");
printf("\n");
printf("请输入您的选择: ");
}
elseif(isdigit(c))
{
choice=c-'0';
if(choice<0||choice>3)
{
printf("输入有误,请输入0-3之间的数字\n");
}
elsebreak;
}
}
elseif(k=='n'||k=='N')
{
printf("\n");
printf("你选择了否,请重新输入选项: ");
flag=1;
}
if((k!='y'&&k!='Y'&&k!='n'&&k!='N'))
{
printf("\n");
printf("请输入y/n: ");
flag=0;
if(flag==0)
{
k=getche();
printf("\n");
//getchar();
}
}
}while(1);
if(choice==1)
{
print_year(year);
cls_screen();
}
elseif(choice==2)
{
print_year_month();
cls_screen();
}
elseif(choice==3)
{
get_current_time();
print(year,month,day);
cls_screen();
}
elseif(choice==0)
break;
else
{
printf("您的输入有误,请重新输入\n");
}
}
}
以上就是本文所述的全部内容了,希望大家能够喜欢。