C语言万年历课程设计报告书.docx
《C语言万年历课程设计报告书.docx》由会员分享,可在线阅读,更多相关《C语言万年历课程设计报告书.docx(12页珍藏版)》请在冰豆网上搜索。
C语言万年历课程设计报告书
C语言课程设计报告书
万年历系统设计
学院:
理学院
专业:
信息与计算科学
姓名:
指导教师:
序言
经过一个学期对《C程序设计》的学习,同学们都认为真正的学到了有用知识,可能有一些人学的不够理想,但无论如何,这些知识都为我们的下一步学习打下了坚实的基础。
做这么一个课程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。
本程序是一个万年历程序,可以查询1970年1月1日到2100年1月1日中任意一天是星期几,只要在运行程序时按照要求输入年,月,日,程序就会把这一天是星期几显示子啊屏幕上;也可以输入一个年份和一个月份,程序就会把该月份的月历显示在屏幕上,使人一目了然。
该程序能与目前天文学研究中所采用的各种日历程序所能计算的结果相一致。
还有许多功能等着你去探讨。
这个程序花费了很多时间,用了一天的时间去设计程序和调试程序,而在调试程序的过程中,经常会出现一些不如意的地方,所以程序就要修改。
所以这样经过一次又一次的修改之后,程序更显得人性化。
通过这一次程序的设计,让我深深的感受到程序员的辛苦。
2012年6月11日
【课程设计题目:
万年历系统】
【要求】
1:
程序的功能多样;
2:
输入日期能够判断该日期是星期几;
3:
输入一个年份能够显示出该年的全部月历;
4:
输入一个年月能够显示该月的月历;
5:
输入一个年份能够判断该年是闰年还是平年;
6:
能够退出。
【系统总体功能设计框架】
Y,y
N
【系统功能模块图】
主要功能模块1:
输入year,month,day
计算month与当年的1月间隔了多少天r
r=r+(year/4)*1461+(year%4)*365+day
r=r%7
r==0
r==1
r==2
r==3
r==4
r==5
r==6
Sat
Sun
Mon
Tue
Wed
Thu
Fir
Y或y返回菜单
其他输入均退出
程序代码:
{printf("pleaseinputthedayyouwant(2100,1,1>****,**,**>1970,1,1):
");
scanf("%d,%d,%d",&year,&month,&day);
for(b=0,r=0;b{
r=a[b]+r;
}
year=year-1972;
r=r+(year/4)*1461+(year%4)*365+day;
if(r%7==0)printf("TodayisSaturday.\n");
elseif(r%7==1)printf("TodayisSunday.\n");
elseif(r%7==2)printf("TodayisMonday.\n");
elseif(r%7==3)printf("TodayisTuesday.\n");
elseif(r%7==4)printf("TodayisWednesday.\n");
elseif(r%7==5)printf("TodayisThursday.\n");
elseprintf("TodayisFirday.\n");
choose=getchar();
printf("Continue(y/n):
\n");
scanf("%c",&choose);
if(choose=='y'||choose=='Y')main();
}
主要功能模块2:
输入的年月
判断输入年是否为定义年
是否
总天数S=1
总天数S为定义年到输入年的总天数
把S加上该年一月到输入月份的天数,再加1
判断输入的月份是否
为闰年中的月份
是否
该月是否大于二月
是否
把S加上该年一月
到输入月份的天数
把S再加上该把S加上该年年一月到输入一月到输入月
的月份的天数份的天数
再加1
总天数为S
判断S的最后一天为星期几
从这一天起依次输出输入月份的天数直到该月底为止
程序代码:
{
staticintt[12]={31,0,31,30,31,30,31,31,30,31,30,31};
inti,y,weekday=0;
longdays=0;
if(leap_year(year))t[1]=29;
elset[1]=28;
y=t[month-1];
if(year>2006)
{
days=(year-2006)*365+count_leap(year)+monthdays(month,year);
weekday=days%7;
}
elseif(year<2006)
{days=(2005-year)*365+count_leap(year)+monthdays(month,year);
weekday=7-days%7;
}
else
{days=monthdays(month,year);weekday=days%7;}
for(i=1;iprintf("\t");
for(i=1;i<=y;i++)
{if((i+weekday-1)%7==0)printf("\n\t%3d\t",i);
elseprintf("%3d\t",i);};
}
主要功能模块3:
输入的年份
判断从定义年到输入的年份中
每个年份是否为闰年
是否
闰年
每年为366天
平年
每年为365天
返回该年的天数
程序代码:
{inti;
if(year%4==0&&year%100!
=0||year%400==0)i=1;
elsei=0;
returni;
}
【用到的语句】
1.,/*头文件*/
2.main()/*主函数*/
3.printf(),
4.scanf()
5.a[]/*数组*/
6.if语句
7.for语句
8.void/*要调用到的函数*/
【源程序代码】
#include
#include
intmain()//主函数
{intleap_year(inty);
intcount_leap(intyear);
intmonthdays(intmonth,intyear);
voidmonthprint(intyear,intmonth);
intyear,month,day,b,r,number;//定义变量
charchoose;
inta[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
printf("*********************************mainMeun***********************************\n");
printf("1:
riqi>>>xingqiji.\n");
printf("2:
yueli.\n");
printf("3:
rili.\n");
printf("4:
runnianpanduan.\n");
printf("5:
exit\n");
printf("\n");
printf("*****************************************************************************\n");
printf("pleaseinputthenumber:
");
scanf("%d",&number);
if(number==1)
{printf("pleaseinputthedayyouwant(2100,1,1>****,**,**>1970,1,1):
");
scanf("%d,%d,%d",&year,&month,&day);//输入要查询的日期
for(b=0,r=0;b{r=a[b]+r;}
year=year-1972;
r=r+(year/4)*1461+(year%4)*365+day;//计算输入日期与1970,1,1间隔了多少天
if(r%7==0)printf("TodayisSaturday.\n");
elseif(r%7==1)printf("TodayisSunday.\n");
elseif(r%7==2)printf("TodayisMonday.\n");
elseif(r%7==3)printf("TodayisTuesday.\n");
elseif(r%7==4)printf("TodayisWednesday.\n");
elseif(r%7==5)printf("TodayisThursday.\n");
elseprintf("TodayisFirday.\n");
choose=getchar();
printf("Continue(y/n):
\n");//选择是否继续
scanf("%c",&choose);
if(choose=='y'||choose=='Y')main();//主函数调用主函数本身
}
elseif(number==2)
{printf("pleaseinputtheyear(5000>****>0):
");
scanf("%d",&year);//输入要查询的年份
for(month=1;month<13;month++)//循环输出12个月份的月历
{printf("%dyear%dmonth\n",year,month);
printf("****************************************************************************\n");
printf("SunMonTueWenThuFriSat\n");
monthprint(year,month);
printf("\n");
printf("****************************************************************************\n");
}
choose=getchar();
printf("Continue(y/n):
\n\n");
scanf("%c",&choose);
if(choose=='y'||choose=='Y')main();
}
elseif(number==3)
{printf("pleaseinputtheyearandmonth(2100,1>****,**>1970,1):
");
scanf("%d,%d",&year,&month);//输入要查询的年,月
printf("%dyear%dmonth\n",year,month);
printf("************************************************************************\n");
printf("SunMonTueWenThuFriSat\n");
monthprint(year,month);//
printf("\n");
printf("************************************************************************\n");
choose=getchar();
printf("Continue(y/n):
\n\n");
scanf("%c",&choose);
if(choose=='y'||choose=='Y')main();}
elseif(number==4)
{printf("pleaseinputayear5000>****>0:
");
scanf("%d",&year);//输入要查询的年份
if(leap_year(year))
printf("Thisisrunyear.\n");
elseprintf("Thisispingyear.\n");
choose=getchar();
printf("Continue(y/n):
\n\n");
scanf("%c",&choose);
if(choose=='y'||choose=='Y')main();
}
else//选择其他则退出
return0;
}
intleap_year(intyear)//判断是否闰年
{inti;
if(year%4==0&&year%100!
=0||year%400==0)i=1;
elsei=0;
returni;
}
intcount_leap(intyear)
{inti=0,j,min,max;
if(year>2006){min=2006;max=year;}
else{min=year+1;max=2006;}
for(j=min;jif(leap_year(j))i++;
returni;
}
intmonthdays(intmonth,intyear)//该月的天数
{intsum=0,i,j;
if(year>=2006)
{staticintt[12]={31,0,31,30,31,30,31,31,30,31,30,31};
j=month-1;
if(leap_year(year))t[1]=29;
elset[1]=28;
for(i=0;isum=sum+t[i];
}
else
{staticintt1[12]={31,30,31,30,31,31,30,31,30,31,0,31};
j=12-month;
if(leap_year(year))t1[10]=29;
elset1[10]=28;
for(i=0;i<=j;i++)
sum=sum+t1[i];
}
returnsum;
}
voidmonthprint(intyear,intmonth)//输出该月的月历
{staticintt[12]={31,0,31,30,31,30,31,31,30,31,30,31};
inti,y,weekday=0;
longdays=0;
if(leap_year(year))t[1]=29;
elset[1]=28;
y=t[month-1];
if(year>2006)
{days=(year-2006)*365+count_leap(year)+monthdays(month,year);
weekday=days%7;
}
elseif(year<2006)
{days=(2005-year)*365+count_leap(year)+monthdays(month,year);
weekday=7-days%7;
}
else
{days=monthdays(month,year);weekday=days%7;}
for(i=1;iprintf("\t");
for(i=1;i<=y;i++)//输出该月的月历
{if((i+weekday-1)%7==0)printf("\n\t%3d\t",i);
elseprintf("%3d\t",i);
};
}
【调试及分析过程】
1:
在代码编辑器上输入以上程序代码后,保存并f9到tc3.0上运行
结果输出:
分析:
运行后出现“菜单”,选项意思是:
输入1,则确定一个日期是星期几。
输入2,则是查询某年的12个月历。
输入3,则是查询某年某月的月历。
4,则是判断输入年是闰年还是平年。
5,退出。
2:
选择1后,再根据提示输入****,**,**:
2011,10,28
结果输出:
分析:
输入你要查询的年月日后,程序会经过计算输出该日的星期号。
然后,输出结果后,系统会询问你是否继续,输入y或Y,继续;输入N或n或其他字母都会直接退出。
3:
选择y后
结果输出:
4:
选择2后,再根据提示输入你想查询的年份****:
2012
结果输出:
分析:
输入你要查询的年份后,系统会经过计算得出每月的月历,然后输出。
但因为输出窗口限制,结果只能看到部分。
同样的,输出结果后,系统仍然会询问是否继续。
5:
选择3后,再根据提示输入你要查询的月份****,**:
2012,6
结果输出:
分析:
输入你要查询的月份后,系统会经过计算得出该月的月历图,然后输出。
同样的系统依然会询问是否继续。
6:
选择4后,再根据提示输入你要查询的年份****:
2100
结果输出:
7:
在程序成功测试之前出现主要的问题是:
错误:
程序经计算后得出的月历的开头第一行对不上下面的。
分析:
原因是在给每月的第一天的前面空格时多空了一个位
只要将“i<=weekday;”改为“i【总结】
经历了这次课程设计的设计和制作的整个过程,我才发现我知识的贫乏和知识面的狭窄,真实的感受到程序设计的困难性,只说时间上面,我总共花了二十几个小时。
这次作课程设计我也是收获很大,首先,我对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我学会用了。
其次,我这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我学到了一些书本中学不到的知识,让我长了见识。
同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。
这次作的这一个设计,虽然我自己觉的很有的成就感,但是这必竟是我第一次作C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我一定会做的更好。
对C语言在编写程序时的用处有了更明确的认识,懂得了编写C程序的一般法方步骤。
最大的收获是,编写程序时一定要有信心和勇气,要相信自己一定可以把这个程序编写出来。
分析问题做出算法,想好思路,在心里有个大致的框架,然后按部就班的记下自己想到的每一点内容,把写下的东西认真整理,查缺补漏,把一些细节的地方补上,就这样一个貌似很难的程序就写出来了。
其实编程并不难,关键是要投入,要钻到里面去。
下一步就是读程序了,读程序时一定要小心仔细,一条语句一条语句的读,看是否能输出自己想要输出的结果,如果发现错误要马上改过来,再接着向下读,直到把程序调试的完美无缺为止。