⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clendar.c

📁 用C语言 创建的日历 供大家参考 大家可以修改的更漂亮
💻 C
字号:

/*----------------加载头文件-----------------*/

#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<bios.h>

/*---------------定义键的常量----------------*/

#define LEFT 0x4b00 
#define RIGHT 0x4d00  
#define DOWN 0x5000
#define UP 0x4800
#define PAGEUP 0x4900
#define PAGEDOWN 0x5100
#define QLOWER 0x1071
#define QUPPER 0x1051
#define SPACE 0x3920
#define ESC 0x011b

/*----------------定义全局变量---------------*/

struct date sysTime;
int currentYear;
int currentMonth;
int currentDay;
int n_currentMon;
int n_lastMon;

/*----------------自定义函数-----------------*/

void checkDate();
int isLeapyear(int year);
int getWeek(int year,int month,int day);
void printSpace(int n);
void printSeparator();
void printUsage();
void printWeek();
void printWeek2(int week);
void showClandar(int year,int month,int day);
void getKeyValue();

/*-----------此函数是检查日期有效性函数-----------------*/

void checkDate()
{    
	/*----如果给定的日期中年份部分为负数----*/
	
	if(currentYear<=0)
	{
		gotoxy(1,27);
		printf("The year should be a positive number !\n");
		gotoxy(1,28);
		printf("Press any key to continue............\n");
		getchar();
		getchar();
		
		/*----以当前系统时间重新赋值 -------*/
		
		currentYear=sysTime.da_year;
		currentMonth=sysTime.da_mon;
		currentDay=sysTime.da_day;
	}
	/*--如果给定的日期中月份部分为负数,为0或大于12---*/ 
	 
	if(currentMonth>12 || currentMonth<1)
	{
		gotoxy(1,27);
		printf("The month should be a number between 1 and 12 !\n");
		gotoxy(1,28);
		printf("Press any key to continue......\n");
		getchar();
		getchar();
		
		/*----以当前系统时间重新赋值 -------*/
		
		currentYear=sysTime.da_year;
		currentMonth=sysTime.da_mon;
		currentDay=sysTime.da_day;
	}
	/*---如果给定的日期中天数部分为负数,为0或大于31----*/ 
	 
	if(currentDay>31 || currentDay<1)
	{
		gotoxy(1,27);
		printf("The day should be a number between 1 and 31 !\n");
		gotoxy(1,28);
		printf("Press any key to continue........\n");
		getchar();
		getchar();
		
		/*----以当前系统时间重新赋值 -------*/
		
		currentYear=sysTime.da_year;
		currentMonth=sysTime.da_mon;
		currentDay=sysTime.da_day;
	}
}

/*-------此函数是判断是否是闰年---------------------*/
int isLeapyear(int year)
{
	if(year%4==0 && year%100!=0 || year%400==0) 
	return 1;
	else
	return 0;
}


int getWeek(int year,int month,int day)
{
	int leapFlag;
	int week;
	int i;
	
	/*-----该数组用于保存每月的天数---*/
	
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int count=0;
	
	/*---判定给定的年份是否是闰年-----*/
	
	leapFlag=isLeapyear(year);
	/*----如果是闰年则2月份的天数就应该是29天----*/
	if(leapFlag==1)
	a[2]++;
	/*--计算从给定年份的1月1日道给定日期之间的天数--*/
	for(i=1;i<month;i++)\
	{
		count+=a[i];
	}
	
	count+=day;
	/*--计算这一天是星期几--*/
	week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)&7;
	
	return week;
}

/*---------该函数输出指定个数各空格--------*/

void printSpace(int n)
{
	int i;
	for(i=0;i<n;i++)
	printf(" ");
}

/*---------该函数输出分割线 ---------------*/

void printSeparator()
{
	int i;
	for(i=0;i<38;i++)
	{
		printf("=");
	}
	printf("\n");
}

/*--------------该函数定义了输出方法-------------*/

