




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录一、课程设计题目.1二、课程设计目的.1三、需求分析及开发背景.1四、设计原理.1五、课程设计内容1. 程序功能描述.22. 算法实现描述.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)m(1),那么该月就是上一个月的闰月,并把这个中气作为f(2),以后的中气、朔日和农历月份也这样确定。【三】算法及公式推导 某平年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7 某闰年3月1日星期几=(年+年/4+月星期表+日+2天)%7 某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数s=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。六、 程序操作界面界面(windows 窗口应用程序): 当前时间显示(包含农历显示) 逐月查看按钮(向前、向后) 星期列表项 当月日历内容显示 指定日期跳转框及按钮 记事日期选择列表项 记事文本输入框及提交按钮 记事显示区及翻页按 获得各按钮命令返回参数 对文本中时间的读取转换 重置curyear、curmonth、curday 农历转换实现 刷新并显示label内容 写入数据到库时间传递获取文件数据用户界面操作项显示记事栏数据库data.txt日历栏添加记事栏时间选择/输入框刷新显示指定日期按钮记事提交按钮记事显示翻页按钮逐月查看按钮交互面执行命令执行命令即时刷新提交命令七、 流程图八、程序代码/*/stdafx.h 主要头文件/*/ stdafx.h : 标准系统包含文件的包含文件,/ 或是经常使用但不常更改的/ 特定于项目的包含文件#pragma once#include#include#include#include#include#include #include#include#include #include#using #using #using #using #define leapyear(y) (y%4=0)&(y%100!=0)|(y%400=0)using namespace std;struct solarlunarint solaryear; /阳历年int solarmonth; /阳历月int solarday; /阳历日int lunaryear; /阴历年int lunarmonth; /阴历月int lunarday; /阴历日int lunarleapmonth; /阴历闰月标志,1表示此月为闰月,0表示非闰月char holiday9; /节日信息;int djs(int curyear,int curmonth,int curday,int curhour,int curmin); /倒计时统计int getdays(int year, int month);/计算当前月份天数int getweek(int year, int month, int day);/分析当前月份第一天是星期几int getsec(system:string s); /转换txt字符为日期并让djs()处理返回秒void solartolunar(solarlunar* p); /阳历转换成农历void getholiday(solarlunar* p); /获得节日信息int getdaynumber(int year, int month, int day); /判断阳历某一天是该年的第几天int gettotaldaynumber(int year, int month, int day); /求从阳历1900年1月31日(阴历1900年1月1日)到某年某月某日(阳历)共多少天int lunaryeardays(int y) ;int isleapyear(int year) ;int lunarleapdays(int y) ;int lunarmonthdays(int y,int m) ;int lunarleapmonth(int y) ;/*/djs.cpp 计算时间差的函数/*#includestdafx.h int djs( int curyear,int curmonth,int curday,int curhour,int curmin) time_t t;t=time(null);struct tm t1, t2, *ptr;ptr=localtime(&t);memset(&t1, 0x00, sizeof(t1); memset(&t2, 0x00, sizeof(t2); int stryear=curyear; int strmon=curmonth; int strday=curday; int strhour=curhour; int strmin=curmin; int strsec=0; t1.tm_year = stryear - 1900; t1.tm_mon = strmon - 1; t1.tm_mday = strday; t1.tm_hour = strhour; t1.tm_min = strmin; t1.tm_sec = strsec; t2.tm_year = ptr-tm_year; t2.tm_mon = ptr-tm_mon; t2.tm_mday = ptr-tm_mday; t2.tm_hour = ptr-tm_hour; t2.tm_min = ptr-tm_min; t2.tm_sec = ptr-tm_sec; time_t start = mktime(&t1); time_t end = mktime(&t2); time_t retsec = start - end ; time_t retmin = retsec/60; /time_t rethour = retmin/60; /time_t retday = rethour/24; return (int)retsec; /*/getweek.cpp /*#include stdafx.hint getweek(int year, int month, int day) if(month=1|month=2) month+=12; -year; return (day+1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;/*/getday.cpp /*#include stdafx.hint getdays(int year, int month) int days=31,28,31,30,31,30,31,31,30,31,30,31; if(leapyear(year)&month=2) return 29; else return daysmonth-1;/*/getsec.cpp 计算时间差的函数/*#includestdafx.h/将从txt得到的字符时间转换成整型数 时间差得到秒int getsec(system:string s)struct tm t1; memset(&t1, 0x00, sizeof(t1); system:string stryear,strmon,strday,strhour,strmin; system:string str1(s); /2010-01-01 01:01stryear = str1-substring(0, 4); strmon = str1-substring(5, 2); strday = str1-substring(8, 2); strhour = str1-substring(11, 2); strmin = str1-substring(14, 2); t1.tm_year = (stryear0-48)*1000+(stryear1-48)*100+(stryear2-48)*10+(stryear3-48) - 1900;t1.tm_mon = (strmon0-48)*10+(strmon1-48) - 1;t1.tm_mday = (strday0-48)*10+(strday1-48);t1.tm_hour = (strhour0-48)*10+(strhour1-48);t1.tm_min = (strmin0-48)*10+(strmin1-48);t1.tm_sec = 0; time_t t;t=time(null);struct tm t2, *ptr;ptr=localtime(&t); memset(&t2, 0x00, sizeof(t2); t2.tm_year = ptr-tm_year; t2.tm_mon = ptr-tm_mon; t2.tm_mday = ptr-tm_mday; t2.tm_hour = ptr-tm_hour; t2.tm_min = ptr-tm_min; t2.tm_sec = ptr-tm_sec; time_t start = mktime(&t1); time_t end = mktime(&t2); time_t retsec = start - end ; return (int)retsec;/getsec结束/*/ solartolunar.cpp 阳历到农历的转换/*#includestdafx.h/阳历到阴历的转换void solartolunar(solarlunar* p)p-lunarleapmonth=0; /初始设置当前月不是阴历闰月int number=gettotaldaynumber(p-solaryear, p-solarmonth, p-solarday);int i;for(i=1900; i0; i+)number=number-lunaryeardays(i);if(numberlunaryear=i; /获得阴历年int a=lunarleapmonth(i); /获得阴历年的闰月int flag=0; /减掉闰月的标志int j;for(j=1; j0; j+) /应考虑阴历闰月的情况number=number - lunarmonthdays(i,j);if(j=a & number0)number=number-lunarleapdays(i); /减掉闰月天数flag=1;if(numberlunarleapmonth=1; /设置当前月是阴历闰月的标记else number=number+lunarmonthdays(i,j-1);j-;p-lunarmonth=j; /获得阴历月p-lunarday=number; /获得阴历日/*/ holiday.cpp 节日判断(由于调试问题本程序最终应用的时候并没有添加此功能)/*#includestdafx.h/获得节日信息void getholiday(solarlunar* p)strcpy(p-holiday,); /初始化int number;number=p-lunarmonth*100 + p-lunarday; /阴历节日switch(number) case 115: strcpy(p-holiday, 元宵); break; case 505: strcpy(p-holiday, 端午); break; case 707: strcpy(p-holiday, 中元); break; case 815: strcpy(p-holiday, 中秋); break; case 1208: strcpy(p-holiday, 腊八); break; int lunarinfo= 0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2, 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977, 0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970, 0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950, 0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557, 0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0, 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0, 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6, 0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570, 0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0, 0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5, 0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930, 0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530, 0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45, 0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0 ;/判断闰年int isleapyear(int year) if(year%4=0 & year%100 !=0)|(year%400=0) return 1;else return 0;/获取农历 y年的总天数int lunaryeardays(int y) int i, sum=348; for(i=0x8000; i0x8; i=1) sum += (lunarinfoy-1900 & i)? 1: 0; return(sum+lunarleapdays(y);/获取农历 y年闰月的天数int lunarleapdays(int y) if(lunarleapmonth(y) return(lunarinfoy-1900 & 0x10000)? 30: 29); else return(0);/获取农历 y年闰哪个月 1-12 , 没闰传回 0int lunarleapmonth(int y) return(lunarinfoy-1900 & 0xf);/获取农历 y年m月的总天数int lunarmonthdays(int y,int m) return( (lunarinfoy-1900 & (0x10000m)? 30: 29);/*/ getdaynumber.cpp /*#includestdafx.hint getdaynumber(int year, int month, int day)int monthdays12=0,31,28,31,30,31,30,31,31,30,31,30;int number=0;for(int i=0;i2) /该月不是1,2月份,这时需要考虑闰年 number=number+isleapyear(year);return number+day;/*/ gettotaldaynumber.cpp /*#includestdafx.h/求从阳历1900年1月31日(阴历1900年1月1日)到某年某月某日(阳历)共多少天int gettotaldaynumber(int year, int month, int day)int number=0;for(int i=1900;itext = 公元+curyear+年+curmonth+月+curday+日 + 星期+weekday(weekone+curday-1)%7+n +tiangan(date.lunaryear-1864)%60%10+dizhi(date.lunaryear-1864)%60%12+年 +shengxiao(date.lunaryear-1864)%60%12+ +十二月 +chinesenumberdate.lunarday*2+chinesenumberdate.lunarday*2+1; else if(chinesemonthdate.lunarmonth=l十&chinesemonthdate.lunarmonth+1=l一) nowtime-text = 公元+curyear+年+curmonth+月+curday+日 + 星期+weekday(weekone+curday-1)%7+n +tiangan(date.lunaryear-1864)%60%10+dizhi(date.lunaryear-1864)%60%12+年 +shengxiao(date.lunaryear-1864)%60%12+ +十一月 +chinesenumberdate.lunarday*2+chinesenumberdate.lunarday*2+1; else nowtime-text = 公元+curyear+年+curmonth+月+curday+日 + 星期+weekday(weekone+curday-1)%7+n +tiangan(date.lunaryear-1864)%60%10+dizhi(date.lunaryear-1864)%60%12+年 +shengxiao(date.lunaryear-1864)%60%12+ +chinesemonthdate.lunarmonth+月 +chinesenumberdate.lunarday*2+chinesenumberdate.lunarday*2+1; /*/setcolor.h 改变背景颜色的部分包含代码 /*/.省略.label3-backcolor:set(color:black);label4-backcolor:set(color:black);label5-backcolor:set(color:black);label6-back
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年自然地理专项模拟试卷及答案-地理信息系统在灾害监测中的应用试题
- 2025年初中学业水平考试地理模拟卷及答案(乡土地理特色)实战演练详解
- 医疗大数据处理过程中的隐私保护技术探讨
- 医疗信息安全管理大数据时代的挑战与对策
- 2015年淄博中考地理试题及答案
- 2025年入团教育的必要性及试题答案
- 深度总结中级会计试题与答案
- 会计教育与培训的数字化转型方向探讨
- 医疗信息化建设与互联网医疗的结合
- 中级会计考试系统化学习的试题与答案
- 小型搅拌机的设计说明书-毕业论文
- 职校招生宣传PPT
- 三星SHP-DP728指纹锁说明书
- GB/T 24218.1-2009纺织品非织造布试验方法第1部分:单位面积质量的测定
- GB/T 11032-2020交流无间隙金属氧化物避雷器
- 液化石油气安全标签
- T-CEEMA 004-2022 煤电机组辅机及系统节能、供热和灵活性改造技术导则
- 水车租赁合同范本(3篇)
- 空港新城特勤消防站施工组织设计
- 餐具消毒记录表
- 2022山东历史高考答题卡word版
评论
0/150
提交评论