C语言万年历
很多人都有做过万年历,于是想自己写一个。
万年历是我们日常生活中经常用到的一种非常实用的工具。
由于工作繁忙,人们常常忘记某一天是星期几,想要看看某个月的日历,或者一整年的。我把自己的想法实现如下:
1、任意年份日历的整体输出;
2、任意年任意月日历的单独输出;
3、任意年月日 查询星期几;
4、按任意键 退出;
5、循环查询,直到选择退出;
ps:
以上星期几的推算只适合于1582年10月15日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)。
先来一些运行截图:
输入错误
输出全年的日历
任意年任意月日历的单独输出
**任意年月日 查询星期几 **
退出程序
ok 截图展示完了
双手奉上 全部代码
算法实现还是挺容易的,调整格式,修改代码很累人!
2019年6月22日
重新调整输出格式(当月1日不是星期日的时候对齐问题,月末不是星期6末尾#对齐);
调整查询某月日历时输入方式并对输入月份数值做判断;
调整循环方式;
2020年3月19日
修改星期显示,调整函数位置
修改后代码如下:
/*万年历输出小程序*/
#include "stdio.h"
#include "stdlib.h"
int dateofmonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
char *month1[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char *month2[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
//char *week[7]={"sunday","monday","tuesday","wednesday","thursday","friday","saturday"};
char *week[7]={"sun","mon","tue","wed","thu","fri","sat"};
/*函数声明*/
int pyear(int n);
int xingqi(int year,int month,int data );
void rili(int year,int month_a,int month_b);
void xq();
main()
{
int i,year,month;
printf("*********万年历小程序*********\n\n");
printf("请选择您要执行的操作(0-3)\n");
printf("\n0:退出\n1:查询某年日历\n2:查询某月日历\n3:查询某日星期\n");
printf("\n您选择要执行的操作是: ");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 0: exit(i);break;
case 1: printf("请输入要查询的年份:\n\n");
scanf("%d",&year);
rili(year,1,12);break;
case 2: printf("请输入要查询的年份月份(2019 6):\n\n");
scanf("%4d%2d",&year,&month);
if(month>0&&month<13)rili(year,month,month);
else {printf("\n\n\t输入错误,请重新输入\n\n\n\n\n");
main();
}
break;
case 3: xq();break;
default:
printf("\n\n\t输入错误,请重新输入\n\n\n\n");
main();
}
}
int pyear(int n)
{ if(n%4==0&&n%100!=0||n%400==0)return 1;
else return 0;
}
int xingqi(int year,int month,int data )//返回某年某月某日是星期几
{ int d=0,i,j;
i=pyear(year);
for(j=0;j<month-1;j++)
d+=dateofmonth[i][j];
d+=data;
//int weekday=((year-1)+(year-1)/4-(year-1)/100+(year-1)/400+d)%7 ;
//return weekday==0?7:weekday;
return ((year-1)+(year-1)/4-(year-1)/100+(year-1)/400+d)%7 ;
}
void rili(int year,int month_a,int month_b)
{
int i,j,k,mlen,n,fweek;
printf("\n\n\n\t———————————%d 年日历———————————\n\n\n",year);
for(i=month_a-1;i<month_b;i++)
{
fweek=xingqi(year,(i+1),1);
mlen=dateofmonth[pyear(year)][i];
printf("\t%-8s\t\t\t\t\t%6s\n",*(month1+i),*(month2+i));
printf("\t______________________________________________________\n\t ");
for(j=0;j<7;j++)
printf("%s\t",*(week+j));
printf("\n\n");printf("\t# ");
if(fweek>0)
{for(n=0;n<fweek;n++)printf(" \t");printf(" ");}
for(k=1;k<=mlen;k++)
{
if(fweek==7)
{printf("\n\t# ");fweek=0;}
if(fweek==6)
printf("%2d #",k);
else printf("%2d\t ",k);
fweek++;
}
if(fweek<6) //以下部分处理月末不是星期6的情况下输出格式
{
while(fweek++!=6) printf(" \t");
printf(" #");
}
else if(fweek==6)printf(" #"); //至此月末处理完毕
printf("\n\t______________________________________________________\n");
printf("\n\n\n\n\n");
}
main();
}
void xq()
{
int y,m,d;
printf("请输入要查询的日期 年 月 日(2019 6 14):");
scanf("%d%d%d",&y,&m,&d);
char *weekday2[]={"日","一","二","三","四","五","六"};//星期中文
printf("\n\n查询结果如下:\n\n\t%-5d年%3d 月%3d 日\t星期 %s\n\n\n\n\n",y,m,d,weekday2[xingqi(y,m,d)]);
main();
}