C++小时钟(包含C++类继承, C++ IO, 定时器)

来源:互联网 发布:java正则匹配时间格式 编辑:程序博客网 时间:2024/05/22 16:05
#include <windows.h>#include <winbase.h>   #include <iomanip>#include <iostream>#include <string>using namespace std;#define Event_ID 1024int g_iTime = 1000;//光标定位HANDLE   hStdout;   //光标位置   COORD     cursorPos;void initTimer();void printhelp();void start();class Time{public:Time(int hour1,int minute1,int second1);void print();void adv(int advhour,int advminute,int advsecond);void Increment();void reset(){hour=0;minute=0;second=0;}protected:int hour;int minute;int second;};Time* g_time = 0;class Date{public:Date(int _year, int _month, int _day);void print();void Increment();void reset(){ year = 2012; month = 12; day = 26; }protected:int year;int month;int day;};Date* g_date = 0;class DateTime: public Time, public Date{public:DateTime(int _year, int _month, int _day, int _hour,int _minute,int _second);void Increment();void print();private:string country;int diff;};DateTime* g_DateTime = 0;class DateUtil{public:int NowToDay(int year,int month ,int day);// 从某一天到 1800 年1 月1 日 有多少天 bool InputDayIsTrue( int year , int month , int day );  // 判断输入的日期是否合法int FindDayWeekend( int year , int month ,int day );    //查找某一天是星期几int DisplayMonth( int year , int month );//显示某一年的某一月的日历int DisplayYear( int year );//显示某一年的日历private :int SpaceSize;                      // 输出长度 setw()大小bool IsLeapYear(int year){         // 判断是否是闰年return ( ( 0 == year % 4 && 0 != year %100 ) || ( 0 == year % 400 ) );}public:int GetMonthDayNumber(int year , int month){   //返回 某一年某一月天数int daynumber ;if(   2 == month  ) {  //二月单独处理if( IsLeapYear( year ) )daynumber = 29 ;elsedaynumber = 28 ;}else{if( ( month < 8  && 1 == month % 2) || ( month >= 8 && 0 == month % 2 ) )  //  八月前奇数月为31 天 八月后 偶数为 31 天daynumber = 31 ;if( ( month < 8  && 0 == month % 2) || ( month >= 8 && 1 == month % 2 ) )  //  八月前偶数月 30 天  八月后 奇数月30 天daynumber = 30 ;}return daynumber;}};DateUtil g_dateUtil;class Timer{public:Timer();void CreateTimerThread(int* pi);static DWORD CALLBACK TimeThread(PVOID pvoid);static void CALLBACK TimeProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime);static int count;};Timer* g_timer = 0;int main(){cout<<"请输入年 月 日 时 分 秒"<<endl;int year,month,day;cin >> year >> month >> day ;// g_date = new Date(year, month, day);int hour, minute, second;cin >> hour >> minute >> second ;// g_time = new Time(hour, minute, second);g_DateTime = new DateTime(year, month, day, hour, minute, second);system("cls");// 标准输出句柄   hStdout = GetStdHandle(STD_OUTPUT_HANDLE); initTimer();// g_time->print();// g_date->print();g_DateTime->print();printhelp();int press = 0;while(true){cin>>press;switch(press){case 1:start();break;case 2:case 3://   释放句柄   CloseHandle(hStdout);   exit(0);break;}}return 0;}//////////////////////////////////////////////////////////////////////////////void initTimer(){g_timer = new Timer;}void printhelp(){cout<<endl<<endl;cout<<"\t************************"<<endl;cout<<"\t小        时          钟"<<endl;cout<<"\tPress:                  "<<endl;cout<<"\t    1.start              "<<endl;cout<<"\t    2.pause              "<<endl;cout<<"\t    3.stop               "<<endl;cout<<"\t************************"<<endl;}void start(){int* pi = &g_iTime;g_timer->CreateTimerThread(pi);}//////////////////////////////////////////////////////////////////////////////Time::Time(int hour1,int minute1,int second1){this->hour=hour1;this->second=second1;this->minute=minute1;}void Time::print(){cursorPos.X   =  15;   cursorPos.Y   =   0;  SetConsoleCursorPosition(   hStdout,   cursorPos   );cout<<setfill('0')<<setw(2)<<this->hour<<":";cout<<setfill('0')<<setw(2)<<this->minute<<":";cout<<setfill('0')<<setw(2)<<this->second<<endl;}void Time::adv(int advhour,int advminute,int advsecond){if ((this->second+advsecond)>=60){this->second=this->second+advsecond-60;this->minute++;}else this->second=this->second+advsecond;if (this->minute+advminute>=60){this->minute=this->minute+advminute-60;this->hour++;}else this->minute=this->minute+advminute;this->hour=(this->hour+advhour)%24;}void Time::Increment(){this->adv(0, 0, 1);}int DateUtil :: NowToDay(int year,int month ,int day){int DiDay , i ;for( i = 1800 , DiDay = 0 ; i < year ; i++)  // 闰年 单独+ 366 天if( IsLeapYear( i ) )DiDay += 366 ;elseDiDay += 365 ;for( i = 1 ; i < month ; i++ )DiDay += GetMonthDayNumber( year , i );DiDay += day - 1 ;return DiDay;}bool DateUtil :: InputDayIsTrue( int year , int month , int day ){int TureDayNumber ;if( year < 1800  ||  month > 13 || day > 31 ){    // 如果输入的日期小于 1800 年 大于 13 月 大于31 天 返回 假return false;}else{TureDayNumber = GetMonthDayNumber( year, month ); // 如果输入的day  比该月的实际 day 大 返回错误if( day > TureDayNumber  )return false ;}return true;}int DateUtil ::DisplayMonth(int year,int month ){int  Excur ,  i , TotalDay  ; SpaceSize = 4 ;Excur = ( NowToDay(year,month,1 ) + 3 ) % 7 ;  // 首先计算 这个月的 1 日 是星期几 然后在这个基础上自加天数cout << year << "年 " << month << "月" << endl;cout << setw( SpaceSize ) <<"日" << setw( SpaceSize ) <<"一" << setw( SpaceSize ) <<"二" ;cout << setw( SpaceSize ) <<"三" << setw( SpaceSize ) <<"四" << setw( SpaceSize ) <<"五" ;cout << setw( SpaceSize ) <<"六" << endl;for( i = 1 ; i <= Excur ; i++)cout<< setw( SpaceSize ) << " "  ;    //首先输出 多余的空格TotalDay = GetMonthDayNumber( year , month );for( i = 1 ; i <= TotalDay ; i++){   // 然后自加,当然长度大于七的时候换行cout << setw( SpaceSize ) << i ;if( 0 == ( i + Excur ) % 7 )     //换行条件cout<< endl;} cout << endl ;return 0;}int DateUtil::FindDayWeekend(int year , int month ,int day ){   //查找某一天 是星期几int TotalDay ;char Weekend[ 7 ][ 4 ]={{"日"},{"一"},{"二"},{"三"},{"四"},{"五"},{"六"} } ;TotalDay = NowToDay(year,month,day) ;  cout << year <<"年 "<<month<<"月 "<<day<<"日 是星期" << Weekend[( TotalDay + 3 ) % 7 ]<<endl;return 0;}int DateUtil::DisplayYear ( int year ){int    i , j, k , n , month1 ,month2 ,month3 ;  // 按照 一个季度输出 日历 month1 month2 month3 是 该月应该有天数int  Excur1 , Excur2 , Excur3 ;//  i , j , k 分别表示 三个月的 天数值  Excur1,Excur2,Excur3 表示偏移量int  sea; char Months[12][10]={{"一月"},{"二月"},{"三月"},{"四月"},{"五月"},{"六月"},{"七月"},{"八月"},{"九月"},{"十月"},{"十一月"},{"十二月"}};SpaceSize = 3 ;cout<< year << " 年 " << endl;for( sea = 1 ; sea <= 12 ; sea += 3 ){             // 分四个季度显示Excur1 = ( NowToDay(year,sea   , 1 ) + 3 ) % 7 ;   // 分别计算 3 个月的偏移量Excur2 = ( NowToDay(year,sea+1 , 1 ) + 3 ) % 7 ;Excur3 = ( NowToDay(year,sea+2 , 1 ) + 3 ) % 7 ;month1 = GetMonthDayNumber( year ,sea );         // 分别计算 3个月的 天数month2 = GetMonthDayNumber( year ,sea + 1 );month3 = GetMonthDayNumber( year ,sea + 2 );     //显示三个月的 星期cout << Months[ sea - 1 ] << setw( 21 ) <<" " <<Months[ sea ] << setw( 20 ) <<" " <<Months[ sea + 1 ] << endl;cout << setw( SpaceSize ) <<"日" << setw( SpaceSize ) <<"一" << setw( SpaceSize ) <<"二" ;cout << setw( SpaceSize ) <<"三" << setw( SpaceSize ) <<"四" << setw( SpaceSize ) <<"五" ;cout << setw( SpaceSize ) <<"六" << setw( SpaceSize ) <<" ";cout << setw( SpaceSize ) <<"日" << setw( SpaceSize ) <<"一" << setw( SpaceSize ) <<"二" ;cout << setw( SpaceSize ) <<"三" << setw( SpaceSize ) <<"四" << setw( SpaceSize ) <<"五" ;cout << setw( SpaceSize ) <<"六" << setw( SpaceSize ) <<" ";cout << setw( SpaceSize ) <<"日" << setw( SpaceSize ) <<"一" << setw( SpaceSize ) <<"二" ;cout << setw( SpaceSize ) <<"三" << setw( SpaceSize ) <<"四" << setw( SpaceSize ) <<"五" ;cout << setw( SpaceSize ) <<"六" << endl;for( n = 1 ; n <= Excur1 ; n++)      // 第一行 单独处理  首先输出 多余的空格 然后在输出天数  cout<< setw( SpaceSize ) << " "  ;  // i ,j , k 单独保存当前的日期for( n  ; n <= 7 ; n++)cout<< setw( SpaceSize ) << n - Excur1 ;cout<< setw( SpaceSize ) << " "  ;i =  n - Excur1 ;for( n = 1 ; n <= Excur2 ; n++)cout<< setw( SpaceSize ) << " "  ;for( n  ; n <= 7 ; n++)cout<< setw( SpaceSize ) << n - Excur2 ;cout<< setw( SpaceSize ) << " "  ;j = n - Excur2 ;for( n = 1 ; n <= Excur3 ; n++)cout<< setw( SpaceSize ) << " "  ;for( n  ; n <= 7 ; n++)cout<< setw( SpaceSize ) << n - Excur3 ;cout<< endl ;k = n - Excur3 ;while (  i <= month1 || j <= month2 || k <= month3){  // 当三个月的日期都大于 应有的天数后  循环结束for( n = i  ; i < n + 7; i++)                    // 接下来的 7 天输出一次。但是 大于天数的部分输出空格if( i <= month1 )cout<< setw( SpaceSize )<< i ;elsecout<< setw( SpaceSize )<<" " ;cout<< setw( SpaceSize )<<" " ;for( n = j  ; j < n + 7; j++)if( j <= month2 )cout<< setw( SpaceSize )<< j ;elsecout<< setw( SpaceSize )<<" " ;cout<< setw( SpaceSize )<<" " ;for( n = k  ; k < n + 7; k++)if( k <= month3 )cout<< setw( SpaceSize )<< k ;elsecout<< setw( SpaceSize )<<" " ;cout<< endl; }cout<< endl;}cout << endl;return 0;}Date::Date(int _year, int _month, int _day): year(_year), month(_month), day(_day){}void Date::print(){cursorPos.X   =   0;   cursorPos.Y   =   0;  SetConsoleCursorPosition(   hStdout,   cursorPos   );cout<<setfill('0')<<setw(4)<<this->year<<"年";cout<<setfill('0')<<setw(2)<<this->month<<"月";cout<<setfill('0')<<setw(2)<<this->day<<"日"<<endl;}void Date::Increment(){int max_day = g_dateUtil.GetMonthDayNumber(year, month);if(day == max_day){day = 1;if(month == 12){month = 1;++year;}else{++month;}}else{++day;}}DateTime::DateTime(int _year, int _month, int _day, int _hour,int _minute,int _second):Date(_year, _month, _day), Time(_hour, _minute, _second){country = "Green";diff = 0;}void DateTime::Increment(){if(hour == 23){Time::Increment();if(hour == 0){Date::Increment();}}else{Time::Increment();}}void DateTime::print(){Time::print();Date::print();cursorPos.X   =   0;   cursorPos.Y   =   1;  SetConsoleCursorPosition(   hStdout,   cursorPos   );cout<<"国家名:"<<country<<"\t与格林威治时间的差:"<<diff<<"h"<<endl;}int Timer::count = 0;Timer::Timer(){}void Timer::CreateTimerThread(int* pi){HANDLE hand = CreateThread(NULL,0,Timer::TimeThread,pi,0,NULL);}DWORD CALLBACK Timer::TimeThread(PVOID pvoid){int* pi = (int*)pvoid;int itm = *pi;MSG msg;PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE);UINT timeid = SetTimer(NULL, Event_ID, itm,Timer::TimeProc);BOOL bRet;while ((bRet = GetMessage(&msg,NULL,0,0))!=0){if (bRet == -1){cout<<"Error:the thread will quit,error id is "<<GetLastError()<<endl;break;}else{TranslateMessage(&msg);DispatchMessage(&msg);}}KillTimer(NULL,timeid);cout<<"thread end here"<<endl;return 0;}void CALLBACK Timer::TimeProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime){// g_time->Increment();// g_time->print();// g_date->print();g_DateTime->Increment();g_DateTime->print();}


原创粉丝点击