万年历课程设计_第1页
万年历课程设计_第2页
万年历课程设计_第3页
万年历课程设计_第4页
万年历课程设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构课程设计设计说明书万年历的实现学生姓名袁春艳学号1018014081班级计本103班成绩指导教师曹记东数学与计算机科学学院2012 年 9 月 8 日数据结构课程设计评阅书题 目万年历的实现学生姓名袁春艳学号1018014081成绩: 教师签名: 年 月 日成绩: 教师签名: 年 月 日总成绩: 室主任签名:年月日注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。课程设计任务书20122013学年第1学期专业: 计算机科学与技术 学号: 1018014081 姓名: 袁春艳 课程设计名称: 数据结构课程设计 设计题目: 万年历的实现 完成期限:自 2012 年 8 月

2、27 日至 2012 年 9 月 8 日共 2 周设计依据、要求及主要内容(可另加附页):运用C/ C+结构体、函数、数据结构等基知识,按以下要求编程实现万年历的功能:1) 阐述设计思想,画出流程图;2) 输入任一年,判断该年是否为闰年; 输入年月日计算该日为当年的那一天;3)输入任一年,显示该年的日历,日历包括阳历、农历、节气;4). 说明测试方法,写出完整的运行结果,较好的界面设计.设计要求:1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?确定问题的输入数据集合。2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类

3、型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断

4、言,使程序中逻辑概念清楚;5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析;7)编写课程设计报告;以上要求中前三个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。指导教师(签字): 教研室主任(签字):批准日

5、期: 2012年 8 月 27 日摘 要设计了一个万年历软件,该万年历具有如下的三大功能:输入任一年,判断该年是否为闰年;输入任一年,显示该年的日历;输入年月日计算该日为当年的那一天,及该日为星期几。本万年历采用Visual C+6.0工具作为软件开发环境,运用了C语言、函数、数据结构等基础知识,该万年操作简单,界面清晰,易为用户所接受。关键词:万年历;闰年;平年;查询目 录1 课题描述12 需求分析23 概要设计34 详细设计65 程序编码86 程序调试与测试147 结果分析178 总结19参考文献201 课题描述 运用C语言及数据结构等的基础知识,按以下要求编程实现万年历的功能:1)输入任

6、一年,判断该年是否为闰年; 2)输入任一年,显示该年的日历; 3)输入年月日计算该日为当年的那一天;4)判断输入的合法性;5)说明测试方法,,写出完整的运行结果,较好的界面设计。2 需求分析要求1):闰年的判断。首先应该判断输入年份是否合法,如果输入年份合法,则利用闰年的判断规则判断该年是否为闰年。闰年的判断规则是如果输入的年份能被4整除且不能够被100整除,则该年肯定是闰年。在既能被4,也能被100整除的年份中,还能被400整除的也是闰年,否则是平年。要求2):输出某年的年历。输出时首先应判断该年是否为闰年,闰年二月29天,平年二月28天,还应注意该年每月的天数。难点在于星期的判断。计算方法

7、为平年一年有365天,闰年一年为366天,从公元元年开始算起至该年的某月某日,总天数累加和除7取余及为星期几。(注余数为0时,代表星期天)要求3):判断输入是否合法。可以先判断输入的年份是否小于0,再次判断月份是否有小于零或超出12,如果通过此判断合法,再判断天数,各月的天数不能小于零或超过其应有的天数。( 例如果该年是闰年,二月份不能超过29天,如果是该年平年,二月份不能超过28天;无论平年闰年,6月份的天数都不能超过30天) 在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新输入。3 概要设计 首先建立几个具有以下功能的子函数:闰年的判断、计算总天数、计算星期、打印年历、计算需

8、要查询的日期是当年第几天及星期几。 程序划分为三个功能模块:闰年的判断、打印年历、日期的查询,如图3.1所示:闰年的判断打印年历日期查询万年历查询系统图3.1 功能模块图主函数与建立的子函数及各子函数之间的调用关系,如图3.2所示:主函数日期查询函数打印年历函数闰年判断函数菜单函数计算星期函数修改日期计算总天数函数闰年判断函数图3.2 模块调用关系图1) 、求闰年流程图如图3.3所示:开始 4整除?100整除?400整除?“1”“0”是否否是是否结束图3.3判断闰年流程图开始 2)、打印年历流程图如图3.4所示:输入年份 年份判断 否是输出年历结束图3.4打印年历关系图3)、 整体程序主要流程

9、图如图3.5所示:while循环查询某年是否为闰年输出某一年的年历查询某一天为星期几,及其为该年的第几天 是否为0结束是否开始图3.5 整个程序流程图4 详细设计建立两个整型数组leapDay12与noleapDay12分别存储闰年与平年的每月天数;int checkLeapyear(int Year)判断闰年的函数 其核心语句为:if(Year%4=0&&Year%100!=0|Year%400 = 0)return true;elsereturn false;int calcuDays(int year,int month,int day) 计算总天数函数其核心语句为:fo

