1、c万年历系统课程设计报告学号2016-2017学年 第2学期 1608220203高级语言程序课程设计课程设计报告题目: 万年历系统专业: 网络工程(对口)班级: 16(3)姓名: 代应豪指导教师: 代美丽成绩:计算机学院2017年4月25日目 录1.设计内容及要求 21.1 课程设计的内容 21.2 课程设计的要求 22.概要设计 32.1 系统总体设计 32.2功能模块设计 33.设计过程或程序代码 43.1算法提示: 43.2程序源代码 54.设计结果与分析 154.1设计结果 154.2 程序分析 181.设计内容及要求1.1 课程设计的内容设计编写一个C程序“万年历”。 本程序是一个
2、万年历程序,可以查询1901年到9999年中任意一天是星期几,只要在运行程序时按照要求输入年,月,日,程序就会把这一天是星期几显示在屏幕上;也可以输入一个年份和一个月份,程序就会把该月份的月历显示在屏幕上,使人一目了然。1.2 课程设计的要求1:程序的功能多样;2:输入日期能够判断该日期是星期几;3:输入一个年份能够显示出该年的全部月历;4:输入一个年月能够显示该月的月历;5:输入一个年份能够判断该年是闰年还是平年;6:能够退出。2.概要设计2.1 系统总体设计 通过此次课程设计可以复习巩固C语言的基础知识的同时,进一步加深对C语言的理解和掌握。主要的设计思想是通过不同的函数模块来实现并调用的
3、,将不同的数据结构组成一个整体就是此次设计的系统概要。2.2功能模块设计本系统包括4个模块,分别是闰年判断模块、星期计算模块、月历查询模块和打印整年日历模块。(1)闰年判断模块。该模块用于输入一个年份能够判断该年是闰年还是平年。(2)星期计算模块。该模块主要是输入日期能够判断该日期是星期几。(3)月历查询模块。该模块是系统的核心模块,是用来显示指定日期所在月份的月历,包括打印指定个数的空格、打印分隔线。(4)打印整年日历模块。该模块用于输入一个年份能够显示出该年的全部月历3.设计过程或程序代码3.1算法提示:1.功能结构框图: 2.闰年的判断:计算所输入的年份是否可被4整除,若不能被整除,为平
4、年。若可被4整除,计算此年份能否被100整除,不能被100整除则为闰年。既能被4整除,也能被100整除的年份,若也能被400整除,则为闰年,否则为平年。闰年366天,平年365天 3.2程序源代码#include #include char *NameOfMonth12=January,February,March,April,May,June,July,August,September,October,November,December;char *WeekDay7=星期日,星期一,星期二,星期三,星期四,星期五,星期六;int IsLeapYear (int year) if(year%4
5、=0&year%100!=0|year%400=0) return 1;/闰年返回1 else return 0;/平年返回0 int DateCheck(int uYear,int uMonth,int uDay)/合法返回true,非法或超出范围返回false if (uYear9999|uMonth12|uDay31) return 0; if (uMonth=4|uMonth=6|uMonth=9|uMonth=11) if (uDay30) return 0; else if (uMonth=2) if (IsLeapYear(uYear) if (uDay29) return 0;
6、 else if (uDay28) return 0; return 1;int GetDays (int year,int month,int day) int sum=0; if (DateCheck(year,month,day)=0) return -1;/日期有误 if(year=1901) int X=(int)(year/100);/世纪数 int Y=X-(int)(X/4);/如果按4年一闰来算,Y指的是比实际上多算的天数,在下面需要减去 if (month0) year-;/把1月、2月视为上一年的13月、14月(纯粹为了计算需要) month+=12; sum=(int)
7、(365.25*(year-1900)+(int)(30.6*(month+1)+day-Y-49;/以365.25(本来实际太阳年是365.2425天)来计算是为了计算按4年一闰的整数年总天数,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的) /月份以30.6天的平均值计算。最后减去的49,是多加的一个月以及其余相差天数的和,可得到1900年1月1日的积日为0 return sum;/返回距离1900年1月1日的总天数(积日)int GetDayOfMonth(int month,int year) int tmp_days=GetDays(year,month,1);/
8、本月积日 int DayOfMonth=0; month+;/下个月 if (month12) month=1;/遇到月份为12月的情况,月份为1,年份加1 year+; DayOfMonth=GetDays(year,month,1);/下个月的积日 DayOfMonth-=tmp_days;/下月1日的总天数(距离1900年1月1日的积日)减去当前月1日的总天数 return DayOfMonth;/返回当前月总天数int ShowCalendar(int year,int month,int day) int i,j,count; int jiri=0;/积日 int dayofweek
9、=0;/星期 if (DateCheck(year,month,day)=0) printf(输入日期有误!rn);/日期不合法或超出范围,年历从1901年开始 return 0; printf(t %d %srn,year,NameOfMonthmonth-1); printf(-rn); printf( Sun Mon Tue Wed Thu Fri Satrn); printf(-rn); jiri=GetDays(year,month,1);/获取距离1900年1月1日的总天数 dayofweek=(1+jiri)%7;/月首星期,因为1900年1月1日星期一 count=GetDay
10、OfMonth(month,year); for(i=0;idayofweek;i+) printf( );/填充前面空格 for(i=1,j=dayofweek;i=count;i+,j+) if (i); scanf(%d,&nChoise); switch (nChoise) case 1: printf(请输入要判断的年份:Year); scanf(%d,&year); if (year9999) printf(输入年份超出范围!); break; if (IsLeapYear(year)=1) printf(%d年是闰年!rnrn,year); else printf(%d年不是闰年
11、!rnrn,year); break; case 2: printf(请输入要判断的日期:Year Month Day); scanf(%d %d %d,&year,&month,&day); totaldays=GetDays(year,month,day); printf(%d年%d月%d日是%srnrn,year,month,day,WeekDay(totaldays+1)%7); break; case 3: printf(请输入要显示的月份:Year Month); scanf(%d %d,&year,&month); ShowCalendar(year,month,1); brea
12、k; case 4: printf(请输入要判断的年份:Year); scanf(%d,&year); for (month=1;month=12;month+) ShowCalendar(year,month,1); break; default: printf(无效的菜单项!rn); break; system(pause); system(cls); return 0;4.设计结果与分析4.1设计结果1.登陆界面2.闰年判断3.星期计算4.月历查询5.打印整年日历4.2 程序分析 程序首先根据用户输入的序号,进行相关的操作,首先根据year判断是否是闰年,如果是则需要将该年2月份的天数设置为29天,接着判断day是否超过month所在月份的最大天数,如果超过则显示提示信息。然后进行星期的判断,如果输出的是该月的第一个星期,则判断该星期中还有几天在本月,输出空格。输出完第一周后,接着输出第二到第五周,每周7天。 实现思路:实现该程序一定要找准一个几点,比如找准2000年1月1日是星期几,然后在此基础上推出具体某天和这个几点之间相差多少天,然后推出该天是星期几,注意显示的时候格式要对齐。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1