前言: 在实现这个小项目中需要用到C++的一些相关知识。例类的相关成员函数,友元,运算符的重载,string,vector的一些操作等。也是对前一段C++基础知识的复习。实现这个小项目也是为了所收获的东西进行实战。在这个小项目实现的过程中也遇到了好几个问题,可能由于春季的温差变化有点大。博主不胜洗礼有点感冒,脑袋有点晕啊,竟然连头文件重复包含了都没有意识到。^_^扯远了。所以不论各路大佬还是成长中的大佬们身体最重要啊。多运动才能有好的意识,来写出高效少BUG的程序。




一、实现准备

       由于用到了C++的一点知识,所有各位看官,有不懂的地方可以看看博主前面总结的C++。相信你看过之后一定能看懂。如果还有问题可以留言评论。

       好了我在实现这个小程序的时候由于之前所做的程序的启发也就是获取系统时间。虽然对时间没太实现什么功能但它也是启发了我。

实现这样一个小项目思路是这样的:

      1. 功能:①:通过输入一个日期来获取与现在时间的间隔天数

                     ②:随时查询距离某个节日到现在还有多少天。

       其实就是一个大功能就是用来知道自己想要的某一天距离现在还有多少天。

       虽然是一个大功能但是实现时却不是那么容易的特别是第二个功能。中间需要对字符串进行解析与匹配。

       2.思路:①:通过实现运算符的重载来实现自定义类型的各种计算,打印。

                     ②:通过对象间的计算来得到想要的天数,其中需注意一些细节比如闰年平年2月的天数是不一样的。类似的细节。

                     ③:通过类的友元来对输入输出运算符进行重载。在输入窗口来获取节日。

                     ④:由于要输入节日字符串,就需要对应的字符串数组来进行匹配。我之所以用vector来存储各种节日是因为它有着数组一样的高效访问元素功能,而且可以动态增长。还可以直接获取它的size大小。

                     ⑤:用输入子串在vector<string> arr中进行匹配,找到对应的子项。然后对子项进行解析来获取对应节日的月份和天数。

                    ⑥:创建一个临时对象空间然后用将2019和刚才析取得月份和日期来构造对象。

                    ⑦:利用运算符的相关操作来获取其天数间隔。

                    ⑧:用一个死循环来模拟实现获取当前时间,以秒计时并且500ms刷新一次。


二、具体代码实现:

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<ctime>
#include<Windows.h>
#include<string>
#include<vector>
//需要匹配的节日
extern vector<string> arr;
//日期类
class DateTime
{
private:
//重载输入输出
friend ostream& operator<<(ostream& _cout, const DateTime& d);
friend istream& operator>>(istream& _cin, DateTime& d);
public:
//1.构造函数DateTime
DateTime(int year = 1900, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0);
//2.获取某一年某一月的天数
int GetDayS(int year, int month);
//3.判断是不是闰年
bool IsLeapYear(int year);
//4.自定义拷贝构造函数
DateTime(const DateTime& d);
//5.计算输入增加一定天数后的日期
DateTime operator+(int dayS);
//6.计算输入减少一定天数后的日期
DateTime operator-(int dayS);
//7.计算两个日期之间的间隔天数
int operator-(const DateTime& d);
//8.判断当前日期是否大于给定日期
bool operator>(const DateTime& d);
//9.自定义析构函数
~DateTime();
private:
int _year;
int _month;
int _day;
int _hour;
int _minute;
int _second;
};
//DateTime的友元
//10.1重载输出
ostream& operator<<(ostream& _cout, const DateTime& d);
//10.2重载输入
istream& operator>>(istream& _cin, DateTime& d);
//11.用日期来查询
void DateQuery(DateTime& d, DateTime& Date);
//12.通过节日查询
void FestivalQuery(DateTime& d, string& str);
//13.通过解析所匹配到的字符串,来取得所在日期,从而计算出间隔天数
void AnalysisStr(DateTime& d, string& str, string ArrChild);
//14.打印通过节日获取的间隔天数
void PrintDayS(string& str, int counts);
//15.获取当前系统时间
void GetDateTime();
#include"DateTime.h"
int main()
{
struct tm *systime;
time_t nowtime;
time(&nowtime);
//拿到当前系统时间
systime = localtime(&nowtime);
DateTime d(systime->tm_year + 1900, systime->tm_mon + 1, systime->tm_mday, systime->tm_hour, systime->tm_min, systime->tm_sec);
cout << "当前时间是:" << endl;
cout << " ";
cout << d << endl;
int i = -2;
cout << endl;
cout << "距离2020年除夕还有:";
DateTime d10(2020, 1, 24);
cout << d10 - d << "天" << endl;
cout << endl;
while (i != -1)
{
DateTime Date;
cout << "请选择查询方式" << endl;
cout << " 0.直接输入日期查询: 1.直接输入节日查询: " << endl;
cout << "-1.退出查询!!!" << endl;
cout << endl;
cin >> i;
if (i == 0)
{
//11.用日期来查询
DateQuery(d, Date);
}
else if (i == 1)
{
string str;
//12.通过节日查询
FestivalQuery(d, str);
}
}
//15.获取当前系统时间
GetDateTime();
system("pause");
return 0;
}


由于函数体实现的代码太长,这里就以实现思路以及示范效果为主。OK,看看

三、运行结果显示:



初夏小谈:速查节日倒计时(小项目)_运算符

先实例:直接输入日期查询(即输入0):

示例输入:2019 11 11

初夏小谈:速查节日倒计时(小项目)_c++_02

就会看到距离现在还有227天。

接下来示范输入节日操作:我输入:中秋节

初夏小谈:速查节日倒计时(小项目)_运算符_03

可以看到距离中秋节还有168天,既然可以不输入节字,那继续用中秋节来查询:输入:中秋

初夏小谈:速查节日倒计时(小项目)_#include_04

和输入中秋节是一样的时间。再来看看最后一个功能动态显示当前时间:

初夏小谈:速查节日倒计时(小项目)_c++_05



细心地看官们发现了什么吗?时间过去了大约6分钟。而且它和当前时间显示一样包括秒数,注意它是动态刷新的。和我们的手表一样。

当然在这里我还没有针对时间进行相应功能的实现。后序我会继续完善这个小项目使它具有更多实际有用的功能。

想要源码的看官下方留言。