刘悦101301092.docx
《刘悦101301092.docx》由会员分享,可在线阅读,更多相关《刘悦101301092.docx(18页珍藏版)》请在冰豆网上搜索。
刘悦101301092
辽宁工业大学
《C++语言程序设计》课程设计(论文)
题目:
日期类的编制
院(系):
软件学院
专业班级:
软件工程103班
学号:
101301092
学生姓名:
安凯辰
指导教师:
武志刚
教师职称:
讲师
起止时间:
2010.12.20-2010.12.31
课程设计(论文)任务及评语
院(系):
软件学院教研室:
软件教研室
学号
101301092
学生姓名
安凯辰
专业班级
103班
课程设计(论文)题目
日期类的编制
课程设计(论文)任务
(1).掌握面向对象程序设计语言C++的基本语法
(2).掌握C++面向对象设计的思想
(3).掌握VC++6.0与DEVC++开发工具的使用
(4).运用标准C++规范设计应用程序
设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。
正确地完成上述内容,规范完整地撰写出设计报告。
指导教师评语及成绩
成绩:
指导教师签字:
年月日
目录
第1章课程设计目的与要求1
1.1课程设计目的1
1.2课程设计的实验环境1
1.3课程设计的预备知识1
1.4课程设计要求1
第2章课程设计内容2
2.1C++语言程序设计------《日期类的编制》问题分析。
2
2.1.1功能分析2
2.1.2算法设计及程序设计中技术重点2
2.2程序中涉及的类的UML类图和主要函数流程图或框图。
5
2.2.1系统UML类图5
2.2.2程序流程图6
2.2.3系统流程图6
2.2.4将指定日期转换为从0年0月0日起的天数7
2.2.5判断指定的年份是否为闰年7
2.3程序源代码8
第3章课程设计总结14
参考文献15
第1章课程设计目的与要求
1.1课程设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序(单步调试,设置断点、观察表达式,分块调试)和修改程序。
1.2课程设计的实验环境
硬件要求能运行Windows操作系统的微机系统。
C++语言应用程序开发软件使用:
VC++系统,或其他C++语言应用程序开发软件。
1.3课程设计的预备知识
熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。
1.4课程设计要求
1.仔细分析设计题目,画出程序流程图,编写程序源代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容
第2章课程设计内容
2.1C++语言程序设计------《日期类的编制》问题分析。
日期类的编制——电子万年历在生活中是经常可一看到的,比如当你使用手中的计算机时,双击屏幕右下方,一个日历就会跳出,上面显示当前年、月下该月的日期与星期的具体关系问题。
当你手中拿着一个文曲星之类电子词典时,首先映入眼帘的也是一个电子日期。
你可以感觉到如果有一个电子日期在手头,那么工作、学习就可以方便一些了,至少用不着为了查看本周的日期分布而到处奔波了。
2.1.1功能分析
测试日期类成员函数,在主函数中列出菜单选项,可以完成日期的加法比较等测试功能。
万年历算星期几
只要随便说出公元几几年几月几日就可以马上算出是星期几。
只要计算出日的代码,月份代码,年份代码。
三个加起来除以七的余数就是星期几。
完善程序功能,在日期相加的菜单选项中增加日期加天数,结果为新日期;日期加月份,结果为新日期,要考虑闰年的情况。
显示日期时增加显示星期及英文形式的月份的功能。
增加输入的甄别功能,即输入非发数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。
编制主函数main()完成函数调用过程。
程序中所涉及C语言内容包括:
C语言编译预处理过程、函数、数组、结构化程序设计等相关内容。
2.1.2算法设计及程序设计中技术重点
计算设计:
日的代码计算:
日的代码最简单,就是它本身,是几号就是几。
月份代码计算:
月份代码也很简单,下面有十二个数:
144725736146,分别代表一至十二月份每个月的代码。
比如,九月份的代码为6。
(据姚江啸介绍,他是用逆推的方法,计算出这12个月份代码的,即知道某年某月某日是星期几,反过来推算月份代码。
)
年份代码计算:
年份代码相对比较复杂,先记住2000年对应的年份代码是4,这是基础代码,牢记即可。
假如大于2000年,比如2010年,则对应的年份代码是(2010-2000)/4=2……2,再用基数代码4减去2倍的商加上余数再加1。
即4-2*2+2+1=3,则2010年对应的年份代码为3。
如果没有余数,即润年,则余数后面的1也不用加。
比如2008年,对应的年份代码为0。
假如小于2000年,比如1991年,则对应的年份代码是(2000-1991)/4=2……1,再用基数代码4加上2倍的商减去余数。
即4+2*2-1=7,则1991年对应的年份代码为7。
再记住1个特殊情况,即润年的3到12月份到最后要加1。
举个例子吧,比如1992年8月27日。
则(2000-1992)/2=2……0,再4+2*2-0=8,年份代码计算结果为8,加上8月份的代码3,再加上日的代码27,因为是润年,所以还要加1,等于39。
再除以七的余数为4,则这一天为星期四。
Setday()函数用于设置日期,setmonth()函数用于设置月份,setyear()函数用于设置年份。
Getday()函数用于输出日期,getmonth()函数用于输出月份,getyear()用于输出年份。
Dateoperator+(intdays)对日期类重载运算符+,日期型数据加上一个整数
Dateoperator-(intdays)对日期类重载运算符-,日期型数据减一个整数
intoperator-(Date&b)对日期类重载运算符-,对应两个日期型数据相减
voiddisp()显示当前日期函数
Date(inty,intm,intd)构造函数对日期进行初始化
dton(Date&d)将指定日期转换为从0年0月0日起的天数
dtow(Date&d)将指定日期转换为星期几
在取系统时间然后在countdays()函数里判断是否为闰年,判断闰年算法为如果年份被400整除或者可被100和4整除的话为闰年。
用month()函数里的switch语句来控制每个月应该拥有的实际天数。
技术重点:
1.类的成员函数描述的是类的行为,例如时钟类的成员函数SetTime()和ShowTime()。
成员函数是程序算法的实现部分,是对封装的数据进行操作的方法。
2.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
一个操作符,其实是一个函数,这种函数的调用语法和普通函数不同。
3.封装就是将抽象得到得数据和行为相结合,形成一个有机地结合,形成“类”,其中的数据和函数都是类得成员。
定义一个类将类中成员函数和数据的实现细节隐藏起来,意味着类的实现细节对于使用该类的编程人员来说是不可见的。
为了实现这一功能,引用私有成员概念,一旦交同,除了在类的成员函数中,在其他任何地方都不能改变私有成员变量的值,也不能引用该成员变量。
意味着编译器强行隐藏了类中数据的实现细节。
4.课题功能描述
给出某年显示该年的年日历。
5.问题详细描述
随意给出某年(如2007年),可以显示该年的年日历(包括每月的天数和所对应的星期几),并且在每月的左上角或右上角打印出相应的年份和月份,要求输出界面尽可能整齐、美观,符合日历显示规范。
6.问题的解决方案:
根据问题的描述,可以按照程序要求的功能采用结构化的设计思想。
1)找到一个基点,例如从公元01年的第一天开始考虑(01年1月1日对应星期判断从01年至该年以前的年份是否闰年,以计算从01年至该年开始的总天数。
2)注意每月的天数不同,并且二月份又有两种情况:
是闰年和不是闰年的情况。
3)为了将每月的日期和星期相对应,用从显示月份开始的总天数除7取余,控制日期和星期几的对应关系。
7.主要技术问题的描述
根据三的分析,主要问题在于:
可以构造一个函数来判断该年是否闰年:
int IsLeapYear( int year );利用一个一维数组month_day[],存放不同月对应的天数;为显示出月份可用switch-case分支结构。
8.创新要求
在基本要求达到后,进行创新设计:
(1)使用多文件,即主函数和各个函数分别存放在不同的.cpp文件中,在头文件中进行函数原型声明;
(2)对程序功能进行拓展,例如,显示前后三年的年日历等。
2.2程序中涉及的类的UML类图和主要函数流程图或框图。
2.2.1系统UML类图
图2.1系统UML类图
2.2.2程序流程图
图2.2程序流程图
2.2.3系统流程图
日期的程序首先用一张高层次的系统流程图描绘系统总体概貌,表明程序的关键功能。
然后分别把每个关键功能扩大扩展到适当的详细程度,这种分层次的描绘方法便于阅读者按从抽象到具体的过程深入地了解一个复杂的系统。
图2.3系统流程图
2.2.4将指定日期转换为从0年0月0日起的天数
图2.4指定日期流程图
2.2.5判断指定的年份是否为闰年
编写一个布尔函数intis_leap_year(intyear),判断参数year是不是闰年。
如果某年份能被4整除,但不能被100整除,那么这一年就是闰年,此外,能被400整除的年份也是闰年。
2.5闰年流程图
2.3程序源代码
程序源代码:
#include
#include
usingnamespacestd;
inti,c,day,year,k,a[50];
voidf1(intx)//大月
{
for(i=0;i<50;i++)
a[i]=33;
for(i=k-1;i>=0;i--)
a[i]='\000';//1号前均为空格
for(i=k;i<31+k;i++)
a[i]=a[i-1]+1;
}
voidf2(intx)//小月
{
for(i=0;i<50;i++)
a[i]=33;
for(i=k-1;i>=0;i--)
a[i]='\000';
for(i=k;i<30+k;i++)
a[i]=a[i-1]+1;
}
voidf3(intx)//闰年二月
{
for(i=0;i<50;i++)
a[i]=33;
for(i=k-1;i>=0;i--)
a[i]='\000';
for(i=k;i<29+k;i++)
a[i]=a[i-1]+1;
}
voidf4(intx)//非闰年二月
{
for(i=0;i<50;i++)
a[i]=33;
for(i=k-1;i>=0;i--)
a[i]='\000';
for(i=k;i<28+k;i++)
a[i]=a[i-1]+1;
}
voidg(inty[],intz)//输出日历表
{
cout<<"日"<<'\t'<<"一"<<'\t'<<"二"<<'\t'<<"三"<<'\t'<<"四"<<'\t'<<"五"<<'\t'<<"六"<for(i=0;i<50;i++)
{
if(a[i]==0)
cout<<(char)a[i]<<'\t';
if(a[i]!
=0&&a[i]!
=33)
cout<else;
if(i%7==0)
cout<}
cout<}
intmain()
{
ints,count=0;
cout<<"请输入年份:
";
cin>>year;
cout<c=year;
for(s=1;s<=year;s++)
if(((s-1)%4==0&&(s-1)%100!
=0)||(s-1)%400==0)
count++;
day=365*c+count;//相差天数
cout<<"*********************"<cout<k=(day%7+6)%7+1;
cout<<"一月"<f1(k);
g(a,50);
if((year%4==0&&year%100!
=0)||year%400==0)//闰年二月
{
k=((day+31)%7+6)%7+1;
cout<<"二月"<f3(k);
g(a,50);
day=day+31+29;
}
else//非闰年二月
{
k=((day+31)%7+6)%7+1;
cout<<"二月"<f4(k);
g(a,50);
day=day+31+28;
}
k=(day%7+6)%7+1;
cout<<"三月"<f1(k);
g(a,50);
k=((day+31)%7+6)%7+1;
cout<<"四月"<f2(k);
g(a,50);
k=((day+31+30)%7+6)%7+1;
cout<<"五月"<f1(k);
g(a,50);
k=((day+31+30+31)%7+6)%7+1;
cout<<"六月"<f2(k);
g(a,50);
k=((day+31+30+31+30)%7+6)%7+1;
cout<<"七月"<f1(k);
g(a,50);
k=((day+31+30+31+30+31)%7+6)%7+1;
cout<<"八月"<f1(k);
g(a,50);
k=((day+31+30+31+30+31+31)%7+6)%7+1;
cout<<"九月"<f2(k);
g(a,50);
k=((day+31+30+31+30+31+31+30)%7+6)%7+1;
cout<<"十月"<f1(k);
g(a,50);
k=((day+31+30+31+30+31+31+30+31)%7+6)%7+1;
cout<<"十一月"<f2(k);
g(a,50);
k=((day+31+30+31+30+31+31+30+31+30)%7+6)%7+1;
cout<<"十二月"<f1(k);
g(a,50);
return0;
}
程序实现如下图:
图2.6运行程序
图2.7输出输入数据并运行程序输出结果
图2.8输出输入数据并运行程序输出结果
第3章课程设计总结
通过这两周的课程设计,使我更加的了解了C++程序设计,掌握了它基本语言及语法知识,把课堂上学到的知识应用到实际的生活中,让我学有所用,通过这次实训,我充分的了解到只有不断地学习汲取新信息,才能获得进步的动力。
我做的题目是日期类的编制程序,在设计的过程中,我遇到了许多问题,可是在老师、同学的帮助之下,这些问题都已解决。
并且还掌握在集成环境下如何调试程序。
在我的努力之下,我顺利的完成的课设,非常感谢学校给我们提供了这么一次实践的机会,让我理论和实践相结合。
学到了许多有用的知识。
编写程序应该养成良好的习惯。
流程图可以使复杂的问题变得明了,可以帮助理清思路。
另外,适当的注释不仅增加了程序的可读性,而且也有助于之后的修改和完善。
有人说:
学的东西越多,不懂的东西也越多。
也许我们以前从来都没认为计算机复杂到什么程度,只要学了就会用。
总而言之,这次的课程设计给了我不少的帮助,增强了我的操作能力。
对问题的解决也有了进一步的提高。
并且,在这两周的实训中,我得到了最好的教育,那就是我们要知道什么去学,当一个确立了远大的目标就不会因为一个小小的挫折而放弃,梦想会支撑着我们前进!
参考文献
[1]于明等.C++程序设计教程.上海:
海洋出版社,2001:
56-78
[2]艾德才.C++程序设计简明教程.北京:
中国水利水电出版社,2000:
24-36
[3]刁成嘉.面向对象C++程序设计.天津:
机械工业出版社,2007:
34-45
[4]刘瑞新.VisualC++面向对象程序设计程.天津:
机械工业出版社,2009:
15-23
[5]陈文宇.C++语言教程.北京:
电子科技大学出版社,2005:
23-34
[6]张凯.C++程序设计.大连:
大连理工大学出版社,2002:
34-55
[7]马建红.C++程序设计与软件技术基础.保定:
中国水利水电出版社,2008:
56-60
[8]钱能.C++程序设计教程.北京:
清华大学出版社,2007:
23-30
[9]吴昭九.C++语言课程设计案例精编.北京:
吴昭九,2003:
102-156
[10]黄迪明.C++语言程序设计基础.北京:
冶金工业出版社,2004:
35-45