?? 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 + -