C语言日历系统.docx
《C语言日历系统.docx》由会员分享,可在线阅读,更多相关《C语言日历系统.docx(26页珍藏版)》请在冰豆网上搜索。
C语言日历系统
目录
一、设计题目1
二、设计目的1
三、设计分析1
四、总体设计1
五、详细设计3
六、程序调试3
七、结论8
一、设计题目
日历系统的实现
二、设计目的
1.掌握算法在程序设计中的应用,能够利用所学的基本知识和技能,解决复杂的程序设计问题。
2.学会利用TC的编程思想来完成系统的设计,学会在设计的过程中,建立清晰的结构体层次
3.学习发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并
在课程设计过程中不断检测自己的计划完成情况,及时的向教师汇报。
4.能够独立思考,课程设计中各项任务的设计和调试要求独立完成,遇到问题可以讨论,进而解决问题。
三、设计分析
本日历系统是通过C语言实现的,能实现万年历的基本功能。
万年历的核心是计算机其对应的星期,并按照合适的方式输出日历。
并可以输入确切日期并显示出来,完成了日历系统的显示、查询、支持键盘操作等功能。
本次设计在功能需求上可分为以下4个方面:
1)输入任一年将显示出该年的所有月份日期,对应的星期,并突出显示当前的日期。
2)输入日期进行查询,查询后将显示查询日期所在的月份的日历,并突出显示查询日期。
同时还将显示所查询的日期所在年份是否为闰年。
3)通过键盘操作调整年、月、日,并显示调整后的日期。
同时可以通过键盘操作以达到复位到系统当前日期。
4)判定输入年月日格式的合法性,如果合法则继续进行,否则显示错误提示信息,并令其重新输入。
四、总体设计
程序流程图,如下
五、详细设计
1)功能控制模块。
该模块用于实现日期有效性检查、判断是否是闰年和返回指定日期对应的星期。
Voidcheck(),检查日期合法性。
intisLeapyear(intyear),判断指定年year是否是闰年。
Intmaxday(intyear,intmonth)计算该月的最大天数。
eachYearTotal(intyear,intmonth,intday)用于计算出该年该月该天的一年中的总天数。
Intweek(intyear,intmonth,intday)用于判断该年该月该天为星期几。
Getmonthname(month)用于输出每个月份对应的英文单词。
2)打印输出模块。
该模块主要是进行输出显示,包括打印指定个数的空格、打印分隔线、打印用户使用手册、打印当前日期对应的星期以及打印给定的星期。
VoidprintUsage(),打印用户使用手册。
3)日历显示模块。
该模块是系统的核心模块,是用来显示指定日期所在月份的月历。
Display(intyear,intmonth,intday),显示日历年月日。
4)键值获取模块。
该模块接收键盘操作,获取键值,来进行日期调整,并调用日历显示模块中的函数来显示调整后的日历。
getKeyValue(),获取按键值。
六、程序调试
1、程序开始与退出
程序以系统的日期进行初始化,程序开始时显示的是系统日期所在的月的月历,如图。
要想退出程序,可按ESC键。
2、移动上下键
移动上下键可以调整日期中表示年的部分。
控制向上键可以增加年份,按SPACE(空格)键后,将恢复到程序开始的状态,如图。
3、移动左右键
移动左右键可以调整日期中表示的月份。
控制向左键可以减少月份,按SPACE(空格)键将程序重置到开始状态,如图。
4、移动下载翻页键
控制PageUp和PageDown键可以调整日期中表示的日的部分。
控制PageUp键可以减小天数,按SPACE键将程序重置到开始状态,如图。
5、查询日期
1日期查询
如果查询某一个日期,可以按Q或者q键进行,如图。
按q键后,将出现提示性语句“Inputdate(eg,19881123):
”其中“(eg,19881123)是输入示例,只有按扎这样的输入才被程序所接受。
输入查询日期后,即可按ENTER键进行查询操作,如图。
2日期合法性检测
对于查询操作,程序是要进行日期合法性检测的,包括日期中的年份、月份和天数检查。
如果有任何一部分出错,程序将提示用户,并显示系统日期所在月的月历。
年份无效,如图
月份无效,如图
天数无效,如图
七、结论
此次课程设计让我们知道万年历具有以下特点:
1.平年365天(52周+1天),闰年366天(52周+2天)。
平年2月28天,闰年2月29天。
由于公元1月1日设为星期六,故3月1日为星期三。
为使算法达到最简,故本算法以“星期”为计算单位。
且选3月1日为基月。
2.每400年整一闰,或每4年且不为百年的一闰。
(原因:
地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。
但四年加一天又多用了44分56秒,这个数积满400年为三天。
因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。
)所以百年%4=0闰或(年%4=0并且年<>0)闰。
3.每4年(3个平年+1个闰年)共208周+5天
每百年共100*(208周+5天)-1天=5217周+5天
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年),即400年一轮回!
(原来万年历400年前是一家)
此外,通过课程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。
通过对c语言万年历的设计进一步的巩固了用c语言编写程序,并且有利于更好的掌握c语言!
在万年历的编写过程中也体会到了做事情一顶要细心、认真。
更加知道了要掌握好基础知识。
还有体会到了成功的感觉!
通过本项课程设计也培养了我独立思考、综合运用所学有关相应知识的能力,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
通过这次的c语言程序设计更加了解了c语言的好处和其可用性!
在C语言程序设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!
都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!
为以后的工作打下良好的知识基础和技能基础!
附录(程序源代码)
#include
#include
#include
#include
/*左移键*/
#defineLEFT0x4b00
/*右移键*/
#defineRIGHT0x4d00
/*下移键*/
#defineDOWN0x5000
/*上移键*/
#defineUP0x4800
/*向上翻页移键*/
#definePAGEUP0x4900
/*向下翻页移键*/
#definePAGEDOWN0x5100
/*小写字母q*/
#defineQLOWER0x1071
/*大写字母Q*/
#defineQUPPER0x1051
/*空格键*/
#defineSPACE0x3920
/*Escape键*/
#defineESC0x011b
intisLeap(intyear);
intmaxDay(intyear,intmonth);
inteachYearTotal(intyear,intmonth,intday);
intweek(intyear,intmonth,intday);
intcheck(intyear,intmonth,intday);
voiddisplay(intyear,intmonth,intday);
voidgetmonthname(intmonth);
voidprintusage();
voidgetKeyValue();
structdatesysTime;
intcurrentYear;
intcurrentMonth;
intcurrentDay;
intn_currentMon;
intn_lastMon;
voidmain()
{
intyear,month,day,flag;
charch;
while
(1)
{
geninterrupt(0x10);
getdate(&sysTime);
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day;
display(currentYear,currentMonth,currentDay);
printusage();
getKeyValue(currentYear,currentMonth,currentDay);
do
{
gotoxy(45,23);
textcolor(YELLOW);
cprintf("PLEASEINPUTTHEYEARMONTHDAY:
\n\n");
gotoxy(45,25);
cprintf("eg:
(19881123):
");
scanf("%d%d%d",&year,&month,&day);
flag=check(year,month,day);
if(flag==0){printf("ERROR,PLEASEINPUTAGAIN\n");}
}while(flag==0);
display(year,month,day);
printusage();
gotoxy(45,22);
cprintf("CONTINUETOINPUT?
(y/n):
");
fflush(stdin);
ch=getchar();
if(ch=='n'||ch=='N'){gotoxy(44,21);exit(0);}
}
}
intisLeap(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)
return1;
else
return0;
}
intmaxDay(intyear,intmonth)
{
inta[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeap(year)){a[2]=29;}
/*当前月的天数*/
n_currentMon=a[month];
/*上一月的天数*/
n_lastMon=a[month-1];
returna[month];
}
inteachYearTotal(intyear,intmonth,intday)
{
inti,sum=0;
for(i=1;i{
sum+=maxDay(year,i);
}
sum+=day;
returnsum;
}
intweek(intyear,intmonth,intday)
{
intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachYearTotal(year,month,day);
number%=7;
returnnumber;
}
intcheck(intyear,intmonth,intday)
{
if(year<0||month<1||month>12||day<1||day>maxDay(year,month))
return0;
else
return1;
}
voidgetmonthname(intmonth)
{
switch(month)
{
case1:
textcolor(55);
cprintf("January1");
printf("\n\n");
break;
case2:
textcolor(55);
cprintf("February2");
printf("\n\n");
break;
case3:
textcolor(55);
cprintf("March3");
printf("\n\n");
break;
case4:
textcolor(55);
cprintf("April4");
printf("\n\n");
break;
case5:
textcolor(55);
cprintf("May5");
printf("\n\n");
break;
case6:
textcolor(55);
cprintf("June6");
printf("\n\n");
break;
case7:
textcolor(55);
cprintf("July7");
printf("\n\n");
break;
case8:
textcolor(55);
cprintf("August8");
printf("\n\n");
break;
case9:
textcolor(55);
cprintf("September9");
printf("\n\n");
break;
case10:
textcolor(55);
cprintf("October10");
printf("\n\n");
break;
case11:
textcolor(55);
cprintf("November11");
printf("\n\n");
break;
case12:
textcolor(55);
cprintf("December12");
printf("\n\n");
break;
}
}
voiddisplay(intyear,intmonth,intday)
{
intmax,number,i,j=1;
max=maxDay(year,month);
number=week(year,month,1);
clrscr();
printf("\n\n");
textcolor(75);
cprintf("%10d",year);
getmonthname(month);
textcolor(BLUE);
cprintf("********************************");
printf("\n");
textcolor(44);
cprintf("%5s","SUN");
textcolor(BLACK);
cprintf("%4s%4s%4s%4s%4s","MON","TUE","WHE","THR","FRI");
textcolor(44);
cprintf("%4s\n","SAT");
printf("\n");
for(i=0;i{
printf("");
}
while(j<=max)
{
if(i%7==6||i%7==0)
{
if(i%7==0)
{
if(j==day){printf("");textcolor(188);cprintf("%2d",j);}
else{textcolor(44);cprintf("%4d",j);}
}
else
{
if(j==day){printf("");textcolor(188);cprintf("%2d",j);printf("\n\n");}
else{textcolor(44);cprintf("%4d",j);printf("\n\n");}
}
}
else
{
if(j==day){printf("");textcolor(188);cprintf("%2d",j);}
else{textcolor(BLUE);cprintf("%4d",j);}
}
i++;
j++;
}
printf("\n");
textcolor(BLUE);
cprintf("********************************\n");
printf("\n");
}
voidprintusage()
{
gotoxy(45,3);
cprintf("-----------usage-------------");
gotoxy(45,5);
textcolor(YELLOW);
cprintf("YEAR");
gotoxy(50,5);
textcolor(BLACK);
cprintf("Upkey()toincrease;\n");
gotoxy(50,7);
cprintf("Downkey()todecrease.\n");
gotoxy(45,9);
textcolor(YELLOW);
cprintf("MONTH:
");
gotoxy(50,9);
textcolor(BLACK);
cprintf("Rightkey()toincrease;\n");
gotoxy(50,11);
cprintf("Leftkey()todecrease.\n");
gotoxy(45,13);
textcolor(YELLOW);
cprintf("DAY");
gotoxy(50,13);
textcolor(BLACK);
cprintf("PageDownkeytoincrease;\n");
gotoxy(50,15);
textcolor(BLACK);
cprintf("PageUpkeytodecrease.\n");
gotoxy(45,17);
textcolor(YELLOW);
cprintf("QUERY");
gotoxy(50,17);
textcolor(BLACK);
cprintf("Q/qkey\n");
textcolor(YELLOW);
gotoxy(45,16);
cprintf("RESET");
gotoxy(50,16);
textcolor(BLACK);
cprintf("SPACEkey.\n");
gotoxy(45,19);
textcolor(YELLOW);
cprintf("EXIT");
gotoxy(50,19);
textcolor(BLACK);
cprintf("Esckey\n");
gotoxy(59,5);
/*设置寄存器,表示在指定位置输出一次指定的字符*/
_CX=01;
_AH=0xa;
/*指定输出字符为向上的箭头*/
_AL=24;
/*产生一次中断,输出向上的箭头*/
geninterrupt(0x10);
gotoxy(61,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);
}
voidgetKeyValue(currentYear,currentMonth,currentDay)
{
intkey;
charch;
intyear,month,day;
year=currentYear;
month=currentMonth;
day=currentDay;
while
(1)
{
key=bioskey(0);
if(key==SPACE)
{
currentYear=year;
currentMonth=month;
currentDay=day;
}
if(key==RIGHT)
{
if(currentMonth<12&¤tMonth>=1)
{
currentMonth++;
}
else
{
currentYear++;
currentMonth=1;
}
}
if(key==LEFT)
{
if(currentMonth<=12&¤tMonth>1)
{
currentMonth--;
}
else
{
currentYear--;
currentMonth=12;
}
}
if(key==UP)
{
currentYear++;
}
if(key==DOWN)
{
currentYear--;
}
if(key==QLOWER||key==QUPPER)
{
break;
}
if(key==PAGEUP)
{
if(currentDay!
=1)
{
currentDay--;