📄 clendar.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",¤tYear,¤tMonth,¤tDay);
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 + -