Написал функцию для сравнения двух дат в формате string между собой.Исходил из такой логики: сперва сравниваем год, если он меньше или равно(<=), или больше или равно(>=) тогда сравниваем месяц, если он меньше или равен(<=), или больше или равен(>=) тогда сравниваем дни по такой же схеме. Оно вроде бы считает хорошо, но в одном моменте получается неккоректно. Я долго сидел над этой функцией и сейчас просто не могу увидеть ошибку где она работает неккоректно.
struct Compare
{
public:
static bool compareDate(string date1, string date2, string _operator)
{
if (_operator == ">")
{
return compareBig(date1.substr(6, 4), date2.substr(6, 4));
}
else if (_operator == ">=")
{
if (compareBigEquals(date1.substr(6, 4), date2.substr(6, 4)))
{
if (compareBigEquals(date1.substr(3, 2), date2.substr(3, 2)))
{
if (compareBigEquals(date1.substr(0, 2), date2.substr(0, 2)))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
else if (_operator == "<=")
{
if (compareLessEquals(date1.substr(6, 4), date2.substr(6, 4)))
{
if (compareLessEquals(date1.substr(3, 2), date2.substr(3, 2)))
{
if (compareLessEquals(date1.substr(0, 2), date2.substr(0, 2)))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
else if (_operator == "<")
{
return compareLess(date1.substr(6, 4), date2.substr(6, 4));
}
}
private:
static bool compareBigEquals(string date1, string date2)
{
if ((stoi(date1) > stoi(date2)) || (stoi(date1) == stoi(date2)))
{
return true;
}
else
{
return false;
}
}
static bool compareLessEquals(string date1, string date2)
{
if ((stoi(date1) < stoi(date2)) || (stoi(date1) == stoi(date2)))
{
return true;
}
else
{
return false;
}
}
static bool compareBig(string date1, string date2)
{
if ((stoi(date1) > stoi(date2)))
{
return true;
}
else
{
return false;
}
}
static bool compareLess(string date1, string date2)
{
if ((stoi(date1) < stoi(date2)))
{
return true;
}
else
{
return false;
}
}
};
int main()
{
string date1 = "01.01.1999";
string date2 = "20.07.2000";
string date3 = "13.03.2001";
cout << date1 << ">" << date2 << "=" << Compare::compareDate(date1, date2, ">") << endl;
cout << date1 << "<" << date2 << "=" << Compare::compareDate(date1, date2, "<") << endl;
cout << date1 << ">=" << date2 << "=" << Compare::compareDate(date1, date2, ">=") << endl;
cout << date1 << "<=" << date2 << "=" << Compare::compareDate(date1, date2, "<=") << endl;
cout << date2 << ">" << date3 << "=" << Compare::compareDate(date2, date3, ">") << endl;
cout << date2 << "<" << date3 << "=" << Compare::compareDate(date2, date3, "<") << endl;
cout << date2 << ">=" << date3 << "=" << Compare::compareDate(date2, date3, ">=") << endl;
cout << date2 << "<=" << date3 << "=" << Compare::compareDate(date2, date3, "<=") << endl;
cout << date3 << ">" << date1 << "=" << Compare::compareDate(date3, date1, ">") << endl;
cout << date3 << "<" << date1 << "=" << Compare::compareDate(date3, date1, "<") << endl;
cout << date3 << ">=" << date1 << "=" << Compare::compareDate(date3, date1, ">=") << endl;
cout << date3 << "<=" << date1 << "=" << Compare::compareDate(date3, date1, "<=") << endl;
system("pause");
}
Посмотрим на скриншот вывода. Вроде все работает хорошо, но в выводе не нравится выделенная строка.
В данном случае мы сравниваем даты 20.07.2000 и 13.03.2001. В функции static bool compareLessEquals(string date1, string date2)
{
if ((stoi(date1) < stoi(date2)) || (stoi(date1) == stoi(date2)))
{
return true;
}
else
{
return false;
}
}
идет проверка на год. 2000 меньше 2001, и значит совершенно верно возвращает true. Если у меня функция при сравнении годов возвращает true тогда сравнение идет вглубь, т.е. мы начинаем сравнивать месяцы. 7 больше 3, но у нас проверка идет на <= поэтому возвращает false и это значит что дата 20.07.2000 не меньше или равно 13.03.2001. А должно наоборот. Кто знает как решить данную проблему? Нужен свежий взгляд на проблему
Первый свежий взгляд - передавать в функцию сравнения строку вида сравнения - нонсенс...
Второй взгляд - у вас жестко задан формат даты (раз уж вы постоянно выдираете куски из строки - значит, она всегда имеет вид DD.MM.YYYY
). Не мучаемся, и пишем вспомогательную функцию типа
int s2date(const string& s)
{
return (atoi(s.c_str()+6)*100+atoi(s.c_str()+3))*100+atoi(s.c_str());
}
которая из "20.07.2000" делает число типа 20000720
, каковые сравнивать легко и просто, а главное, для них обычные сравнения работают изначально корректно!
Можно, конечно, исправлять логику вашего кода, но зачем?...
Намекну разве... Если вы сравниваете, например, как "меньше" - то если год1 меньше года 2 - то верните true
, если больше - верните false
, а вот если равны - то надо переходить к месяцам и продолжать сравнение. А если и месяцы равны - то к дням.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Работаю в qt creator, все запускаетсяПри попытке запустить exe вне creator ничего не происходит
Помогите пожалуйста с алгоритмом обхода дерева в ширину на с++ Вот код:
Смысл цикла: вводятся с клавиатуры s1 и s2Если mapT[s2] существует, то заносится в multiset значение