C语言课程设计报告-万年历1.pdf
-课程设计题目:万年历课程设计题目:万年历实验题目:实验题目:万年历程序的编写实验目的:实验目的:综合运用所学的 C 语言知识解决一个比拟实际的简单问题,侧重对数组、函数、指针、构造体和文件等相关容的综合应用,使同学们能进一步熟悉掌握 C 语言的根本语法,进一步提升自己的编程能力并逐步培养编程思维,进而不断提高同学们解决问题的能力,并为以后的语言学习打下良好的根底。实验要求:实验要求:万年历设计主要功能包括:1、查询*年*月每一天对应星期几。2、可以查询*年*月的上个月或是下个月的日历情况。3、查询*年*月*日是这一年的第几天,并查询改天是星期几。4、判断该年是闰年还是平年,判断这一年的生肖。实实 现现 思思 路路 要要 求求 有有 文文 字字 描描 述述,并并 画画 出出 流流 程程 图图:.z.-开场定义 S=0;c=0输入 y,m,dY 是闰年是判断平闰 Y%4=0 且 y%100!=0)或Y 是平年(计算是该年的第几天=s;按与几点相隔天数除 7 推星期几及y,m,d是今年的 s 天排出该月的日历及推算下月的日历计算是该年的第几天=s;y,m,d是今年的 s 天该天使星期几及该月和上下月的情况输出该年是平年还是闰年,生肖;改日是该年的第几天,星期几及该月日历及上下月日历完毕.z.-实现过程要求有文字说明实现的过程,并对相应的代码添加注实现过程要求有文字说明实现的过程,并对相应的代码添加注释释:见程序程序见后后的解析。运行时只要你输入年月日,你要的星系都会显示出来;如果想继续输入日期的话,只需按y 就可以,祥完毕按 n 就可以完毕。实验总结分析程序的得与失实验总结分析程序的得与失:得:得:通过这次程序设计,更使我了解了编程序的严谨性,每个问题,每个不走都得有依据,不得盲目乱造,同时也让我获得了一点编写简单程序的能力,使自己平时在理论课中很多部明白的东西明白了好多,学会了好多语句的用法,比方会用 y or n来决定程序是否要继续;怎么控制输出格式等等。总之在这次程序设计中我学到了很多。失:失:在编程序过程中有些函数的用法不怎么会用,偶尔会落下写简单的东西。如,;等;同时在编写输出上下个情况及判断程序是否要继续的程序上花费了好多时间;函数的声明、调用既然不清楚,感到很惭愧。实验的过失就是成功的阶梯,在过失中我也学到很多。心得体会:心得体会:我体会到了编程序的严谨性,也觉得如果我们要是熟悉课本所讲的容,不怕麻烦,坚持不懈,我们一定可以将它实现的。要有耐心,有时候很多的错误就是一个地方引起的,只要认真检查,一定能突破的,所以在以后的编程序是要细心,有耐心,人不断调试程序,直至最后成功。#includestruct/定义包含年月日数组构造体.z.-int year;int month;int day;date;int main()/主函数void print(int,int);/函数的声明int dobb(int);/函数的声明int date1(int,int,int);/函数的声明int rili();/函数的声明rili();/函数的调用return 0;int rili()/定义函数int days;/定义整型变量int a,b;/定义整型变量char z;/定义字符变量printf(+nn);/输出头的格式printf(万年历nn);printf(+n);printf(功能有:n);printf(t);printf(1.查询*年*月*天对应星期几;nt2.查询*年*月上下个月情况;nt3.显示该日子是该年的第几天,并查询改天星期几;nt4.判断该年是平年还是闰年以及生肖等。n);printf(&+&n);printf(请输入年月日:);scanf(%d,%d,%d,&date.year,&date.month,&date.day);/输入年月日switch(date.month)/计算第几天的case 1:days=date.day;break;case 2:days=date.day+31;break;case 3:days=date.day+59;break;case 4:days=date.day+90;break;case 5:days=date.day+120;break;case 6:days=date.day+151;break;case 7:days=date.day+181;break;case 8:days=date.day+212;break;case 9:days=date.day+243;break;case 10:days=date.day+273;break;case 11:days=date.day+304;break;case 12:days=date.day+334;break;if(date.year%4=0&date.year%100!=0)|date.year%400=0)&date.month=3)days+;printf(%d 月%d 日是%d 的第%d 天。n,date.month,date.day,date.year,days);.z.-if(date.year%4=0&date.year%100!=0)|date.year%400=0)/判断平闰年的语句printf(%d 是闰年。n,date.year);/输出平闰年的elseprintf(%d 是平年。n,date.year);if(date.year=2013)/判断 2013 年后生肖的语句a=(date.year-2013)%12;switch(a)case 0:printf(%d 是蛇年。n,date.year);break;case 1:printf(%d 是马年。n,date.year);break;case 2:printf(%d 是羊年。n,date.year);break;case 3:printf(%d 是猴年。n,date.year);break;case 4:printf(%d 是鸡年。n,date.year);break;case 5:printf(%d 是狗年。n,date.year);break;case 6:printf(%d 是猪年。n,date.year);break;case 7:printf(%d 是鼠年。n,date.year);break;case 8:printf(%d 是牛年。n,date.year);break;case 9:printf(%d 是虎年。n,date.year);break;case 10:printf(%d 是兔年。n,date.year);break;case 11:printf(%d 是龙年。n,date.year);break;elseb=(2013-date.year)%12;switch(b)/判断 2013 年前生肖的语句case 0:printf(%d 是蛇年。n,date.year);break;case 1:printf(%d 是龙年。n,date.year);break;case 2:printf(%d 是兔年。n,date.year);break;case 3:printf(%d 是虎年。n,date.year);break;case 4:printf(%d 是牛年。n,date.year);break;case 5:printf(%d 是鼠年。n,date.year);break;case 6:printf(%d 是猪年。n,date.year);break;case 7:printf(%d 是狗年。n,date.year);break;case 8:printf(%d 是鸡年。n,date.year);break;case 9:printf(%d 是猴年。n,date.year);break;case 10:printf(%d 是羊年。n,date.year);break;case 11:printf(%d 是马年。n,date.year);break;dobb(date.year);/调用函数date1(date.year,date.month,date.day);/调用函数print(date.year,date.month);/调用函数printf(continueY/N.);/是否还要继续输入日期getchar();z=getchar();if(z=y|z=Y)/判断是rili();/调用函数.z.-if(z=n|z=N)/判断不是完毕getchar();return 0;void print(int year,int month)/print 函数的定义int i,j,n,leap,days,k,count;leap=dobb(year);/函数调用及赋值days=date1(year,month-1,1);/printf(%d 年n,year);for(i=month-1;i=month+1;i+)/输出上下月的情况if(i12)printf(%3d 月份n,i-12);/下年的 1 月if(i0&i13)printf(%3d月份n,i);/本年的月份printf(n);printf(t);printf(%-8s%-8s%-8s%-8s%-8s%-8s%-8sn,日,一,二,三,四,五,六);出格式if(days=7)/控制输出的个数days=0;else n=days;printf(t);for(j=1;j=8*days;j+)/控制输出的日期对齐printf();switch(i)case 0:case 1:case 3:case 5:case 7:case 8:case 10:case 12:count=31;break;case 4:case 6:case 9:case 11:count=30;break;case 2:if(leap)count=29;/2 月不同情况的判断else count=28;break;for(k=1;k=count;k+)/逐渐输出每月的日期.z.输-printf(%-8d,k);n+;if(n=7)printf(n);printf(t);n=0;printf(nn);days=n;int dobb(int year)/判断年份的类型函数的定义if(date.year%4=0&date.year%100!=0|(date.year%400=0)return(1);/闰年输出 1else return(0);/平年输出 0int date1(int year,int month,int day)/date1 函数的定义int leap,=0,sum;leap=dobb(year);/调用函数switch(month-1)case 11:+=30;case 10:+=31;case 9:+=30;case 8:+=31;case 7:+=31;case 6:+=30;case 5:+=31;case 4:+=30;case 3:+=31;case 2:if(leap)+=29;else+=28;case 1:+=31;default:+=day;sum=year-1+(year-1)/4-(year-1)/100+(year-1)/400+;return(sum%7);/判断星期几.z.