日期时间显示程序_廖海洋_第1页
日期时间显示程序_廖海洋_第2页
日期时间显示程序_廖海洋_第3页
日期时间显示程序_廖海洋_第4页
日期时间显示程序_廖海洋_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、信息科学与技术学院程序设计基础课程设计报告题目名称: 日期时间显示程序 学生姓名: 廖海洋 学 号: 2014508010 专业班级: 14计科1班 指导教师: 郭理 2015年 6 月 17 日目录1 课程设计题目与要求31.1设计题目31.2设计要求32 总体设计32.1 总体功能框架32.2 数据结构概要设计43 详细设计43.1数据结构详细设计43.2系统功能详细设计54 运行结果135 课程设计总结165.1 编程中的问题及解决方法165.2 小结165.3 心得体会165.4 程序设计方法16参考文献16附:源代码171 课程设计题目与要求1.1设计题目C+题目11:日期时间显示程

2、序:编一应用程序,输入年、月、日、时、分、秒,在屏幕上模拟显示一电子计时器,不断输出下一秒的时间和日期,以及格林威治的日期和时间。注意,当对日期增加1天后,会涉及所谓的"进位"问题:首先算出本"日"所在的月份具有的天数N,若加1之后的"日"数值超过所在的月份具有的天数N时,"进位"到月,而月份若超过12时还要"进位"到年。1.2设计要求(1)定义一个时间结构体类型time,能提供时、分、秒组成的时间,并提供时间增加的方法(按秒)。(2)定义一个日期结构体类型Date,记录年、月、日,并提供日期增

3、加的方法(按天)。(3)定义个日期时间结构体类型DateTime,除具有年、月、日、时、分、秒外,还增加国名和与格林威治时间的差。思考:可对该类增加你所考虑到的其他功能,如,对日期进行输入,计算二日期的间隔天数,计算某日期为星期几,打印对象当前数据的y年m月的月历,一次增加若干天,对两个日期进行其他比较运算等。2 总体设计2.1 总体功能框架1 时间模块功能:能提供时、分、秒组成的时间,并提供时间增加的方法(按秒)。2 日期化模块功能:记录年、月、日,并提供日期增加的方法(按天)。3 日期时间模块功能:除具有年、月、日、时、分、秒外,还增加国名和与格林威治时间的差4 时间差模块功能:1.计算从

4、出生到现在的年,月,日2.计算两日期间隔天数3.计算某日为星期几 蔡勒(Zeller)公式4. 根据给定的日期,求出它在该年的第几天5 日历模块功能:显示y年m月的日历6. 验证模块 功能:1.验证所有日期格式是否正确 2.验证所有时间格式是否正确7. 杂项:功能:1. 当前系统时间2. 返回一个月的天数3. 判断是否是闰年2.2 数据结构概要设计class date(基类)功能:能提供时、分、秒组成的时间,并提供时间增加的方法(按秒)。class Time (基类) 功能:记录年、月、日,并提供日期增加的方法(按天)。class DateTime:public date,Time(派生类)功

5、能:继承前两个类,并提供全部时间的增加方法图2- 13 详细设计3.1数据结构详细设计class date /定义日期类public:int year; /年int month; /月int day; /日date(int y,int m,int d);date();void add(); /日期增加的方法void showdate();功能: 能提供时、分、秒组成的时间,并提供时间增加的方法(按秒)。class Time /定义时间类public:int hour; /时int minute; /分int second; /秒Time(int h,int m,int s);Time();vo

6、id add();void showTime();功能: 记录年、月、日,并提供日期增加的方法(按天)。class DateTime:public date,Time /日期时间类string country; /国家名int time_differ; /时间差public:DateTime(int h,int mi,int s,int y,int m,int d);DateTime();void add(); /日期增加的方法void showDateTime();功能:继承data,time类,提供所有时间的增加方法(年月日时分秒)3.2系统功能详细设计time 类时间增加函数:add()

7、功能:使时间增加的算法入口参数:无。出口参数:无。图3- 1data类中的成员函数 add()功能:使日期增加的算法入口参数:无。出口参数:无。图3- 2DateTime类 add()功能:使所有函数增加的方法入口参数:无。出口参数:无。图3- 3全局函数int DayInYear(int year, int month, int day) year:年 month:月 day 日;功能:能根据给定的日期,求出它在该年的第几天。入口参数:int year, int month, int day出口参数:day;图3- 4全局函数 int yearDay(int year, int month,

8、 int day,int year1, int month1, int day1)功能:求日期间隔入口参数:int year, int month, int day,int year1, int month1, int day1出口参数:天数。图3- 5全局函数 void calendar(int y,int m)功能:显示日历入口参数:int y,int m y:年 m月出口参数:输出日历图3- 6全局函数 bool pass_date(int y,int m, int d)功能:验证日期格式是否正确入口参数:int y,int m, int d y:年 m:月 d:日。出口参数:0或1图3

