C语言万年历 查询年历 月历 星期(日期)循环查询(2020 3 19更新)

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();	
}

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值