当前位置:文档之家› 日期时间显示程序_廖海洋

日期时间显示程序_廖海洋

信息科学与技术学院程序设计基础课程设计报告题目名称:日期时间显示程序学生姓名:***学号: **********专业班级: 14计科1班指导教师:**2015年 6 月 17 日目录1 课程设计题目与要求 (3)1.1设计题目 (3)1.2设计要求 (3)2 总体设计 (4)2.1 总体功能框架 (4)2.2 数据结构概要设计 (5)3 详细设计 (6)3.1数据结构详细设计 (6)3.2系统功能详细设计 (8)4 运行结果 (16)5 课程设计总结 (19)5.1 编程中的问题及解决方法 (19)5.2 小结 (19)5.3 心得体会 (19)5.4 程序设计方法 (20)参考文献 (20)附:源代码 (21)1 课程设计题目与要求1.1设计题目C++题目11:日期时间显示程序:编一应用程序,输入年、月、日、时、分、秒,在屏幕上模拟显示一电子计时器,不断输出下一秒的时间和日期,以及格林威治的日期和时间。

注意,当对日期增加1天后,会涉及所谓的"进位"问题:首先算出本"日"所在的月份具有的天数N,若加1之后的"日"数值超过所在的月份具有的天数N时,"进位"到月,而月份若超过12时还要"进位"到年。

1.2设计要求(1)定义一个时间结构体类型time,能提供时、分、秒组成的时间,并提供时间增加的方法(按秒)。

(2)定义一个日期结构体类型Date,记录年、月、日,并提供日期增加的方法(按天)。

(3)定义个日期时间结构体类型DateTime,除具有年、月、日、时、分、秒外,还增加国名和与格林威治时间的差。

思考:可对该类增加你所考虑到的其他功能,如,对日期进行输入,计算二日期的间隔天数,计算某日期为星期几,打印对象当前数据的y年m月的月历,一次增加若干天,对两个日期进行其他比较运算等。

2 总体设计2.1 总体功能框架1.时间模块功能:能提供时、分、秒组成的时间,并提供时间增加的方法(按秒)。

2.日期化模块功能:记录年、月、日,并提供日期增加的方法(按天)。

3.日期时间模块功能:除具有年、月、日、时、分、秒外,还增加国名和与格林威治时间的差4.时间差模块功能:1.计算从出生到现在的年,月,日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(派生类)功能:继承前两个类,并提供全部时间的增加方法图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(){};void 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()功能:使时间增加的算法入口参数:无。

出口参数:无。

图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, 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- 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 编程中的问题及解决方法相对于其他同学来说我的题目还是相对简单,不过也遇到了一些问题,就是对一些东西还不太懂,但这终归来说是学习不够,我解决问题最主要的问题是在网上搜,还有就是和同学交流讨论5.2 小结回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力5.3 心得体会这次课程设计自我感觉我的题目比较简单,但是我也很用心的在做,相比于上课来说,我认为课程设计能学到更多的知识,在这个过程中,遇到不会的,我会自己查资料,上网,实现一个个的功能,虽然我这道题目并不是很难,但是却学到了很多.课堂上要讲授许多关于c++语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。

然而要使用c++语言这个工具解决实际问题,又必须掌握它。

通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。

对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。

5.4 程序设计方法1.在这个程序首先我用到了oop面向对象的程序设计思想,2.我用到了基类和派生类的方法来实现模拟时钟的实现3.在实现星期的函数中我还用到的数学方法来计算参考文献[1]C++面向对象程序设计教程(第3版). 北京:清华大学出版社 2009.6附:源代码#include<iostream>#include <windows.h>#include<cstdio>#include <time.h>using namespace std;bool IsLeap(int year) //判断是否是闰年{return (year%4 == 0)&& (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||m onth==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; //时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::showTime() //输出时间的方法{cout<<"\t\t※"<<"\t\t"<<hour<<"时"<<":"<<minute<<"分"<<":"<<second<<"秒"<<endl<<"\t\t※※※※※※※※※※※※※※※※"<<endl;// cout<<"\t\t"<<hour<<"时"<<":"<<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),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<<"\t\t※※※※※※※※※※※※※※※※"<<endl<<"\t\t※"<<"\t\t"<<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);~DateTime(){};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;}if(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能根据给定的日期,求出它在该年的第几天int DayInYear(int year, int month, int day){//int _day = 0;int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(IsLeap(year))DAY[1] = 29;for(int i=0; i<month - 1; ++i){day += DAY[i];}return day;}//求日期间隔int yearDay(int year, int month, int day,int year1, int month1, int day1) {int sum=0;if(year==year1){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))returnDayInYear(year,month,day)+(366-DayInYear(year1,month1,day1))+sum;elsereturnDayInYear(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))returnDayInYear(year1,month1,day1)+(366-DayInYear(year,month,day))+sum;elsereturnDayInYear(year1,month1,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<<"日"<<"星期"<<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);intday=yearDay(y,m,d,lt->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(int y,int m){int cal[6][7];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)cal[i][n]=0;else{cal[i][n]=c;c++;}}}c=0;for( i=0;i<6;i++){for(int n=0;n<7;n++){if(cal[i][n]==0){cout<<" ";}if(c!=Day&&cal[i][n]!=0){printf("%3d",cal[i][n]);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)return 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<<"\t\t※※※※※※※※※※※※※※※※" <<endl<<"\t\t※ a.显示电子计时器和格林威治的日期和时间※" <<endl<<"\t\t※ b.计算两日期间隔天数※" <<endl<<"\t\t※ c.计算某日期为星期几※" <<endl<<"\t\t※ d.打印y年m月的月历※" <<endl<<"\t\t※ e.从出生到现在的年,月,日※" <<endl<<"\t\t※※※※※※※※※※※※※※※※"<<endl<<endl;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<<"请输入初始时间:时分秒如: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;clock.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_date(year,month,day)&&pass_date(year1,month1,day1)) {cout<<"两日期间隔天数"<<endl;cout<<yearDay(year,month,day,year1,month1,day1)<<"天"<<endl;}else cout<<"时间格式错误"<<endl;system("pause");}if(op=='c')//计算某日期为星期几{int y,m,d;cout<<"年月日如: 2008 12 1"<<endl;cin>>y>>m>>d;if(pass_date(y,m,d)){cout<<y<<"年"<<m<<"月"<<d<<"日是星期";cout<<(d + 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1<<endl;//蔡勒(Zeller)公式}else cout<<"时间格式错误"<<endl;system("pause");}if(op=='d'){int y,m;cout<<"请输入年月如 2015 6"<<endl;cin>>y>>m;if(pass_date(y,m,10))calendar(y,m);else cout<<"时间格式错误"<<endl;system("pause");if(op=='e'){int y,m,d;cout<<"请输入您的生日如:1996 3 20"<<endl;cin>>y>>m>>d;if(pass_date(y,m,d))birthday(y,m,d);else cout<<"时间格式错误"<<endl;system("pause");}system("cls");}return 0;}。

相关主题