多功能万年历Word文档下载推荐.docx
- 文档编号:7599230
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:25
- 大小:162.58KB
多功能万年历Word文档下载推荐.docx
《多功能万年历Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《多功能万年历Word文档下载推荐.docx(25页珍藏版)》请在冰点文库上搜索。
在条件有限的情况下,动手在纸上严格按语法规那么一丝不苟的写程序;
另一方面,在条件允许的情况下,应该尽量上机练习,调试自己所写的程序。
让C语言具有更积极的意义。
本课程设计存在一些缺乏之处,竭诚希望大家批评指正。
一、设计的目的
经过一学期在任教授的指导下,让我们初步的认识了C语言的一些根底知识,为了稳固和复习c语言的根底知识,进一步加深对C语言编程的理解和掌握,利用所学的知识,理论和实验结合,利用资源,采用模块化的构造,使用模仿修改自主设计相结合的方法,锻炼我们综合分析解决实际问题的编程能力,培养我们在工程开发中团队合作精神、创新意识及实战能力,所以我决定利用所学的一些根底知识,做一个小程序,以提高自身的编程水平与上机调试技能。
二、课程题目
编写程序,解决万年历问题。
三、程序的主要功能
〔1〕显示当前的日期与时间;
〔2〕输入一个年份,输出全年的日历;
〔3〕输入年份、月份,输出该月的日历;
〔4〕输入年、月、日,计算出这天是星期几;
〔5〕计算你活了多少天〔计算两个日期相隔多少天〕;
〔6〕输入一个日期,输出该日期对应的星座;
〔7〕输入一个年份,输出该年的生肖;
四、课程思考
由于这个程序相对来说比拟大,为了它能更好的实现各个局部的功能,我要把它来分为各个小的模块来实现:
由于第一个功能是要让人能一眼就看见,所以我就决定把它放在主菜单界面,让人能一眼就看到当前时间,也好进展相应的操作;
第二个功能我决定用一个oneyear()的函数模块来实现;
第三个功能用一个onemonth()的函数模块来实现;
第四个功能用oneday()的函数模块来实现;
第五个功能用xg()的函数模块来实现;
第六个功能用一个xz()的函数模块来实现;
第七个功能如果和第二个功能相结合就完美了,但是由于我软件的窗口无法放大来显示调试结果,为了防止出错,我还是用sx()的函数模块来实现〔本程序中有几个的程序模块都是从本课程设计的参考文献[2]中借鉴而来〕。
五、系统总体框架图
六、要点分析
这里将这个功能定义为一个功能模块,在主程序中分别调用,实现不同的功能。
在这个问题中,最主要的是闰年和平年的判断和如何确定每年的第一天是星期几。
某一年是闰年的条件为:
该年份能被4整除但不能被100整除,或者能被400整除。
根据这些条件,可以写出判断闰年的函数如下:
intisleap(inta)
{return(a%4==0&
&
a%100!
=0||a%400==0);
}
对于该函数,给它一个年份,如果返回值是1那么说明是闰年,如果返回值是0那么为非闰年。
判断是否为闰年主要是确定2月份的天数,其他的月份天数是固定的。
确定一年的第一天是星期几的函数如下:
intday(intyear)
{longa,b;
if(year<
=2000)
{
a=2000-year;
b=6-(a+a/4-a/100+a/400)%7;
returnb;
else
{a=year-2000;
b=(a+(a-1)/4-(a-1)/100+(a-1)/400)%7;
returnb;
在该函数中,对于年份首先判断实在2000年之前还是在2000年之后,然后分别计算,最后返回该年份的第一天是星期几,这里,返回值0—6分别对应的是星期天到星期六。
知道了每个月的天数和该年的第一天是星期几,利用累加就能算出每一天对应星期几,也就容易实现万年历系统的功能。
七、源程序代码
〔1〕首先建立头文件,如下所示:
#include"
stdio.h"
conio.h"
#include<
time.h>
#defineD"
summontuewedthufrisat"
voidbaiyang();
voidjingniu();
voidshuangzi();
voidjuxie();
voidshizi();
voidchu();
voidtianp();
voidtianx();
voidsheshou();
voidmojie();
voidshuiping();
voidshuangyu();
voidprint(intn)
{inti;
for(i=0;
i<
n;
i++)
printf("
"
);
{longa,b;
a=year-2000;
intisleap(inta)
return(a%4==0&
在头文件中,包含了闰年的判断,确定一年的第一天是星期几,显示n个空格等函数,以及几个宏定义和必须的头文件stdio.h。
〔2〕显示一年的日历:
voidoneyear()
{inta[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inti,j,k,m,n,f1,f2,year,d;
clrscr();
printf("
qingshurunianfen:
\n"
scanf("
%d"
&
year);
nisuoshurudenianfenshi:
%d\n"
year);
d=day(year);
if(isleap(year))
a[2]++;
for(i=1;
=12;
i+=2)
{m=n=f1=f2=0;
switch(i)
{
case1:
january1"
break;
case3:
march3"
case5:
may5"
case7:
july7"
case9:
septrmber9"
case11:
november11"
}
print(21);
switch(i+1)
case2:
february2"
case4:
april4"
case6:
june6"
case8:
august8"
case10:
october10"
case12:
december12"
printf(D);
printf(6);
for(j=0;
j<
6;
j++)
{if(j==0)
{print(d*4);
for(k=0;
k<
7-d;
k++)
%4d"
++m);
print(6);
d=d+a[i]%7;
d%=7;
print(d*4);
++n);
else
{for(k=0;
7;
if(m<
a[i])
print(4);
if(m==a[i])
f1=1;
if(n<
a[i+1])
if(n==a[i+1])
f2=1;
if(f1&
f2)
break;
d=d+a[i+1]%7;
27;
="
print(7);
if(i==5)
getch();
该函数将每年的日历分为两屏显示,每屏显示6个月,在这个函数中,变量m,n分别为同一行上两个月的日期,利用累加实现。
变量d用来记录每个月第一天是星期几,通过它确定每个月显示的位置。
〔3〕显示每个月的日历:
voidonemonth()
{inta[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inti,j,k,m,flag,year,month,d;
qingshurunianfenheyuefen\n"
%d%d"
year,&
month);
\nthecalendarof%d\n"
switch(month)
{case1:
january1\n"
february2\n"
march3\n"
april4\n"
may5\n"
june6\n"
july7\n"
august8\n"
septrmber9\n"
october10\n"
november11\n"
december12\n"
\n\n"
month;
d+=a[i]%7;
m=flag=0;
for(i=0;
if(i==0)
print(4*d);
{for(j=0;
if(m<
a[month])
flag=1;
if(flag)
getch();
〔4〕输入年月日,计算出这天是星期几:
voidoneday()
inti,year,month,dday,d;
qingshurunianyueri\n"
%d%d%d"
month,&
dday);
nishurudenianyuerishi%d.%d.%d."
year,month,dday);
d+=(dday-1)%7;
switch(d)
{case0:
sunday.\n"
monday.\n"
tuesday.\n"
wednesday.\n"
thursday.\n"
friday.\n"
saturday.\n"
该函数中首先要确定该年的第一天的星期数,而后对应月份第一天的星期数,再计算出该天的星期数,最后输出结果。
〔5〕输入两个年月日,计算后一个日期与前一个日期相隔多少天:
voidxg()
{intyear,month,day,n;
intsum=0,sum1=0,sum2=0,l=0,i,j,k,y,y1,m1,d1,
a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
intb[12]={31,29,31,30,31,30,31,31,30,31,30,31};
pleaseinpuutyear,month,day\n"
day);
y1,&
m1,&
d1);
if(year<
=y1)
for(y=year;
y<
y1;
y++)
{if(isleap(y))
l+=366;
l+=365;
month-1;
sum1+=b[i];
sum1+=a[i];
sum1=sum1+day-1;
/*注:
sum1=sum1+day-1;
由于计算机是从0开场计算,所以天数要减1才能实现功能,后同*/
if(isleap(y1))
m1-1;
sum2+=b[i];
sum2+=a[i];
sum2=sum2+l+d1-1;
sum=sum2-sum1;
%dnian%dyue%driyu%dnian%dyue%dri\nxiangge%dtian"
year,month,day,y1,m1,d1,sum);
shurucuowu"
该函数中先计算前一个日期的那一天到那一年的第一天有多少天〔sum1〕,在计算后一个日期的那一天到那一年的有多少天,再加上相隔年数的天数〔当然还要考虑闰年和平年〕的总和〔sum2〕减去前面的天数,就能得到他们相隔的天数〔sum〕,输出最后的结果。
〔6〕输入一个日期,输出当日的星座:
voidxz()
{
intmonth,day;
pleaseinputmonthandday:
if(day<
=19)mojie();
elseshuiping();
=18)shuiping();
elseshuangyu();
=20)shuangyu();
elsebaiyang();
=19)baiyang();
elsejingniu();
=20)jingniu();
elseshuangzi();
=21)shuangzi();
elsejuxie();
=23)juxie();
elseshizi();
=22)shizi();
elsechu();
=22)chu();
elsetianp();
=23)tianp();
elsetianx();
=22)tianx();
elsesheshou();
=21)sheshou();
elsemojie();
default:
inputerror!
voidbaiyang()
Thestaryoulookforis:
白羊座Aries\n\n\n"
voidjingniu()
Thestaryoulookforis:
金牛座Taurus\n\n\n"
voidshuangzi()
双子座Gemini\n\n\n"
voidjuxie()
巨蟹座Cancer\n\n\n"
voidshizi()
狮子座Leo\n\n\n"
voidchu()
处女座Virgo\n\n\n"
voidtianp()
天秤座Libra\n\n\n"
voidtianx()
天蝎座Scorpio\n\n\n"
voidsheshou()
射手座Sagittarius\n\n\n"
voidmojie()
摩羯座Capricornus\n\n\n"
voidshuiping()
水瓶座Aquarius\n\n\n"
voidshuangyu()
双鱼座Pisces\n\n\n"
该函数是先将你输入的月份通过if语句进展逐一的判断,判断它属于哪个星座,然后调用它属于的哪个函数,再输出那个日期所对应的星座。
〔7〕输入一个年份,输出该年的生肖:
voidsx()
{char*p[12]={"
long"
"
she"
ma"
yang"
hou"
"
ji"
gou"
zhu"
shu"
niu"
hu"
tu"
};
intyear,middle;
pleaseinputayear:
if(year>
jinnianshi%snian\n"
p[(year-2000)%12]);
else
p[12-(2000-year)%12]);
该函数中首先给定一个年份〔2000年〕的生肖为龙年,然后通过这个年份之后的年数和之前的年数,通过计算找到相应数组中对应元素为该输入年数的生肖。
〔8〕主程序〔由于当前时间要显示在主菜单界面,为了防止清屏无法显示,就把它的模块实现在注模块中〕:
voidmain()
intchoice,flag;
structtm*tmpointer;
time_tsec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 万年历