C语言万年历程序设计.docx
《C语言万年历程序设计.docx》由会员分享,可在线阅读,更多相关《C语言万年历程序设计.docx(14页珍藏版)》请在冰豆网上搜索。
C语言万年历程序设计
目 录
第1章需求分析
(1)程序运行时,首先给出四个菜单选项和输入提示:
图1-1
(2)用户可以通过主菜单选择不同选项。
输入1,通过输入年份可显示一年每个月份的日历;输入2,通过输入年份和月份(中间以空格分开)可显示该月的日历;若输入3,通过输入年份月份和日期(中间以空格分开)可显示该日的星期;输入0,则退出查询系统。
第2章概要设计
1.菜单选择界面可通过下面所示函数时现;
主要思路:
通过while语句与swich…case以及if条件语句实现菜单的循环功能和不同选项的功能实现。
闰年与平年的判断:
代码如下:
voidmain()
{
intyear,month,day,a,b;
while
(1)
{
printf("\n\n\n\n");
printf("**********************************************************\n\n");
printf("**\n");
printf("欢迎进入万年历查询系统\n");
printf("**\n\n");
printf("**********************************************************\n\n\n");
printf("1年历2月历3日历4退出\n");
printf("请输入您的选择<1~4>,按回车键确定:
");
scanf("%d",&b);
switch(b)
{
case1:
printf("\n请输入您要查的年份:
");
scanf("%d",&year);
a=x3(year,1,1);
if(a==0)
{
printf("错误!
请您重新输入。
\n");
break;}
nianli(year);
break;
case2:
printf("\n请输入您要查的年和月,年月之间用空格隔开:
");
scanf("%d%d",&year,&month);
a=x3(year,month,1);
if(a==0)
{
printf("错误!
请您重新输入。
\n");
break;}
yueli(year,month);
break;
case3:
printf("\n请输入您要查的年月日,年月日之间用空格隔开:
");
scanf("%d%d%d",&year,&month,&day);
a=x3(year,month,day);
if(a==0)
{
printf("错误!
请您重新输入。
\n");
break;}
rili(year,month,day);
break;
case4:
exit(0);
default:
printf("错误!
请您重新输入。
\n\n");
}
}
2.显示一年的日历,可通过函数voidx1()实现,
思路如下:
●先判断输入年份是否为闰年,若为闰年,则定义二月为29天,
通过调用函数判断是否为闰年及每个月的天数
●依次打印12个月的月份
●打印每个月的日历,显示个每个月的日历:
printf("%2s%2s%2s%2s%2s%2s%2s\n","星期日","星期一","星期二","星期三","星期四","星期五","星期六");
3.闰年的判断:
计算所输入的年份是否可被4整除,若不能被整除,为平年。
若可被4整除,计算此年份能否被100整除,不能被100整除则为闰年。
既能被4整除,也能被100整除的年份,若也能被400整除,则为闰年,否则为平年。
闰年366天,平年365天
图2-1
代码:
intrunnian(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)
return1;
else
return0;
}
4.判断某月的天数;
通过函数:
intday1(intyear,intmonth)
{
inta[12]={31,28,31,30,31,30,31,31,30,31,30,31};
若为闰,则二月为29天。
图2-2
代码:
if(runnian(year))
a[1]=29;
第3章详细设计
#include
#include/*定义头文件*/
intrunnian(intyear)/*定义变量*/
{
if(year%4==0&&year%100!
=0||year%400==0)/*利用函数判断输入年份是闰年还是平年*/
return1;
else
return0;
}
intday1(intyear,intmonth)
{
inta[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*定义数组确定12个月每个月的天数*/
if(runnian(year))/*如果输入年份是闰年*/
a[1]=29;/*二月29天*/
returna[month-1];
}
intday2(intyear,intmonth,intday)
}
inti,sum=0;
for(i=1;i{
sum+=day1(year,i);
}
sum+=day;
returnsum;
}
intweek1(intyear,intmonth,intday)
{
intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+day2(year,month,day);
number%=7;
returnnumber;
}
char*Week2(intnumber)
{
switch(number)/*分类一周七天*/
{
case0:
return"星期日";
case1:
return"星期一";
case2:
return"星期二";
case3:
return"星期三";
case4:
return"星期四";
case5:
return"星期五";
case6:
return"星期六";
default:
return"错误!
请您重新输入。
";/*不符和上面七种情况的报错提示*/
}
}
voidx1(intyear,intmonth,intday)
{
intnumber=week1(year,month,day);
if(runnian(year))printf("闰年");/*年份为闰年则输出“闰年“*/
elseprintf("平年");
printf("%d年%d月%d日%10s\n\n",year,month,day,Week2(number));/*按年月日输出结果*/
}
voidx2(intyear,intmonth)
{
intmax,number,i,j=1;
max=day1(year,month);
number=week1(year,month,1);
printf("%2s%2s%2s%2s%2s%2s%2s\n","星期日","星期一","星期二","星期三","星期四","星期五","星期六");/*按照间隔打印日历
for(i=0;i{
printf("");
}
while(j<=max)
{
printf("%8d",j);
if(i%7==6)
{
printf("\n");
}
i++;
j++;
}
printf("\n\n");
}
intx3(intyear,intmonth,intday)
{
if(year<0||month<1||month>12||day<1||day>day1(year,month))/*当输入植出现这些情况时*/
return0;/*返回0*/
else
return1;/*返回1*/
}
voidnianli(intyear)
{
inti;
printf("\n");
for(i=1;i<=12;i++)
{
if(runnian(year))printf("闰年");
elseprintf("平年");
printf("%d年%d月\n\n",year,i);
}
}
voidyueli(intyear,intmonth)
{
if(runnian(year))
printf("闰年");
elseprintf("平年");
printf("%d年%d月\n\n",year,month);
x2(year,month);
}
voidrili(intyear,intmonth,intday)
{
printf("\n");
x1(year,month,day);
}
voidmain()
{
intyear,month,day,a,b;
while
(1)
{
printf("\n\n\n\n");
printf("**********************************************************\n\n");
printf("**\n");
printf("欢迎进入万年历查询系统\n");
printf("**\n\n");
printf("**********************************************************\n\n\n");
printf("1年历2月历3日历4退出\n");
printf("请输入您的选择<1~4>,按回车键确定:
");
scanf("%d",&b);
switch(b)
{
case1:
/*选择1时*/
printf("\n请输入您要查的年份:
");/*给出输入提示*/
scanf("%d",&year);/*输入查询的年份*/
a=x3(year,1,1);
if(a==0)
{
printf("错误!
请您重新输入。
\n");/*输入植异常时报错*/
break;
}
nianli(year);
break;
case2:
/*选择二时*/
printf("\n请输入您要查的年和月,年月之间用空格隔开:
");/*给出输入提示*/
scanf("%d%d",&year,&month);/*输入需要查询的年月*/
a=x3(year,month,1);
if(a==0)
{
printf("错误!
请您重新输入。
\n");
break;
}
yueli(year,month);
break;
case3:
/*选择3时*/
printf("\n请输入您要查的年月日,年月日之间用空格隔开:
");/*给出输入提示*/
scanf("%d%d%d",&year,&month,&day);/*输入年月日*/
a=x3(year,month,day);
if(a==0)
{
printf("错误!
请您重新输入。
\n");/*输入植异常时报错*/
break;
}
rili(year,month,day);
break;
case4:
exit(0);
default:
printf("错误!
请您重新输入。
\n\n");
}
}
}
第四章运行结果及分析
1.登陆界面
图4-1
登陆界面提供了四个选项进行选择,并提示输入后的操作方法;
2.显示某年全年日历
图4-2
输入指令后,依次打印出每个月份的日历。
并显示平年或者闰年;
3.显示某月日历
图4-3
第5章 课程设计心得
通过本次课程设计我第一次通过自己的实践对书本上的知识进行了与生活相关的运用。
在这个程序中,主要应用了这学期所学习的循环,条件语句,数组以及调用函数。
这些知识的应用使我对课本内容的认识得到了加深。
在编写程序的过程中,也出现了很多错误。
比如程序语句错误导致检测时连续报错;函数语句编写错误导致输出结果与实际不符等。
出现这些情况后,通过对一些新知识的学习和对网上相关资料的阅览,我发现了自己的程序的问题所在并进行了改正。
最后得到了正确的结果。
在程序的编写完成后,我按照要求对程序进行了拓展。
在输出年历的基础上增加了月历及确定日期的输出。
本来设想增加农历生肖功能,但是由于程序过于复杂,最终没能在规定时间内调试成功。
参考文献
[1]杨文君,杨柳.C语言程序设计教程[M].清华大学出版社.2010.3
[2]谭浩强.C语言程序设计教程[M].清华大学出版社.2007.6
[3]《C语言程序设计》精品课程
[4]谭浩强.C程序设计教程.:
清华大学出版社.2007.07
[5]魏海新李燕主编.C语言程序设计实用教程.机械工业出版社.2007.09
[6]李泽中孙红艳主编.C语言程序设计.:
清华大学出版社.2008.06
[7]路俊维马雪松主编.C语言程序设计.中国铁道工业出版社.2009.06