万年历课程设计报告
课程设计报告课程名称程序设计基础专周题目年历显示姓名XX班级XXXXXX学号XX指导教师XXX设计时间2022-03-02至2022-03-06XX学院计算机工程系XX学院课程设计(论文)任务书一、课程设计题目  年历显示二、课程设计工作自2022年03月02日至2022年03月06日。
三、课程设计地点:XXXX四、课程设计内容要求:
1.本课程设计的目的1)增进对C语言各理论知识的熟练程度,2)加强算法设计的能力,为以后的程序设计与编写打下良好基础。
3)增加对C语言的熟练程度,提高程序设计的能力,并初步接触实用程序的编写。
2.课程设计的任务及要求题目:年历显示要求:(1)
输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
(2)
输入年月,输出该月的日历。
(3)
输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
3)课程设计编写要求1)详细清晰地描述个人的课程设计工作;
2)要按照本模板的规格打印誊写课程报告;
3)课程报告包括目录、内容提要、正文、课程设计体会、参考文献、附录等;
4)课程报告装订按学校的统一要求完成4)评分标准:
1)完成原理分析:20分;
2)完成设计过程:40分;
3)完成代码分析:20分。
4)个人创新工作:20分。
学生签名:
XX2022年3月8日目录目录-1-正文-2-一、需求分析-2-二、个人工作-2-三、概要设计-2-流程图……………………………………………………………….-2-程序……………………………………………………………….-4-四、程序结果-7-课程设计体会-9-正文一、需求分析我选择课程设计题目:年历显示日常生活当中,我们查询日期很大程度上需要用到日历。而手动去翻纸质日历查询速度慢,而且会让人看的眼花缭乱。因此,我们可以编写一个程序来显示某一年的日历。
①程序要能够准确输出某一年的日历;
②程序要能够准确的输出某一年的某一月的月历;
③程序能够详细查询某一年某一天的日期;
④程序能够循环输出。
二、个人工作(1)、设计程序主题,根据输入的内容判断是否为年,月,日,然后输出对应内容;
(2)、想出一个算法,排列月份,使输出年历的格式与题目要求一样;
(3)、想出一个算法,计算某一天到现在时间有多少天。
(4)、编写打印年历的函数;
(5)、编写打印月历的函数;
(6)、编写计算日期的函数;
(7)、编写主程序。
设计方法:
先设计一个主程序,有特定的用户输入界面,然后根据输入的内容判断应该打印的内容。比如输入2022,程序判断为打印2022年的年历;
输入202203程序判断应该打印2022年3月的月历;
输入20220305,程序判断是查询2022年3月6日的信息。然后根据要执行的功能调用相应的函数。
然后分别设计打印日历和打印月历,以及判断日期的函数。函数思想会在后面的概要设计里面阐述。
三、概要设计1、画出程序流程图;
主程序流程图:
打印年历或月历的流程图2、根据流程图设计程序首先是主程序,这个程序的主要功能是判断输入的内容并调用相应的函数。
主程序(部分):
#include<stdio.h>#include<math.h>voidpart1(intx);//函数1~6为打印日历的函数voidpart2(intx);voidpart3(intx);voidpart4(intx);voidpart5(intx);voidpart6(intx);intweak(intx,inty);//计算1号对应的星期intweak2(intx,inty,intz);//计算星期,为函数day提供数据intyear(intx);//打印日历的函数intmouth(intx);//打印月历的函数intday(intx);//查询天数的函数intdistance(intx,inty,intz);//提供距离天数查询intmain(){inta;charz;x://位置标注printf(“\n“);printf(“请输入一个日期(Ex:20220302或202203或2022):“);scanf(“%d“,&a);printf(“\
n“);if((1940<=a)&&(a<=2040))year(a);elseif((194001<=a)&&(a<=204012))mouth(a);elseif((19400101<=a)&&(a<=20401231))day(a);else{printf(“输入错误,请重新输入!“);gotox;}printf(“\n“);printf(“\n“);printf(“继续查询(y),退出(n):“);scanf(“%s“,&z);if(z=='y')gotox;else;return0;}然后是各部分的函数,主要列出几个比较重要的函数:
计算每个1日月对应星期几的函数:
intweak(intx,inty)//这个函数用于计算3~12月份的第一天对应的星期{intw2,w3,a;if(x<2000)//小于两千年的一月份{a=x-19*100;w2=(19/4)-2*19+(a+a/4)+(13*(y+1)/5);while(w2<0)w2=w2+7;w3=w2%7;}if(x>=2000)//大约两千年的一月份{a=x-20*100;w2=(20/4)-2*20+(a+a/4)+(13*(y+1)/5);while(w2<0)w2=w2+7;w3=w2%7;}returnw3;}这个函数是通过使用蔡勒公式来实现的;
下面这个函数是计算某天距离现在还有多少天:
intdistance(intx,inty,intz)//查询距今时间的函数x,y,z为查询的年月日{intmonthday[13]={0,31,2
8,31,30,31,30,31,31,30,31,30,31};//定义12个月每个月天数intn1,y1,r1,i,temp,daytemp,x1,tempmonth1,tempmonth2,allday,t,y2;//n1,y1,r1为现在时间,通过输入t转换;
tempmonth1为计算以前年份后的月份的天数,tempmonth2计算现在日期月份的天数,//temp,x1,y2,t为临时变量printf(“\n“);printf(“请输入今天日期(Ex:20220305):“);scanf(“%d“,&t);//输入当前时间n1=(int)(t/10000);y2=t%10000;y1=(int)(y2/100);r1=y2%100;//分别计算出年,月,日temp=n1-x;if(temp<0)//将年份差值转换为正数temp=-temp;daytemp=temp*365;//计算相差日期x1=x;for(i=0;i<temp;i++)//计算闰年多的一天{if(x1%4==0){if(x1%100!=0)daytemp++;elseif((x1%100==0)&&(x1%400==0))daytemp++;else;}。。。。。。。。。
这个函数的算法是先计算两年之间的差值,然后加上现在时间的月份和日期,再减去查询哪一年已经过了的日期。
四、程序结果1、查询主界面:
2、当输入数据为年份是,比如2022,打印2022年的年历;
3、当输入数据是月份时,比如:202203,打印2022年3月的月历;
4、当输入数据为某一天是,比如:20220305,输出这一天的详细信息;
利用printf函数输出日历
5、退出查询课程设计体会通过这次C语言的课程设计,我明白了很多也知道了很多,更收获了很多。在课程设计的过程中出现过困难,但我都一一去客服,去解决。最终,终于完成了一份满意的程序。
转眼几天的课程设计已经结束了。回想学习C语言的过程中,既有快乐又有烦恼,回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计的过程中遇到的问题,这毕竟独立做的,难免会遇到各种各样的问题,同时在设计的过程中发现自己的不足之处,对以前所学的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识从新温故。这次课设终于
顺利完成了,在设计中遇到了很多编程问题做完这个课程设计,我们的自信一下子提高了,我们也会写程序了;
尽管对于有些人这种程序会很简单,可对于我们C语言初学者来说,已经很不容易了。这次体验为以后的学习计算机的我们增强了信心。享受劳动成果的滋味实在美妙啊!很感谢这次的课程设计,它使我更加地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题;
另外,在做任何事倒要有耐心,不要一遇到困难就退缩。