void printUsage()
{
	gotoxy(45,3);
	/*--设定字定字体颜色--*/
	textcolor(YELLOW);
	/*--格式化输出屏幕--*/
	cprintf("-------------Usage-------------");
	
	gotoxy(45,5);
	textcolor(YELLOW);
	cprintf("YEAR");
	gotoxy(50,5);
	cprintf("Up key( ) to increase;\n");
	gotoxy(50,7);
	cprintf("Down key( ) to decrease;\n");
	
	gotoxy(45,9);
	textcolor(YELLOW);
	cprintf("MONTH:");
	gotoxy(50,9);
	printf("  Right key( ) to increase;\n");
	gotoxy(50,11);
	printf("  Left key( ) to decrease;\n");
	
	gotoxy(45,13);
	textcolor(YELLOW);
	cprintf("DAY");
	gotoxy(50,13);
	printf("  PageDown key to increase;\n");
	gotoxy(50,15);
	printf("  PageUp key to decrease;\n");
	
    gotoxy(45,17);
    textcolor(YELLOW);
    cprintf("QUEAY");
    gotoxy(50,17);
    printf("  Q/q key \n");
	
	textcolor(YELLOW);
	gotoxy(45,19);
	cprintf("RESET");
	gotoxy(50,19);
	printf("  SPACE key;\n");
	
	gotoxy(45,21);
	textcolor(YELLOW);
	cprintf("EXIT");
	gotoxy(50,21);
	printf("  Esc key;\n");
	gotoxy(57,5);
	/*--设置寄存器,表示在指定位置输出一次指定的字符--*/
	_CX=01;
	_AH=0xa;
	/*--指定输出的字符为向上的箭头 --*/
	_AL=24;
	/*--产生一次中断,输出向上的箭头--*/
	geninterrupt(0x10);
	
	
	gotoxy(59,7);
	_CX=01;
	_AH=0xa;
	/*--指定输出字符为向下的箭头--*/
	_AL=25;
	geninterrupt(0x10);
	
	
	gotoxy(62,9);
	_CX=01;
	_AH=0xa;
	/*--指定输出字符为向右的箭头--*/
	_AL=26;
	geninterrupt(0x10);
	
	
	gotoxy(61,11);
	_CX=01;
	_AH=0xa;
	/*--指定输出的字符为向左的箭头--*/
	_AL=27;
	geninterrupt(0x10);
	/*--还原字体颜色--*/
	textcolor(7);
}

/*----------该函数是根据系统日期输出星期-------------*/

void printWeek()
{
	int day;
	/*--根据系统日期获得日期--*/
	day=getWeek(currentYear,currentMonth,currentDay);
	textcolor(11);
	/*--输出星期,0表示星期天,1表示星期一,......,6表示星期六--*/
	if(day==0)
		cprintf("%d-%d-%d,Sunday!",currentYear,currentMonth,currentDay);
	if(day==1)
		cprintf("%d-%d-%d,Monday!",currentYear,currentMonth,currentDay);
	if(day==2)
		cprintf("%d-%d-%d,Tusday!",currentYear,currentMonth,currentDay);
	if(day==3)
		cprintf("%d-%d-%d,Wednesday!",currentYear,currentMonth,currentDay);
	if(day==4)
		cprintf("%d-%d-%d,Thursday!",currentYear,currentMonth,currentDay);
	if(day==5)
		cprintf("%d-%d_%d,Friday!",currentYear,currentMonth,currentDay);
	if(day==6)
		cprintf("%d-%d-%d,Saturday!",currentYear,currentMonth,currentDay);
	textcolor(7);
}

/*------该函数是输出指定星期------------*/

void printWeek2(int week)
{    
	
	if(week==0)
		cprintf(",Sunday");
	if(week==1)
		cprintf(",Monday");
	if(week==2)
		cprintf(",Tuesday");
	if(week==3)
		cprintf(",Wendesday");
	if(week==4)
		cprintf(",Thursday");
	if(week==5)
		cprintf(",Friday");
	if(week==6)
		cprintf(",Staturday");
		
}

/*---------该函数是显示日历 -------------*/