9、- 7全局函数 int Month_Day(int year,int month) year:年 month:月功能:返回一个月的天数入口参数:int year,int month出口参数:0或1图3- 84 运行结果图4- 1显示菜单的系统时间图4- 2通过输入的年月日时分秒,显示一个模拟动态时钟,并显示相应格林威治时间.图4- 3通过输入的两个日期,计算两日期间隔天数图4- 4通过输入的日期,计算这一日是星期几图4- 5通过输入的日期,显示这一月的日历图4- 6通过输入的生日,显示从出生到现在的年 月 日 5 课程设计总结 5.1 编程中的问题及解决方法相对于其他同学来说我的题目还是相对简

10、单,不过也遇到了一些问题,就是对一些东西还不太懂,但这终归来说是学习不够,我解决问题最主要的问题是在网上搜,还有就是和同学交流讨论 5.2 小结回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力 5.3 心得体会这次课程设计自我感觉我的题目比

11、较简单,但是我也很用心的在做,相比于上课来说,我认为课程设计能学到更多的知识,在这个过程中,遇到不会的,我会自己查资料,上网,实现一个个的功能,虽然我这道题目并不是很难,但是却学到了很多. 课堂上要讲授许多关于c+语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c+语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。 5.4 程序设计

12、方法1.在这个程序首先我用到了oop面向对象的程序设计思想,2.我用到了基类和派生类的方法来实现模拟时钟的实现3.在实现星期的函数中我还用到的数学方法来计算参考文献 1C+面向对象程序设计教程(第3版). 北京:清华大学出版社 2009.6附:源代码#include<iostream>#include <windows.h>#include<cstdio>#include <time.h> using namespace std;bool IsLeap(int year) /判断是否是闰年return (year%4 = 0)&&

13、 (year%100 != 0) | (year%400 =0);int Month_Day(int year,int month) /返回一个月的天数int day = 0; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)day = 31; else if(month=4|month=6|month=9|month=11)day = 30;else if(month=2)day = 28 + IsLeap(year); return day+1; class Time /定义时间类public:int hour; /

14、时int minute; /分int second; /秒Time(int h,int m,int s);Time();void add();void showTime();Time:Time(int h,int m,int s):hour(h),minute(m),second(s)/采用成员初始化列表对成员赋值void Time:add() /时间增加的方法if(second<60)+second;if(second=60)+minute;second=0;if(minute=60)+hour;minute=0;if(hour=24)hour=0; void Time:showTim

15、e() /输出时间的方法cout<<"tt"<<"tt"<<hour<<"时"<<":"<<minute<<"分"<<":"<<second<<"秒"<<endl<<"tt "<<endl;/cout<<"tt"<<hour<<

