c语言程序设计电子日历.docx
《c语言程序设计电子日历.docx》由会员分享,可在线阅读,更多相关《c语言程序设计电子日历.docx(19页珍藏版)》请在冰豆网上搜索。
c语言程序设计电子日历
目 录
一、设计思路
二、功能实现详细设计
三、测试结果分析
四、用户手册
五、设计体会
一、设计思路:
If语句:
判断该年是否为闰年,判断一年是否为闰年需要符合下面二者之一:
1,能被4整除,但不能被100整除。
2,能被400整除。
满足上述条件时,返回值为1,否则返回值为0。
day函数:
判断某年某月最多多少天,定义一个十二个元素的数组a[12],给十二个月的天数分别赋初值31、28、31、30、31、30、31、31、30、31、30、31。
调用runnian函数,当if语句中条件为真实即返回值为1时,将二月份改为29天,即a[1]=29。
week函数:
判断某年某月某日的编号,根据公式(年份-1)+(年分-1)除以4-(年份-1)除以100+(年份-1)除以400+该天是该年的第几天(调用day2函数),把算出的值赋给number,再用number除以7取余数,即得到某年某月某日的编号。
定义一个字符型指针变量,利用switch语句,当number=0时,使指针指向星期日;当number=1时,指针指向星期一;当number=2时,指针指向星期二;当number=3时,指针指向星期三;当number=4时,指针指向星期四;当number=5时,指针指向星期五;当number=6时,指针指向星期六;当number不是上述数值时,指针指向错误。
x函数:
输出该天星期几,调用week1函数,将编号的值赋给number,调用*week2函数,根据number的值,确定指针指向,从而输出星期几,输出年,月,日,星期几。
显示月历,先输出星期日星期一星期二星期三星期四星期五星期六,星期日。
检验有效性,即当输入的年小于零、月小于一或大于十二、天大于该月最大值(调用day1函数)时将0返回给主函数,否则将1返回给主函数
nianli函数:
输出年历,先调用runnian函数,定义变量i,赋初值为1,利用for循环,循环十二次,调用x2函数,输出各个月的月历,从而显现出该年的每一天达到年历的效果。
yueli函数:
输出月历,先调用runnian函数,调用showmonth函数,输出该月月历。
rili函数:
输出日历,先调用函数,调用printmonth函数,输出该日日期。
二、功能实现详细设计:
输入选择---选择+回车键---输入相应信息+回车键---输出结果。
流程图如下:
退出
程序包含多个函数,分别为main函数、nianli函数、yueli函数、rili函数、nongli函数、printmonth函数、printyear函数、SelectMenu函数、HandleMenu函数、showmonth函数、week1函数、*week2函数、day1函数、day2函数。
通过函数间的调用,实现程序的运行。
详细程序
#include
#include
voidnongli()
{intj;
printf("\n\n\t\t\t\t2012年1月\n");
printf("\n\t星期日星期一星期二星期三星期四星期五星期六\n\n");
for(j=1;j<=31;j++)
{
printf("\t%d",j);
if(j==7||j==14||j==21||j==28)
printf("\n");
if(j==7)
{
printf("\t元旦\t初九\t初十\t十一\t十二\t十三\t十四\t\n");
}
if(j==14)
{
printf("\t十五\t十六\t十七\t十八\t十九\t廿十\t廿一\t\n");
}
if(j==21)
{
printf("\t廿二\t廿三\t廿四\t廿五\t廿六\t大寒\t廿八\t\n");
}
if(j==28)
{
printf("\t廿九\t春节\t初二\t初三\t初四\t初五\t初六\t\n");
}
if(j==31)
{
printf("\n");
printf("\t初七\t初八\t初九\n");
}
}
}
voidprinttab(intn)
{
while(n>0)
{
printf("\t");
n--;
}
}
#include
charMonthDay[]={31,28,31,30,31,30,31,31,30,31,30,31};
charMonthDayLeap[]={31,29,31,30,31,30,31,31,30,31,30,31};
char*WeekDayName[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
chargetkey()
{
charc,s[10];
scanf("%s",s);
c=s[0];
returnc;
}
charisLeapYear(inty)
{
return((y%4==0&&y%100!
=0||y%400==0)?
1:
0);
}
intWeekDay(inty,intm,intd)
{
intweek;
if(m==1)m=13;
if(m==2)m=14;
week=(d+2*m+3*(m+2)/5+y+y/4-y/100+y/400)%7;
returnweek;
}
charqueryweekday()
{
inty,m,d,week,c=0;
do
{
printf("请输入年月日(XXXXXXXX)\n");
scanf("%d%d%d",&y,&m,&d);
week=WeekDay(y,m,d);
printf("%d年%d月%d日是星期%s,是否继续查询(Y/N)?
",y,m,d,WeekDayName[week]);
c=getkey();
}
while(c=='Y'||c=='y');
returnc;
}
voidshowmonth(inty,intm)
{
intd,dt,week;
week=WeekDay(y,m,1);
if(isLeapYear(y))
dt=MonthDayLeap[(m-1)%12];
else
dt=MonthDay[(m-1)%12];
for(d=0;d<7;d++)
{
printf("\t%s",WeekDayName[d]);
}
printf("\n");
printtab(week);
for(d=1;d<=dt;d++)
{
printf("\t%6d",d);
if(WeekDay(y,m,d)==6)
printf("\n");
}
printf("\n");
}
charprintmonth()
{
inty,m,c=0;
do
{
printf("请输入年月(XXXXXX)\n");
scanf("%d%d",&y,&m);
printtab(3);
printf("%d年\t%d月\n",y,m);
showmonth(y,m);
printf("是否继续查询(Y/N)?
");
c=getkey();
}
while(c=='Y'||c=='y');
returnc;
}
charprintyear()
{
inty,m,c=0;
do
{
printf("请输入年份(XXXX)\n");
scanf("%d",&y);
printtab(3);
printf("%d年年历\n",y);
for(m=1;m<=12;m++)
{
printtab(4);
printf("%d月\n",m);
showmonth(y,m);
}
printf("\n是否继续查询(Y/N)?
");
c=getkey();
}
while(c=='Y'||c=='y');
returnc;
}
voidquit()
{
printf("\n\t谢谢使用该程序!
\n");
exit(0);
}
intSelectMenu()
{
intchoice;
printf("\n\t******************************************************************\n");
printf("4:
2014年1月的农历!
\n");
printf("3:
某年日历!
\n");
printf("2:
某月日历!
\n");
printf("1:
根据日期查星期几!
\n");
printf("0:
退出!
\n");
printf("\t******************************************************************\n");
printf("\t请选择菜单号(0---4):
");
while((!
(scanf("%d",&choice)))||(choice<0)||(choice>4))
{
printf("\n\t\t\a\a选择错误!
!
!
!
!
!
!
!
!
!
!
请重新选择:
");
printf("\n\t******************************************************************\n");
printf("4:
2014年1月的农历!
\n");
printf("3:
某年日历!
\n");
printf("2:
某月日历\n");
printf("1:
根据日期查星期几!
\n");
printf("0:
退出!
\n");
printf("\t******************************************************************\n");
printf("\t请选择菜单号(0---4):
");
}
returnchoice;
}
voidHandleMenu()
{
printf("\t\t*****************欢迎使用该程序***************\n");
while
(1)
{
switch(SelectMenu())
{
case0:
quit();
break;
case1:
queryweekday();
break;
case2:
printmonth();
break;
case3:
printyear();
break;
case4:
nongli();
break;
}
}
}
voidmain()
{
HandleMenu();
}
三、测试结果分析:
程序主界面:
四、用户手册:
可以根据界面的提示根据您的需要输入0.1.2或3.然后输入您要查的日期即可。
五、设计体会:
忙了好久总算将此程序设计出来。
尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序。
另外平时扎实的基础也很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。
为了解决此类问题,最好就是多向同学,老师请教,不要怕难为情。
尤其是老师,凭他们多年的编写程序的经验,要解决我们的问题,对他们来说只是小问题。
在设计这个程序时,我刚开始是根据老师给我提供的资料,用画图以及循环将框架设计出来,但是接下去便无从下手了。
计算是个关键和难点,我们也查了相应的资料,最好这个计算问题解决了。
从这一个多星期的设计过程中,遇到了一些细节性的问题,比如在乱输入的情况下,有时会出现程序崩溃,后来通过修改,修正了漏洞。
到写报告为止,漏洞基本被找出,并得到修正。
通过写这个程序,我对程序的健壮性有了更深的认识,也更加注意程序的细节问题。
总之,这次设计程序让我受益良多,我会好好珍惜像这种难得的机会。