c语言实现万年历

这篇博客介绍了一段使用C语言编写的交互式万年历程序,通过上下左右按键可以切换日期和年份。程序利用了time.h、stdlib.h等库,实现了根据当前时间获取日期并展示,同时提供了日期转换成星期的功能。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>
typedef struct today
{
	int day;
	int month;
	int year;
} today;

int day_cankao[2][13]={
	{0,31,28,31,30,31,30,31,31,30,31,30,31},
	{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
char *week[]=
{
	"Sun","Mon","Tue","Wen","Thu","Fir","Sat"
};
struct tm *todayuse;//struct tm定义c语言中time的结构体
today today_current;
int getweekday(today today_usenow)
{
	// w = y + [y/4] + [ c/4 ] – 2c+ [13 * (m+1) / 5] + d – 1
	//其中,c是年份的前两位,y是年份的后两位,m是月份,d是日期,这里需要注意的是,如果是1月和2月,c和y需要按照上一年来取值。
	int w=0;
	
	int year=today_usenow.year;
	int month=today_usenow.month;
	if(today_usenow.month==1 || today_usenow.month==2)
	{
		month+=12;
		year--;
	}
	int y=year%100;
	int c=year/100;
	int m=month;
    
	w=y + y/4 +  c/4  - 2*c+ 26* (m+1) / 10 + today_usenow.day -1;
	while(w<0)
	{
		w+=7;
	}
	return (w%7);

}
int is_leap(int year)
{

	if( (year%4==0 && year%100!=0) || (year%400==0))
	{
		return 1;
	}
	else
		return 0;
}
int  getmonthdays(int year,int month)
{
	return day_cankao[is_leap(year)][month];
}


void print_calendar(today today_usenow)
{
	printf("---------------------------\n");
	printf("Sun Mon Tue Wen Thu Fir Sat\n");
	int firstday=0;
	today today_usehere=today_usenow;
	today_usehere.day=1;
    int day=getweekday(today_usehere);//日期前
	//int  daysuseafter
	int days=getmonthdays(today_usenow.year,today_usenow.month);//月总数
	// 0 1 2 3 4 5 6  // 6 
	int daysbefore=0;
	if((today_usenow.month-1)==0)
	{
		//现在为1月,去年的十二月份
		daysbefore=getmonthdays(today_usenow.year-1,12);
		//	printf("%d is",daysbefore);
	}
	else
	{


		daysbefore=getmonthdays(today_usenow.year,today_usenow.month-1);
	}
	int daysbefoeit=daysbefore-day+1;
	printf("");
	int count=1;
		 if(day==0)
		 {
			 daysbefoeit-=7;
			 for(int i=0;i<day+7;i++)
			 {
				 
				 printf("%d  ", daysbefoeit);
				 daysbefoeit++;
				
			 }
			   printf("\n");
			 count=7;
		 }
		 else
		 {
			 for(int i=0;i<day;i++)
			 {
				 printf("%d  ", daysbefoeit);
				 daysbefoeit++;
			 }
			  count=day;
		 }
		 int m=1;
		 for(int i=0;i<=6-day;i++)
		 {
			 if(m<10)
			 {
				 printf(" %d  ",m);
			 }
			 else
			 {


				 printf("%d ",m);
			 }

			 m++;
		 }
		 printf("\n");
		 if(day==0)
		 {
			 count=14;
		 }
		 else
		 {
			 count=7;
		 }
		 int hang=0;
		 while(m<=days)
		 {
			 if(m<10)
			 {
				 printf(" %d  ",m);
			 }
			 else
			 {


				 printf("%d  ",m);
			 }
			 hang++;
			 if(hang==7)
			 {
				 printf("\n");
				 hang=0;
			 }

			 m++;
		 }
	    if(day==0)
		{
			count=days+7;
		}
		else
		{
			count=day+days;
		}
	int newmonth=1;
	for(int j=hang;j<7;j++)
	{

		if(newmonth<10)
		{
			printf(" %d  ",newmonth);
		}
		else
		{


			printf("%d  ",newmonth);
		}
		
		newmonth++;
	}
	printf("\n");
	count=count+7-hang;
	for(int j=0;j< 42-count;j++)
	{
		if(newmonth<10)
		{
			printf(" %d  ",newmonth);
		}
		else
		{


			printf("%d  ",newmonth);
		}
		newmonth++;
	}
	
	
	




}
//int getmonth

int main()
{
	time_t timep;  
	struct tm *p;  
	time(&timep);  
	p =localtime(&timep); //此函数获得的tm结构体的时间,是已经进行过时区转化为本地时间   
	//p = gmtime(&timep); //把日期和时间转换为格林威治(GMT)时间的函数   

	/*printf("Year:  %d\n", 1900+p->tm_year);  
	printf("Month:  %d\n", 1+p->tm_mon);  
	printf("Day:  %d\n", p->tm_mday);  
	printf("Hour:  %d\n", p->tm_hour);  
	printf("Minute:  %d\n", p->tm_min);  
	printf("Second:  %d\n",  p->tm_sec);  
	printf("Weekday:  %d\n", p->tm_wday);  
	printf("Days:  %d\n", p->tm_yday);  
	printf("Isdst:  %d\n", p->tm_isdst);  
	*/
	
	//printf("%d",day_cankao[0][12]);
	today_current.year=1900+p->tm_year;
	today_current.month=1+p->tm_mon;
	today_current.day= p->tm_mday;
	today use=today_current;
	int c1,c2;
	printf("    %d 年 %d 月 %d 日\n",today_current.year,today_current.month,today_current.day);
	print_calendar(today_current);
   while(1)
   {
	c1 = getch();
	if(c1==27)
	{
		printf("您已经退出系统");
		break;
	}
	if(c1==110)
	{
		printf("    %d 年 %d 月 %d 日\n",today_current.year,today_current.month,today_current.day);
		//printf("%d \n",getweekday(today_current));

		print_calendar(today_current);
		use=today_current;
		continue;
	}
	c2 = getch();
	//printf( "%d %d",c1,c2);

	if(c1==224 && c2==72)
	{
		use.month+=1;
		if(use.month==13)
		{
			use.month=1;
			use.year+=1;
		}
		printf("    %d 年 %d 月 %d 日\n",use.year,use.month,use.day);
		//printf("%d \n",getweekday(today_current));

		print_calendar(use);
	
	}
	if(c1==224 && c2==80)
	{
		use.month-=1;
		if(use.month==0)
		{
			use.month=12;
			use.year-=1;
		}
		printf("    %d 年 %d 月 %d 日\n",use.year,use.month,use.day);
		//printf("%d \n",getweekday(today_current));

		print_calendar(use);
	}
	if(c1==224 && c2==75)
	{
		use.year-=1;
		printf("    %d 年 %d 月 %d 日\n",use.year,use.month,use.day);
		//printf("%d \n",getweekday(today_current));

		print_calendar(use);
	}
	if(c1==224 && c2==77)
	{
		use.year+=1;
		printf("    %d 年 %d 月 %d 日\n",use.year,use.month,use.day);
		//printf("%d \n",getweekday(today_current));

		print_calendar(use);
	}
	printf("\n");
	printf("按上下按钮,进行月份变换\n");
	printf("按左右按钮,进行年份变换\n");
	printf("按ESC按键,退出系统\n");
	printf("按N按钮,查看当前日期\n");
   }
	//上 224 72
	//下 224 80
	//左 224 75
	//右 224 77
	//esc 27
	// n 110


	
	 return 0;
}


c语言实现的万年历显示,按下上下左右按键来更换日期和年份
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值