计算该日为本年中的第几天
需要C++11的支持
源代码
#include <stdexcept>
#include <iostream>
#include <string>
#include <vector>
#include <regex>
using namespace std;
struct Date {
int year;
int month;
int day;
};
bool Leep_Year(const int &date) {
if (date % 400 == 0 || date % 4 == 0 && date % 100 != 0) {
return true;
}
else {
return false;
}
}
void Cal_Day() {
Date date;
smatch m;
string date_str;
regex reg("([[:d:]]{4})([-./])?([01]?[[:d:]])([-./])?([0123]?[[:d:]])");
auto sum = 0;
vector<int> temp = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
cout << "请输入年月日(输入格式示例:2016-10-15或2016.10.15或2016/10/15):" << endl;
while (cin >> date_str) {
try {
if (regex_match(date_str, m, reg) && stoi(m.str(3)) <= 12 && stoi(m.str(5)) <= 31) {
if ((Leep_Year(stoi(m.str(1))) && stoi(m.str(3)) == 2 && stoi(m.str(5)) > 29) ||
(!Leep_Year(stoi(m.str(1))) && stoi(m.str(3)) == 2 && stoi(m.str(5)) > 28)) {
throw runtime_error("格式或日期错误,请重输!");
}
date.year = stoi(m.str(1));
date.month = stoi(m.str(3));
date.day = stoi(m.str(5));
for (auto i = 0; i != date.month - 1; ++i) {
sum += temp[i];
}
if (date.month > 2) {
sum += (date.day + Leep_Year(date.year));
}
else {
sum += date.day;
}
cout << "该日是该年第 " << sum << "天" << endl;
}
else {
throw runtime_error("格式或日期错误,请重输!");
}
}
catch (runtime_error err) {
cerr << err.what() << endl;
}
sum = 0;
}
}
int main() {
Cal_Day();
return 0;
}