资源描述
攀枝花学院课程设计(论文)
攀枝花学院
学生课程设计(论文)
题 目: 日历系统设计
学生姓名: 朱鑫平 学 号: 201410801049
所在院(系): 数学与计算机学院
专 业: 计算机科学与技术
班 级: 2014级1班
指 导 教 师: 刘小英 职称: 讲师
2016年 6 月 25 日
攀枝花学院教务处制
2
攀枝花学院本科学生课程设计任务书
题 目
日历系统设计
1、课程设计的目的
1) 使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
2) 使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)
1)输入任一年将显示出该年的所有月份日期,对应的星期
2)注意闰年情况
其显示格式要求如下:
1)份:中文英文都可以,
2)下一行显示星期,从周日到周六,中英文都可以
3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐
当输入2004显示如下:
Input the year:2004
Input the file name:a
The calendar of the year 2004.
Januray 1 February 2
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 1 2 3 4 5 6 7
4 5 6 7 8 9 10 8 9 10 11 12 13 14
11 12 13 14 15 16 17 15 16 17 18 19 20 21
18 19 20 21 22 23 24 22 23 24 25 26 27 28
25 26 27 28 29 30 31 29
=========================== ===========================
March 3 April 4
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17
21 22 23 24 25 26 27 18 19 20 21 22 23 24
28 29 30 31 25 26 27 28 29 30
=========================== ===========================
3、主要参考文献
[1]刘大有等,《数据结构》(C语言版),高等教育出版社
[2]严蔚敏等,《数据结构》(C语言版),清华大学出版社
[3]William Ford,William Topp,《Data Structure with C++》清华大学出版社
[4]苏仕华等,数据结构课程设计,机械工业出版社
4、课程设计工作进度计划
第1天 完成方案设计与程序框图
第2、3天 编写程序代码
第4天 程序调试分析和结果
第5天 课程设计报告和总结
指导教师(签字)
日期
年 月 日
教研室意见:
年 月 日
学生(签字):
接受任务时间: 年 月 日
注:任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表
题目名称
日历系统设计
评分项目
分值
得分
评价内涵
工作
表现
20%
01
学习态度
6
遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
5
能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。
06
设计(实验)能力,方案的设计能力
5
能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。
07
计算及计算机应用能力
5
具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。
08
对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图(或图纸)质量、篇幅、设计(论文)规范化程度
5
符合本专业相关规范或规定要求;规范化符合本文件第五条要求。
10
设计说明书(论文)质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名: 年 月 日
攀枝花学院课程设计(论文) 摘要
摘要
本课程设计采用VC++语言编程软件功能和相关数据结构的知识实现的,采用 Visual C++6.0工具为开发环境,运用了C++中基于面向对象的编程,设计了一个万年历查询系统,能根据用户的选择,显示日历和查询日历,并进行闰年和平年的判断。
关键字:万年历,查询,闰年。平年
II
攀枝花学院课程设计(论文) 目录
攀枝花学院课程设计(论文) 课程设计目的及意义
目 录
摘要 II
1 课程设计目的及意义 1
1.1课程设计目的 1
1.2课程设计意义 1
2 需求分析 2
3 整体设计 3
3.1算法设计 3
3.2程序操作流程图 5
4 详细设计 7
4.1程序块涉及代码 7
4.1.1闰年函数的定义 7
4.1.2星期判断 7
4.1.3月份计算(switch语句实现) 7
4.1.4日期的输出 8
4.2程序详细代码 9
5 程序测试及运行 13
5.1程序结果 13
5.2结果分析 13
6 总结 14
参考文献 15
1 课程设计目的及意义
1.1课程设计目的
数据结构是计算机专业的教学计划中的核心课程之一,数据结构在计算机科学中是一门综合性的专业基础课。“数据结构”的研究不仅涉及到计算机硬件(特别是编码理论,储存装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在储存器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。因此,可以认为“数据结构”是介于数学,计算机硬件和计算机软件三者之间的一门核心课程。在计算机科学中,“数据结构”不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。
本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固《数据结构》课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性
15
攀枝花学院课程设计(论文) 需求分析
1.2课程设计意义
通过数据结构课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础
2 需求分析
现代化社会中,人们的日期和时间观念日益加强;但是目前流行的计算机日历程序,大多是局限于1980年至2099年这一范围,但是很多情况下,特别是在研究领域中,一个时间跨度很大的日历程序是很有参考价值的。本次课程设计是制作一个小巧而精确的万年历,有助于帮助人们对于日程管理的安排。这个万年历系统就是为此而为各类人群而诞生的。
攀枝花学院课程设计(论文) 整体设计
3 整体设计
3.1算法设计
万年历具有以下特点
1).平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
2).每400年整一闰,或每4年且不为百年的一闰。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。但四年加一天又多用了44分56秒,这个数积满400年为三天。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。)
3).每 4年(3个平年+1个闰年)共208周+5天——注意这个“5天”
4).每百年共100*(208周+5天)-1天=5217周+5天——注意这个“5天”(整百年暂设为平年)
5).每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年) 即400年一轮回!(原来万年历400年前是一家)
根据万年历以上特点进行编写
1)首先对万年历年、月、日进行编写,编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要定义一个数组存放天数,用while循环控制。
2)再对其中的星期进行编写:由于公元1月1日设为星期六,故3月1日为星期三,可以用万年3月1日星期算法(特别是那个三)
其公式为:
某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
或某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
其中,闰4百年3月1日星期算法(百年%4=0)
其公式为:
某年3月1日星期几=(年+年/4+月星期表+日+2天)%7
例:
1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四
2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一
2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六
2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六
其中,平4百年3月1日星期算法(百年%4<>0)
其公式为:
某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
例:
1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)
1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)
1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)
1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=
期一(注意:2100年是平年)
2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是闰年)
9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
注:按400年一轮回!(400年前是一家)的说法
1600年,2000年是一样的;
1700年,2100年是一样的;
1800年,2200年是一样的;
1900年,2300年是一样的。
其中万年某日星期算法
其公式为:
某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
通同星期偏差表如下:
闰年
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
天数
31
29
31
30
31
30
31
31
30
31
30
31
星期
3
6
0
3
5
1
3
6
2
4
0
2
平年
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
天数
31
28
31
30
31
30
31
31
30
31
30
31
星期
4
0
0
3
5
1
3
6
2
4
0
2
表2.1星期偏差表
为对以上的万年历星期的算法是正确的对其进行了以下的计算:
⒈对于二十世纪任意日期可以用公式某日星期几=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7=(19%4*5天+年+年/4+平年月星期表+日+2天)%7=(15天+年+年/4+平年月星期表+日+2天)%7以下就是根据上面对其进行的计算:
1900年元旦 1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4
1月表=4(平年) 故 4+4=1 即1900年元旦是星期一
1949年国庆 1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2
10月表=4(平年) 故 4+2=6 即1949年国庆是星期六
1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3
12月表=2(平年) 故 2+3=5 即1999年12月31日是星期五
⒉对于二十一世纪新前年虫算法(20%4*5=0)可以用公式:某日星期几=(百年%4*5天+年+年/4+闰年月星期表+日+2天)%7 =(20%4*5天+年+年/4+闰年月星期表+日+2天)%7以下就是根据上面对其进行的计算:
2000年元旦 1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3
1月表=3(闰年) 故 3+3->6 即2027年元旦是星期六
2018年春节 16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5
2月表=0(平年) 故 0+5=5 即2018年春节是星期五
2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2
12月表=2(平年) 故 2+2=4 即2099年12月31日是星期四
最后,根据日期是紧挨顺序的,可用顺序存储结构存储,对年、月、星期的算法清晰之后,即可用C语言的形式及C++语言的形式编程。
3.2程序操作流程图
如图2.1所示
图3.1程序流程图
攀枝花学院课程设计(论文) 详细设计
4 详细设计
4.1程序块涉及代码
4.1.1闰年函数的定义:
此程序块用于判断输入的年份是否为闰年,然后根据结果转入相应的程序块进行日历的计算,代码如下:
int IsLeapYear( int year )
{
if ((year %4 == 0) && (year % 100 != 0) ||
(year % 400 == 0) )
return 1;
else
return 0;
}
4.1.2星期判断:
次此程序实现对星期的判断,代码如下:
i = Year_days % 7;
printf("Mon Tue Wed Thu Fri Sat Sun\n");
if( i != 0 )
for( temp_i = 0; temp_i < i; temp_i++)
printf(" ");
day = 1;
4.1.3月份计算(switch语句实现)
此部分程序实现根据输入年份计算月份,代码如下:
switch( temp )
{
case 1:
printf("January(%d)\n",year);
break;
case 2:
printf("Febrary(%d)\n",year);
break;
case 3:
printf("March(%d)\n",year);
break;
case 4:
printf("April(%d)\n",year);
break;
case 5:
printf("May(%d)\n",year);
break;
case 6:
printf("June(%d)\n",year);
break;
case 7:
printf("July(%d)\n",year);
break;
case 8:
printf("Augest(%d)\n",year);
break;
case 9:
printf("September(%d)\n",year);
break;
case 10:
printf("October(%d)\n",year);
break;
case 11:
printf("November(%d)\n",year);
break;
case 12:
printf(" December(%d)\n",year);
break;
4.1.4日期的输出(分闰年及平年,用if语句和while循环实现):
if( IsLeapYear(year) && temp == 2)
while( day <= month_day[12] )
{
if( day >1 )
if( Year_days % 7 == 0 )
printf(" \n");
if( day >= 10 )
printf("%3d ",day);
else
printf("%3d ",day);
Year_days++;
day++;
}
else
while (day <= month_day[temp-1])
{
if( day > 1 )
if( Year_days % 7 == 0 )
printf("\n");
if( day >=10 )
printf("%3d ",day);
else
printf("%3d ",day);
Year_days++;
day++;
}
printf("\n");
if( getch() == 'q' )
exit(0);
}
getch();
4.2程序详细代码
#include <stdio.h> //标准输入输出头文件,包含getch()、scanf()、printf()等语句
#include <iomanip.h> //I/O流控制头文件,含有"%d"(dec 置基数为10) 函数
#include<iostream.h> //标准的输入输出流头文件包含scanf()、printf()、cin>> 、cout<<函数
#include<conio.h> //控制台输入输出含有getch()函数
#include<stdlib.h> //包含了的C语言标准库函数如exit()、malloc()、free()
int IsLeapYear(int); //整型 闰年 的定义
void main() //主程序
{
int i;
int day;
int year;
int temp;
int temp_i;
long int Year_days = 0;
int Year_Start = 1; //万年历的起始时间为公元1年
int Per_Year_Days;
int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29};
//定义用于存放每月天数的数组,一三五七八十腊为31天,二月分28天和29天
printf("Please input the year: ");
scanf("%d",&year);
printf("the calender of the year %d\n",year); //输入年份,year用引用类型,年数不同时输出随着改变
while(Year_Start < year)
{
if( IsLeapYear( Year_Start ) ) //闰年为366天
Per_Year_Days = 366;
else
Per_Year_Days = 365; //平年为365天
Year_days = Year_days + Per_Year_Days;
Year_Start++;
}
for( temp = 1; temp <=12; temp++ ) //
{
switch( temp ) //计算temp表达式的值
{
case 1:
printf("January 1\n",year);//一月
break;
case 2:
printf("February 2\n",year);//二月
break;
case 3:
printf("March 3\n",year);//三月
break;
case 4:
printf("April 4\n",year);//四月
break;
case 5:
printf("May 5\n",year);//五月
break;
case 6:
printf("June 6\n",year);//六月
break;
case 7:
printf("July 7\n",year);//七月
break;
case 8:
printf("August 8\n",year);//八月
break;
case 9:
printf("September 9\n",year);//九月
break;
case 10:
printf("October 10\n",year);//十月
break;
case 11:
printf("November 11\n",year);//十一月
break;
case 12:
printf(" December 12\n",year);//十二月
break;
}
i = Year_days % 7; //闰年为366天年数除以7的余数
printf("Mon Tue Wed Thu Fri Sat Sun\n");
if( i != 0 )
for( temp_i = 0; temp_i < i; temp_i++)
printf(" ");
day = 1;
if( IsLeapYear(year) && temp == 2) //***此程序的核心,当为闰年时,二月有29天执行while循环,实现星期的换行
while( day <= month_day[12] )
{
if( day >1 )
if( Year_days % 7 == 0 ) //控制每月第一天的位置,满足余数为0时,另起一行
printf(" \n");
if( day >= 10 )
printf("%3d ",day); //***C语言域宽的设置 %3d表示相邻天数的域宽为3,星期的排列整齐
else
printf("%3d ",day);
Year_days++;
day++;
}
else
while (day <= month_day[temp-1]) //平年的月份
{
if( day > 1 )
if( Year_days % 7 == 0 ) //与闰年时执行条件一样
printf("\n");
if( day >=10 )
printf("%3d ",day);
else
printf("%3d ",day);
Year_days++;
day++;
}
printf("\n");
printf("===========================\n");
if( getch() == 'q' )
exit(0); //满足条件时退出
}
getch(); //不满足条件时执行getch()语句
}
int IsLeapYear( int year ) //闰年的定义
{
if ((year %4 == 0) && (year % 100 != 0) ||
(year % 400 == 0) )
return 1;
else
return 0;
}
攀枝花学院课程设计(论文) 程序测试及运行
5 程序测试及运行
5.1程序结果
该程序运行界面如图5.1所示,输入需要查询的年份。
图5.1 运行界面
例如:2004,敲击回车运行,结果如图5.2所示
图5.2程序运行结果
5.2结果分析
1). 日历的形式为阳历,输出范围为公元1年至公元9999年;
2). 输出结果满足设计要求,可以输出月份,星期,日期且以现在日历的形式输出;
3). 结果能有效区分闰年及平年,每一天的具体天数;
4). 每月前的空格及数字之间的域宽都满足要求;
攀枝花学院课程设计(论文) 总结
6 总结
1).经过一个学期对《数据结构》的学习,我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。通过课程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。通过对万年历的设计进一步的巩固了用c语言和C++编写程序,并且有利于更好的掌握程序设计语言
2).通过本项课程设计也培养了我独立思考、 综合运用所学有关相应知识的能力,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关
3).由于程序设计语言是近年在国内外得到迅速推广应用的一种语言。它功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。通过这次的程序设计更加了解了语言设计的好处和其可用性
4).在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!为以后的工作打下良好的知识基础和技能基础
攀枝花学院课程设计(论文) 参考文献
参考文献
[1].严蔚敏,吴伟民.数据结构【M】.北京:清华大学出版社,2011年
[2].郑莉,董渊,河江舟.C语言程序设计【M】.北京:清华大学出版社,2011年
[3]刘大有等.《数据结构》(C语言版),高等教育出版社
[4]严蔚敏等.《数据结构》(C语言版),清华大学出版社
[5]William Ford,William Topp.《Data Structure with C++》,清华大学出版社
展开阅读全文