void showCalendar(int year,int month,int day)
{
	int i;
	int j;
	/*--输出的日期 --*/
	int outDay=0;
	/*--本月第一个星期中在上月的天数 --*/
	int dayLastMon=0;
	int week=0;
	/*--该数组用于保存每各月的天数--*/
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int leapFlag;
	int n_currentMon;
	/*--判断给定年份是不是闰年--*/
 	leapFlag=isLeapyear(year);
 	/*--如果是闰年则2月的天数应该是29--*/
 	if(leapFlag==1)
 		a[2]++;
 	/*--如果给定的日期中,天数大于该月的最大天数--*/
 	if(day>a[month])
 	{
 		printf("The number of this month`s day is %d at most!\n",a[month]);
 		printf("Press any key to continue .......\n");
 		getchar();
 		getchar();
 		/*--以当前系统的时间从新赋值--*/
 		year=sysTime.da_year;
 		month=sysTime.da_mon;
 		day=sysTime.da_day;
 		
 		currentYear=sysTime.da_year;
 		currentMonth=sysTime.da_mon;
 		currentDay=sysTime.da_day;
 		
 	}
 	/*--当前月的天数 --*/
 	n_currentMon=a[month];
 	/*--上一月的天数--*/
 	n_lastMon=a[month-1];
 	/*--给据给定日期,获取给定月份1号是星期几--*/
 	week=dayLastMon=getWeek(year,month,1);
 	/*--清除文本模式窗口--*/
 	clrscr(); 
 	printf("\nThe calendar of %d ",year);
 	textcolor(10);
 	/*--显示给定年份是不是闰年--*/
 	if(leapFlag==1)
 		cprintf(" [leap Year]" ,year); 
 	if(leapFlag==0)
 		cprintf(" [not leap Year]",year);
 	printf("\n");
 	textcolor(7);
 	printSeparator();
 	textcolor(YELLOW);
 	/*-- 输出月份提示,1--12分别表示1月到12月--*/
 	switch(month)
 	{
 		case 1 :
 			cprintf(" January 1 ");
 			break;
 		case 2 :
 			cprintf(" February 2 ");
 			break;
 		case 3 :
 		    cprintf(" March 3 ");
 		    break;
 		case 4 :
 			cprintf(" April 4 ");
 			break;
 		case 5 :
 			cprintf(" May 5 ");
 			break;
 		case 6 :
 			cprintf(" June 6 ");
 			break;
 		case 7 :
 			cprintf(" Juny 7 ");
 			break;
 		case 8 :
 			cprintf(" August 8 ");
 			break;
 		case 9 :
 			cprintf(" Septrmber 9 ");
 			break;
 		case 10 :
 			cprintf(" October 10 ");
 			break;
 		case 11 :
 			cprintf(" November 11 ");
 			break;
 		case 12 :
 			cprintf(" December 12 ");
 			break;
 	}
 	
 	textcolor(7);
 	printf("\n\n");
 	textcolor(13);
 	printf(" Sun Mon Tue Wed Thu Fri Sat");
 	textcolor(7);
 	printf("\n\n");
 	/*--因为一个月中最多跨度6个星期,所以循环从1到5--*/
 	for(i=0;i<6;i++)
 	{
 		
 		if(i==0)
 		{
 			/*--如果是该月的第一个星期 第一个星期中还有7-daylastMon天本月,有daylastMon在上月
             所以输出daylastMon*4个空格,每个日期在日历中占用4个空格--*/
 			printSpace(dayLastMon*4);
 			/*--剩余在本月的第一个星期中的天数为7-daylastMon--*/
 			for (j=0;j<7-dayLastMon;j++)
 			{
 				/*--到达day的前一天时,输出++outday--*/
 				if(outDay==day-1)
 				{
 					/*--用黄色字体突出显示 --*/
 					textcolor(YELLOW);
 					cprintf(" [%d]",++outDay);
 					textcolor(7);
 				}
 				/*--到达day当天时并且不是星期天--*/
 				else if(outDay==day && week!=0)
 				{
 					printf("%3d",++outDay);
 				}
 				/*--到达day当天时并且是星期天--*/
 				else
 				{
 					printf("%4d",++outDay);
 				}
 				/*--计算当天的星期,如果前一天是星期六(6),则当天时星期天
                (0),其他情况则直接加1--*/
 				week=(week<6)?week+1:0;
 			}
 			printf("\n\n");
 		}
 		/*--如果不是该月的第一个星期--*/
 		else
 		{
 			
 		    /*--则输出该星期中的7天--*/
 			for(j=0;j<7;j++)
 			{
 			    /*--输出的天数小于该月的最大天数--*/
 				if(outDay<a[month])
 				{
 				    /*--到达day的前一天时输出++outday--*/
 					if(outDay==day-1)
 					{
 					    /*--输出一位数字--*/
 						if(outDay<9)
 						{
 							textcolor(YELLOW);
 							cprintf(" [%d]",++outDay);
 							textcolor(7);
 						}
 						/*--输出两位数字 --*/
 						else
 						{	
 							textcolor(YELLOW);
 							cprintf(" [%2d]",++outDay);
 							textcolor(7);
 						}
 					}
 					/*--到达day当天时并且不是星期天--*/
	 				else if(outDay==day && week!=0)
 					{
 						printf("%3d",++outDay);
 					}
 					/*--到达day当天时并且是星期天--*/
 					else
 					{
 						printf("%4d",++outDay);
 					}
 				}
 				/*--计算当天的星期,如果前一天是星期六(6),则当天时星期天
                (0),其他情况则直接加1--*/
 				week=(week<6)?week+1:0;
 			
 			}
 			printf("\n\n");
 			if(outDay==a[month]) break;
 			
 			
 		}
 		
 		
 	}
 	/*--输出分割线--*/
 	printSeparator();
 	/*--输出当前选择的日期和时间--*/
 	printf("The day you chose is :\n\n");
 	printWeek();
 	gotoxy(1,22);
 	textcolor(10);
 	cprintf("--------------------\n");
 	textcolor(7);
 	/*--输出系统日期和时间--*/
 	printf("\nToday is: %d-%d-%d",sysTime.da_year,sysTime.da_mon,sysTime.da_day);
 	printWeek2(getWeek(sysTime.da_year,sysTime.da_mon,sysTime.da_day));
 	printf("\n\n");
 	
 	printUsage();
 	gotoxy(1,25);
 	
}
 	
 	
/*-----------通过键盘调整日期函数-----------------*/ 	
 	