10、r(i=1;i<year;i+ ) if(checkLeapyear(i) days+= 366; /闰年加366天 else days+= 365; /平年加365天for(j=1;j<month;j+ ) if(checkLeapyear(year)mon=mon+leapDayj-1;elsemon = mon+noleapDayj-1;days=days+mon+day; int calcuWeek(int totalDays) / 计算星期函数其核心语句为:weeknumber=totalDays%7;void outputyear(int nowYear ) / 打印年

11、历函数其核心语句为:for(i=0;i<12;i+)days=calcuDays(nowYear,i+1,1); weeknumber=calcuWeek(days); /计算该年一月一日为星期几 if (checkLeapyear(nowYear) monthDay = leapDayi; /如果该年为闰年,采用闰年每月天数elsemonthDay = noleapDayi; /如果该年为平年,采用平年每月天数 printf( "-%4d年%02d月-n",nowYear,i+1 );printf( "%-5s%-5s%-5s%-5s%-5s%-5s%-5

12、sn","天","一","二","三","四","五","六" );for(j=1;j<=monthDay;j+)if(j=1) /如果天数为当月的一号,将其移动到它的星期下并打印for(k=0;k<weeknumber;k+) printf("%-5s"," ");printf("%-5d",j);if(weeknumber%7=6 ) /如果星期数为星期六,换行print

13、f("n");weeknumber=calcuWeek(days+j); /求下一天的星期数printf("n");void outputmenu() / 打印系统菜单函数int checkhefa(int year,int month,int day ) / 输入合法性检查函数,比较简单int calcuday(int year,int month,int day) /计算某年某月某日为该年的第几天void Outputday(int nowYear,int nowMonth,int nowDay) /打印某年某日星期几及其该年的第几天函数void m

14、ain() /主函数调用其它函数5 程序编码#include <stdio.h>#include <stdlib.h>#define true 1#define false 0int leapDay12=31,29,31,30,31,30,31,31,30,31,30,31; /存储闰年每月天数int noleapDay12=31,28,31,30,31,30,31,31,30,31,30,31; /存储非闰年每月天数int checkLeapyear(int Year) / 判断是否闰年if(Year%4=0&&Year%100!=0|Year%400

15、 = 0)return true;elsereturn false;int calcuDays(int year,int month,int day)/ 计算总天数int i,j;int days=0,mon=0;for(i=1;i<year;i+ ) if(checkLeapyear(i) days+= 366; /闰年加366天 else days+= 365; /平年加365天for(j=1;j<month;j+ ) if(checkLeapyear(year)mon=mon+leapDayj-1;elsemon = mon+noleapDayj-1;days=days+mo

16、n+day; /总天数return days;int calcuWeek(int totalDays) / 计算星期几int weeknumber;weeknumber=totalDays%7; /天数除7取余为星期 return weeknumber;void outputyear(int nowYear ) / 打印年历int i,monthDay,days,weeknumber,j,k;for(i=0;i<12;i+)days=calcuDays(nowYear,i+1,1); weeknumber=calcuWeek(days); /计算该年一月一日为星期几 if (checkL

17、eapyear(nowYear) monthDay = leapDayi; /如果该年为闰年,采用闰年每月天数elsemonthDay = noleapDayi; /如果该年为平年,采用平年每月天数 printf( "-%4d年%02d月-n",nowYear,i+1 );printf( "%-5s%-5s%-5s%-5s%-5s%-5s%-5sn","天","一","二","三","四","五","六" );for

18、(j=1;j<=monthDay;j+)if(j=1) /如果天数为当月的一号,将其移动到它的星期下并打印for(k=0;k<weeknumber;k+) printf("%-5s"," ");printf("%-5d",j);if(weeknumber%7=6 ) /如果星期数为星期六,换行printf("n");weeknumber=calcuWeek(days+j); /求下一天的星期数printf("n");void outputmenu() / 打印系统菜单 printf(

19、"t万年历查询系统n"); printf("n*"); printf("n0.退出"); printf("n1.查询某年是否是闰年"); printf("n2.打印某年的年历"); printf("n3.查询某年某月某日为该年的那一天及星期几"); printf("n*n"); printf("n请选择:");int checkhefa(int year,int month,int day ) / 输入合法性检查if(year<=

20、0) /如果输入年份小于零,输入的年份不合法 printf("输入年份不合法!n"); return false; if(month<=0|month>12) /如果输入月份小于零或大于12,输入的月份不合法 printf("输入月份不合法!n"); return false; if(day<=0|(day>leapDaymonth-1&&checkLeapyear(year) /如果该年为闰年,输入的天数小于零或大于该年该月所应有的天数,输入的天数不合法printf("输入天数不合法!n");

21、return false;if(day<=0|(day>noleapDaymonth-1&&!checkLeapyear(year)/如果该年为平年,输入的天数小于零或大于该年该月所应有的天数,输入的天数不合法printf("输入天数不合法!n");return false;return true;int calcuday(int year,int month,int day) /计算某年某月某日为该年的第几天int i,totalday=0,mon=0; /mon为月份累积的天数for(i=1;i<month;i+ ) if(checkL

22、eapyear(year)mon=mon+leapDayi-1; /如果该年为闰年,月份累积的天数为其上几个月的天数和elsemon=mon+noleapDayi-1; /如果该年为平年,月份累积的天数为其上几个月的天数和totalday=mon+day;return totalday;void Outputday(int nowYear,int nowMonth,int nowDay) /打印某年某日星期几int totalday,weekNo,days;totalday=calcuday(nowYear,nowMonth,nowDay); /计算某年某月某日为该年的第几天days=calc

23、uDays(nowYear,nowMonth,nowDay); / 计算总天数weekNo=calcuWeek(days); / 计算星期几switch (weekNo)case 0:printf("%-4d年%-2d月%-2d日是星期天,并且是这一年的第%-2d天!",nowYear,nowMonth,nowDay,totalday);break;case 1:printf("%-4d年%-2d月%-2d日是星期一,并且是这一年的第%-2d天!",nowYear,nowMonth,nowDay,totalday);break;case 2:printf

24、("%-4d年%-2d月%-2d日是星期二,并且是这一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 3:printf("%-4d年%-2d月%-2d日是星期三,并且是这一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 4:printf("%-4d年%-2d月%-2d日是星期四,并且是这一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 5:

25、printf("%-4d年%-2d月%-2d日是星期五,并且是这一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 6:printf( "%-4d年%-2d月%-2d日是星期六,并且是这一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;printf("nn");void main() /主函数int year,a,month,day;while(1)outputmenu(); /调用菜单函数 scanf("

26、%d",&a);while(a<0|a>3)printf("选择有误!请重新选择:");scanf("%d",&a);if(a=0) /如果a=0,则退出 printf("退出系统,谢谢使用!nn");break;if(a=1) /如果a=1,则输入年份判断是否为闰年printf("请输入需要查询的年份:");scanf("%d",&year);while(year<=0) /检验年份的合法性printf("输入的年份有误!请重新输入

27、:");scanf("%d",&year);if(checkLeapyear(year)printf("%-4d年是闰年!nn",year);elseprintf("%-4d年是平年!nn",year);if(a=2) /如果a=2,则输入年份并打印该年年历printf("请输入需要查询的年份:");scanf("%d",&year);while(year<=0) printf("输入的年份有误!请重新输入:");scanf("%d&

28、quot;,&year);outputyear(year); /调用Outputyear函数if(a=3) /如果a=3,则输入年月日判断改日为该年的第几天及星期数printf("请输入年月日(格式为YYYY-MM-DD):");scanf("%d-%d-%d",&year,&month,&day);while(!checkhefa(year,month,day) /检验年月日的合法性,如果不合法,就重新输入printf("输入错误!请重新输入年月日(格式为YYYY-MM-DD):n");scanf(&

29、quot;%d-%d-%d",&year,&month,&day);Outputday(year,month,day); /调用Outputday函数6 程序调试与测试1)进入程序后显示主界面,如图6.1。图6.1程序菜单界面显示图2) 理论结果:-2小于0,不合法,应重新输入,2012能被4整除,且不能被100整除,应为闰年。运行结果:进入主菜单后,按数字1,输入年份,判断年份的合法性。如果年份不合法,则重新输入,如果年份合法,显示该年是闰年还是平年,如图6.2。图6.2闰年判断运行结果图3) 理论结果:-4小于0,不合法,应重新输入,2014年是平年,二月应有28天,并且翻阅日历,2014年一月一日为星期三。运行结果:在主菜单界面选择数字2,输入年份,判断年份的合法性。如果输入年份不合法,则重新输入,如果输入年份合法,则打印该年的年历,如图6.3。图6.3 打印年历结果图4)理论结果:2012年二月没有30天,理应重新输入,2012年9月5日查阅日历,其为星期三,并且经计算,它为该年的第249天。运行结果:在主菜单界面选择数字3,输入年月日,判断输入的合法性。年月日中不能有小于等于零的,月份中不能有大于12的,无论平年闰年,每月的天数都不能大于该月应有的天数,如果输入不合法,则重新输入,如果输入合法,则显示该年该月该日为星期几,及该

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论