利用一个类,将时钟封装起来,只将运行接口暴露在外,从而达到数据的封装。
思路:
(1)在类中的构造函数中,利用时间函数获取目前的时间
(2)在运行函数中,需要一个显示函数与一个更新数据的时间的函数
(3)在更新数据的函数中,需要一个清屏函数,从而使得显示不会占满屏幕。
(4)在数据更新函数中,每一次判断是否到达临界状态。
具体实现如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include<time.h>
#include<iomanip>
#include<windows.h>
//#include<unistd.h>
class Clock
{
public:
//构造函数
Clock()
{
time_t t = time(NULL);
struct tm ti1 = *localtime(&t);
//struct tm * gmtime(const time_t *timer);
struct tm ti2 = *localtime(&t);
year = ti2.tm_year+1900;
month = ti1.tm_mon + 1;
day2 = ti1.tm_mday;
day1 = ti1.tm_wday;
hor = ti1.tm_hour;
min = ti1.tm_min;
sec = ti1.tm_sec;
}
void run()
{
while (1)
{
//显示函数
show();
//数据更新函数
review();
}
}
private:
void show()
{
system("cls");//清屏函数
cout << "星期" << setw(1) << day1 << " ";
cout << setw(4) << year << "-";
cout << setw(2) << month << "-";
cout << setw(2) << day2 << " ";
cout << setw(2) << hor << ":";
cout << setw(2) << min << ":";
cout << setw(2) << sec << " ";
/*time_t lt;
lt = time(NULL);
printf(ctime(<));*/
}
void review()
{
Sleep(1000);
if (++sec == 60)
{
sec = 0;
min += 1;
if (min == 60)
{
min = 0;
hor += 1;
if (hor == 24)
{
hor = 0;
day1 += 1;
day2 += 1;
if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
{
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
if (day2 == 31||day1 == 7)
{
day1 = 1;
day2 = 1;
month += 1;
if (month == 12)
{
month = 1;
year += 1;
}
}
}
else if (month == 2)
{
if (day2 == 29 || day1 == 7)
{
day1 = 1;
day2 = 1;
month += 1;
if (month == 12)
{
month = 1;
year += 1;
}
}
}
else//不是上面两种情况
{
if (day2 == 30 || day1 == 7)
{
day1 = 1;
day2 = 1;
month += 1;
if (month == 12)
{
month = 1;
year += 1;
}
}
}
}
else//不是闰年
{
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
if (day2 == 31 || day1 == 7)
{
day1 = 1;
day2 = 1;
month += 1;
if (month == 12)
{
month = 1;
year += 1;
}
}
}
else if (month == 2)
{
if (day2 == 28 || day1 == 7)
{
day1 = 1;
day2 = 1;
month += 1;
if (month == 12)
{
month = 1;
year += 1;
}
}
}
else//不是上面两种情况
{
if (day2 == 30 || day1 == 7)
{
day1 = 1;
day2 = 1;
month += 1;
if (month == 12)
{
month = 1;
year += 1;
}
}
}
}
}
}
}
}
private:
int year;
int month;
int day1;//表示显示星期
int day2;//表示显示月
int hor;//时
int min;//分
int sec;//秒
};
int main()
{
Clock c;
c.run();
system("pause");
return 0;
}
在这个实现中,如果可以将每一个分支封装在函数中,或许会更加有利于可读性,对于这一点,在以后的优化中,会依次提到。