16、"时"<<":"<<minute<<"分"<<":"<<second<<"秒"<<endl;class date /定义日期类public:int year; /年int month; /月int day; /日date(int y,int m,int d);date();void add(); /日期增加的方法void showdate();date:date(int y,int m,int d):year(y

17、),month(m),day(d)/采用成员初始化列表对成员赋值void date:add()/日期增加的方法if(day<Month_Day(year,month)day+;if(day=Month_Day(year,month)day = 1;month+;if(month>12)month = 1;year+;void date:showdate() /输出时间的方法cout<<endl<<endl;cout<<"tt "<<endl<<"tt"<<"tt

18、"<<year<<"年"<<":"<<month<<"月"<<":"<<day<<"日"<<endl;class DateTime:public date,Time /日期时间类string country; /国家名int time_differ; /时间差public:DateTime(int h,int mi,int s,int y,int m,int d);DateTim

19、e();void add(); /日期增加的方法void showDateTime();DateTime:DateTime(int y,int m,int d,int h,int mi,int s):date(y,m,d),Time(h,mi,s)void DateTime:add()if(second<0)second=60+second;-minute;if(second<60 && second>=0)+second;if(second=60)+minute;second=0;if(minute<0)minute=60+minute;-hour;i

20、f(minute=60)+hour;minute=0;if(hour<0)hour=24+hour;-day;if(hour=24)hour=0;+day; if(day<=0)day=30+day;-month;if(day=Month_Day(year,month)day = 1;+month;if(month<=0)month=12+month;-year;if(month>12)month = 1;+year;void DateTime:showDateTime()date:showdate();Time:showTime();/DayInYear能根据给定的日

21、期,求出它在该年的第几天int DayInYear(int year, int month, int day) /int _day = 0; int DAY12=31,28,31,30,31,30,31,31,30,31,30,31; if(IsLeap(year) DAY1 = 29; for(int i=0; i<month - 1; +i) day += DAYi; return day;/求日期间隔int yearDay(int year, int month, int day,int year1, int month1, int day1)int sum=0;if(year=y

22、ear1)int d=DayInYear(year,month,day)-DayInYear(year1,month1,day1);if(d<0)d=-d;return d;else if(year>year1)for(int i=year1+1;i<year;i+)/若两日期间隔大于一年,则累加他们之间整年的天数if(IsLeap(i)sum=sum+366;elsesum=sum+365;if(IsLeap(year)return DayInYear(year,month,day)+(366-DayInYear(year1,month1,day1)+sum;elseret

23、urn DayInYear(year,month,day)+(365-DayInYear(year1,month1,day1)+sum;else if(year<year1)for(int i=year+1;i<year1;i+)/若两日期间隔大于一年,则累加他们之间整年的天数if(IsLeap(i)sum=sum+366;elsesum=sum+365;if(IsLeap(year)return DayInYear(year1,month1,day1)+(366-DayInYear(year,month,day)+sum;elsereturn DayInYear(year1,mo

24、nth1,day1)+(365-DayInYear(year,month,day)+sum;void localtime()/当前系统时间time_t t; tm *lt; t = time(NULL); /历史时间清空lt = localtime(&t); cout<<lt->tm_year+1900<<"年"<<lt->tm_mon<<"月"<<lt->tm_yday-150<<"日"<<"星期"<

25、;<lt->tm_wday<<" "<<lt->tm_hour<<":"<<lt->tm_min<<":"<<lt->tm_sec<<endl; void birthday(int y,int m,int d)/从出生到现在的年,月,日 time_t t; tm *lt; t = time(NULL); /历史时间清空lt = localtime(&t); int day=yearDay(y,m,d,lt->

26、tm_year+1900,lt->tm_mon,lt->tm_yday-150);cout<<"从您出生到现在共经历了"<<(lt->tm_year+1900)-y<<"年 "<<"共经历了"<<(lt->tm_year+1900)-y)*12<<"月 "<<"共经历了"<<day<<"天"<<endl;void calendar(i

27、nt y,int m)int cal67;int c=1;int firstday=(1 + 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1;/蔡勒(Zeller)公式 计算y年m月的第一天是星期几int Day=Month_Day(y,m)-1; /计算一个月的天数cout<<" 一 二 三 四 五 六 日 "<<endl;for(int i=0;i<6;i+)for(int n=0;n<7;n+)if(n < firstday && i=0)calin=0;elsecalin=c;c+;

28、c=0;for( i=0;i<6;i+)for(int n=0;n<7;n+)if(calin=0)cout<<" "if(c!=Day&&calin!=0)printf("%3d",calin);c+;cout<<endl;bool pass_date(int y,int m, int d)/日期验证函数if(d>Month_Day(y,m)|m<0)return 0;else if(m<0|m>12)return 0;else if(y<1000|y>9999)r

29、eturn 0;elsereturn 1;bool pass_time(int h,int m, int s)/日期验证函数if(h>23|h<0)return 0;else if(m<0|m>59)return 0;else if(s<0|s>59)return 0;elsereturn 1;int main()while(1)char op;cout<<"当前时间:"localtime();cout<<endl;cout<<endl<<"tt " <<en

30、dl<<"tt a.显示电子计时器和格林威治的日期和时间 " <<endl<<"tt b.计算两日期间隔天数 " <<endl <<"tt c.计算某日期为星期几 " <<endl<<"tt d.打印y年m月的月历 " <<endl<<"tt e.从出生到现在的年,月,日 " <<endl<<"tt "<<endl<<en

31、dl;cout<<"请输入操作"<<endl;cin>>op;if(op='a')/显示电子计时器和格林威治的日期和时间system("cls");int year=0,month=0,day=0,hour=0,minute=0,second=0;cout<<"请输入初始日期:年 月 日 如:2004 2 28"<<endl;cin>>year>>month>>day;cout<<"请输入初始时间:时

32、分 秒 如:23 59 57"<<endl;cin>>hour>>minute>>second;if(pass_time(hour,minute,second)&&pass_date(year,month,day)DateTime clock(year,month,day,hour,minute,second);DateTime clock1(year,month,day,hour-8,minute,second);while(1)cout<<"你输入的时间"<<endl;cl

33、ock.add();clock.showDateTime();cout<<"对应格林威治时间"<<endl;clock1.add();clock1.showDateTime();Sleep(1000);system("cls");else cout<<"时间格式错误"<<endl;system("pause");if(op='b')/计算两日期间隔天数int year1,month1,day1,year,month,day;cout<<"请输入第一个日期 如:2014 1 1"<<endl;cin>>year>>month>>day;cout<<"请输入第二个日期 如:2014 1 1"<<endl;cin>>year1>>month1>>day1;if(pass_da

温馨提示

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

评论

0/150

提交评论