四 川 理 工 学 院
计算机学院
C++ 课 程 设 计 报 告
姓名
项 目 组 成 员:
专 业 班 级: 软件工程 08 级 2 班
学号
www.oursuse.cn
328754147
service@oursuse.cn
电脑崽
QQ:
E-mail:
指 导 教 师:
开 始 日 期: 2010 年 1 月 6 日
完 成 日 期: 2010 年 1 月 10 日
二〇一〇年一月
目
录
一、课程设计题目.................................................................................1
二、课程设计目的.................................................................................1
三、需求分析及开发背景.....................................................................1
四、设计原理.........................................................................................1
五、课程设计内容
1. 程序功能描述.............................................................................2
2. 算法实现描述.............................................................................2
六、程序操作界面.................................................................................5
七、流程图.............................................................................................6
八、程序代码.........................................................................................7
九、程序调试........................................................................................23
十、总结................................................................................................28
附: 程序使用说明书及工作列表......................................................29
一、 课程设计题目:
《万年历+记事簿+倒计时》
二、 课程设计目的
在完成《C++程序设计》课程学习后,通过本次教学实习,对所学专
业知识进一步消化、理解并掌握,锻炼和提高综合运用所学知识解决实际
问题的能力,熟悉编译工具的使用方法和环境,协调团队合作力,相互学
习,相互帮助。对 C++中时间函数博大精深有了更深刻的认识,了解自己
有哪些方面的不足之处,以便日后改进。另外,希望通过本次课程设计,
增加对 C++这门课的兴趣,促进学习的积极性,为尽早确定将来选择方向
定下目标。
三、 需求分析及开发背景
目前流行的计算机日历程序,比较典型的是 Windows 各版本中的日历
程序以及基础于该程序所开发的各种应用程序中的日历程序。然而,这些
程序都千篇一律的局限在一个很短的时间范围内。(Windows 各个版本一
般都局限在 1980 年至 2099 年这一范围内),但是,在很多情况下,特别
是在众多的科学研究领域中,一个时间跨度较大的日历程序是很有参考价
值的。C 程序设计语言充分发挥了其自身无与伦比的优越性,用极短的程
序文本填补了这一领域的空白,同时用铁的事实强有力的告诉世人:C 程
序设计语言作为计算机语言家族的新生事物,其发展前景是极为广阔的。
四、 设计原理
面向对象的程序设计是现在最外流行的程序设计方法。面向对象的方
法模仿人们建立现实世界模型的方法,认为客观世界是由各种各样的对象
组成的,每个对象都有各自的内部状态和运动规律,不同对象之间的相互
作用和联系就构成了各种各样的系统。利用人们对事物分类和抽象的自然
倾向,引进了类的概念,具有封装性、继承性和多态性等特点。
在 C++中,类是指由用户定义的一种抽象数据类型,将一组具有相关
性的数据成员结合在一起,要使用类中所包含的数据时,必须通过有该类
所提供的成员函数来存取。
数据封装是指将类中的数据成员以其可被使用或不可被使用的方式
进行分类,即有条件地限制类中部分或全部的数据成员被使用,在定义数
据成员时在其前面冠以 private、protected 或 public,分别表示私有的、
保护的和公有的。因此,类是实现数据封装的一个有力方法,类的特性是
实现了数据封装或数据抽象。
C++的流插入运算符“<<”和流提取运算符“>>”是 C++在类库中提
供的,所有 C++编译系统都在类库中提供输入流类 istream 和输出流类
ostream。Cin 和 Cout 分别是 istream 和 ostream 的对象。在类库中提供
的头文件中已经对“<<和“>>”进行了重载,使之作为流插入运算符和流
提取运算符,能用来输出和输入 C++标准类型的数据。对流插入运算符
“<<”进行重载后,在程序中用“<<”不仅能输出标准类型数据,而且可
以输出用户自己定义的类对象。
五、 课程设计内容
1、程序功能描述
①阳历查询功能:程序开始默认当前系统时间月份的日历表,可单击
按钮逐月前翻、后翻;也可直接输入指定年、月查看;
②农历查询功能:当点击日历中对应阳历日期,可在顶部显示出当前
选择日期的农历信息;
③记事本功能:可在记事栏目中写入文本记事内容,可实现对记事时
间与当前时间的时差计算,显示倒计时,并将记事内容保存在数据库中,
以便随时查看;
④记事查看功能:可在记事显示区域查看数据库中已经存放了的记事
事件,实现翻页功能显示;并提取记事内容中的时间元素,进行时间差判
断,显示倒计时差!
⑤提示功能:对程序可能发生的错误进行相关处理,以弹窗形式反馈
给用户。
2、算法实现描述
【一】阳历相关
① 平年 365 天(52 周+1 天),闰年 366 天(52 周+2 天)。平年 2 月 28
天,闰年 2 月 29 天。由于公元 1 月 1 日设为星期六,故 3 月 1 日为星期
三。——注意这个“三”为使算法达到最简,故本算法以“星期”为计算
单位。且选 3 月 1 日为基月。
② 每 400 年整一闰,或每 4 年且不为百年的一闰。(原因:地球绕太阳一
周的时间是 365 天 5 小时 46 秒,为了使一年的天数为整数,将一年的天
数定为 365 天,余下的时间积累起来,四年就是 23 小时 15 分 4 秒,将近
一天,把这一天加在某年的二月而成 29 天,该年称为闰年,其它年称为
平年。但四年加一天又多用了 44 分 56 秒,这个数积满 400 年为三天。因
此 400 年中只能有 97 个闰年,所以凡能被 400 整除,或不能被 100 整除
但能被 4 整除的年份为闰年。)
③ 每 4 年(3 个平年+1 个闰年)共 208 周+5 天。每百年共 100*(208
周+5 天)-1 天=5217 周+5 天 (整百年暂设为平年), 每 400 年共 4*(5217
周+5 天)+1 天(整 400 年闰)=20871 周+0 天(4 个整百年只有一个闰年)
即 400 年一轮回!(原来万年历 400 年前是一家)
【二】农历相关
① 节气的计算
先给节气进行编号,从近日点开始的第一个节气编为 0,编号如下及
其相应的月份如下:
0 小寒 腊月 6 清明 三月 12 小暑 六月 18 寒露 九月
1 大寒 腊月 7 谷雨 三月 13 大暑 六月 19 霜降 九月
2 立春 正月 8 立夏 四月 14 立秋 七月 20 立冬 十月
3 雨水 正月 9 小满 四月 15 处暑 七月 21 小雪 十月
4 惊蛰 二月 10 芒种 五月 16 白露 八月 22 大雪 冬月
5 春分 二月 11 夏至 五月 17 秋分 八月 23 冬至 冬月
把当天和 1900 年 1 月 0 日(星期日)的差称为积日,那么第 y 年(1900
年算第 0 年)第 x 个节气的积日是
F = 365.242 * y + 6.2 + 15.22 * x - 1.9 * sin(0.262 * x)
这个公式的误差在 0.05 天左右。
② 朔日的计算
从 1900 年开始的第 m 个朔日的公式是
M = 1.6 + 29.5306 * m + 0.4 * sin(1 - 0.45058 * m)
这个公式的误差在 0.2 天左右。
③ 年份的确定
1864 年 1 月 0 日是农历癸亥年,所以用当年减去 1864,用 10 除得的
余数作为年份天干的,用 12 除得的余数作为年份的地支,数字对应的天
干和地支如下。
数字 0 1 2 3 4 5 6 7 8 9 10 11
天干 甲 乙 丙 丁 戊 己 庚 辛 壬 癸
地支 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
当年的 1 月 0 日换算为积日,可以用年份减去 1900 得到的年数被 4
整除,所得商数作为 y(D4),余数作为 y(M4),y(M4)为零的年份是公历
闰年,积日是 D(1) = 1461 * y(D4) - 1
y(M4)不为零的年份是公历平年,积日是
D(1) = 1461 * y(D4) + 365 * y(M4)
④ 月份的确定
计算前一年冬至的积日 F(0),并用 F(0)计算冬至所在的朔月 m 及其
朔日 M(0),就可以推算冬至的农历日期,冬至所在的农历月份总是十一
月。计算下一个中气 F(1)和下一个朔日 M(1),如果 F(1)
是否为定义年,若是,令总天数 S=1,否则,用累加法计算出定义年到输
入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起
来,若该月是闰年中的月份并且该月还大于二月,再使总天数加 1,否则,
不加,既算出从定义年一月一日到输出年的该月一日的总天数。
⑤ 输出月份第一天为星期几的算法:使总天数除以 7 取余加 2 得几既为
星期几,若是 7,则为星期日。
⑥ 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几
后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,
该月中的天数加上该月一日为星期几的数字再除以 7 得 0 换行,即可完整
的输出该月的日历。
六、 程序操作界面
界面(Windows 窗口应用程序):
① 当前时间显示(包含农历显示)
② 逐月查看按钮(向前、向后)
③ 星期列表项
④ 当月日历内容显示
⑤ 指定日期跳转框及按钮
⑥ 记事日期选择列表项
⑦ 记事文本输入框及提交按钮
⑧ 记事显示区及翻页按