void getKeyValue()
{
	int key;
	char ch;
	int n_currentMon;
	/*--默认显示当前系统日期和星期--*/
	currentYear=sysTime.da_year;
	currentMonth=sysTime.da_mon;
	currentDay=sysTime.da_day;
	showCalendar(currentYear,currentMonth,currentDay);
	
	while(1)
	{   /*--获取键值根据键值调整日历输出--*/
		key=bioskey(0);
		/*--右移键增加月份--*/
		if(key==RIGHT)
		{   
			/*--月份在1--12月之间直接加一--*/
			if(currentMonth<12 && currentMonth>=1)
			{
				currentMonth++;
			}
			/*--如果月份为12月,则加一后进位,即年份加一,月份变为一--*/
			else
			{
				currentYear++;
				currentMonth=1;
			}
		}
		/*--左移键减少月份--*/
		if(key==LEFT)
		{   
			/*--月份在1--12月之间直接减一--*/
			if(currentMonth<=12 && currentMonth>1)
			{
				currentMonth--;
			}
			/*--如果月份为1,则减一后,到上一年--*/
			else
			{
				currentYear--;
				currentMonth=12;
			}
		}
		/*--上移键,增加年份--*/
		if(key==UP)
		{
			currentYear++;
		}
		/*--下移键减少年份 --*/
		if(key==DOWN)
		{
			currentYear--;
		}
		if(key==PAGEUP)
		{   
			/*--上移键减少天数 当前日不是该月的第一天,则天数直接减一--*/
			if(currentDay!=1)
			{
				currentDay--;
			}
			/*--前日是该月的第一天,并且是该年的第一个月(即1月1号),则天数减一后,
			变为上一年的最后一个月的最后一天(即12月31号)--*/
			else if(currentDay==1 && currentMonth==1)
			{
				currentYear--;
				currentMonth=12;
				currentDay=31;
			}
			/*--当前月是某年中某一月的最后一天 则天数减一后变为上一跃的最后一天--*/
			else
			{
				currentMonth--;
				currentDay=n_lastMon;
			}
		}
		/*--下移键增加天数--*/
		if(key==PAGEDOWN)
		{    
			/*--当前日不是该月的最后一天,则天数直接加一--*/
			if(n_currentMon!=currentDay)
			{
				currentDay++;
			}
			/*--当前日是该年的最后一天(即12月31号),
			则天数加一后变为下一年的第一月的第一天(即1月1号)--*/
			else if(n_currentMon==currentDay && currentMonth==12)
			{
				currentDay++;
				currentMonth=1;
				currentDay=1;
			}
			/*--当前月是该年中某一月的最后一天 则天数家以后变为下一月的第一天--*/
			else
			{
				currentMonth++;
				currentDay=1;
			}
		}
		/*--Q或q键表示查询指定日期的星期--*/
		if(key==QLOWER || key==QUPPER)
		{
			printf("Input date (eg,%d-%d-%d):",sysTime.da_year,sysTime.da_mon,sysTime.da_day);
			scanf("%d-%d-%d",&currentYear,&currentMonth,&currentDay); 
			checkDate();
		}
	    /*--空格键,重置到系统日期--*/
		if(key==SPACE)
		{
			currentYear=sysTime.da_year;
			currentMonth=sysTime.da_mon;
			currentDay=sysTime.da_day;
		}
		/*--Esc键退出系统--*/
		if(key==ESC)
		{
			printf("DO you really want yo quit ?(Y/N)");
			ch=getchar();
			if(ch=='Y' || 'y')
				break;
		}
		showCalendar(currentYear,currentMonth,currentDay);
	}
}
	

 	
/*------------------主函数---------------*/ 				
 				
void main()
{   
	/*--清除文本模式窗口--*/
	clrscr();
	/*--设置屏幕显示方式-*/
	_AL=03;
	_AH=0;
	geninterrupt(0x10);
	getdate(&sysTime);
	getKeyValue(); 
	return 0;
}

	 				
 				

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -