Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
1

Перегруженная функция сравнения двух дат

14.07.2013, 13:59. Показов 2358. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как сократить функцию которая сравнивает две даты?
Получилось кое-как, да и еще предупреждение показывает, что значение возвращается не при всех путях выполнения

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class CDate
{
public:
    explicit CDate(int day=1, int month=1, int year=2000);
    explicit CDate(const CDate &copy);
 
    bool operator<(const CDate &right);
    bool operator<=(const CDate &right);
 
private:
    int mDay, mMonth, mYear;
};
 
 
 
bool CDate::operator<(const CDate &right)
{
    if (mYear<right.mYear) return true;             // год меньше
    
    if (mYear==right.mYear)                         // года одинаковые
    {
        if (mMonth<right.mMonth) return true;
 
        if (mMonth==right.mMonth)                   // одинаковый год + одинаковый месяц
        {
            if (mDay<right.mDay) return true;
            if (mDay>=right.mDay) return false;
        }
 
        if (mMonth > right.mMonth) return false;
    }
 
    if (mYear > right.mYear) return false;          // год больше
}
 
 
bool CDate::operator<=(const CDate &right)
{
    if (mYear<right.mYear) return true;
 
    if (mYear==right.mYear)                         // одинаковые года
    {
        if (mMonth<right.mMonth) return true;
 
        if (mMonth==right.mMonth)                   // одинаковые года + одинаковые месяцы
        {
            if (mDay<=right.mDay) return true;
            else return false;
        }
 
        if (mMonth>right.mMonth) return false;
    }
 
    if (mYear>right.mYear) return false;
}


warning C4715: CDate::operator<: значение возвращается не при всех путях выполнения
warning C4715: CDate::operator<=: значение возвращается не при всех путях выполнения

Может есть более простой способ
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2013, 13:59
Ответы с готовыми решениями:

Функция сравнения двух чисел
Проверьте кто-нибудь код пожалуйста. Задача : Написать программу, выводящую на экран результат...

Функция сравнения двух строк
Написать функцию сравнения двух строк, используя указатели на них. Прошу помочь написать код...

Функция для сравнения двух массивов
Функция нужна для ответа на вопрос задачи &quot;Верно ли, что все элементы 1-ой последовательности ...

Функция для сравнения двух символьных последовательностей
С помощью поинтеров напишите функцию для сравнения двух символьных последовательностей ( без...

26
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 14:00 2
Я бы предложил перевести все в одни единицы измерения и уже потом сравнить.
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:03  [ТС] 3
0x10, а что за единицы измерения?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 14:05 4
В данном случае пересчитал бы все в дни.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.07.2013, 14:05 5
Цитата Сообщение от BigLow Посмотреть сообщение
а что за единицы измерения?
В данном случае - дни.
1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 14:07 6
BigLow, и еще нюанс: всю логику достаточно написать в единственном операторе - <. Остальные (>, <=, >=) пишутся уже через него.
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:08  [ТС] 7
Цитата Сообщение от 0x10 Посмотреть сообщение
В данном случае пересчитал бы все в дни.
Цитата Сообщение от Tulosba Посмотреть сообщение
В данном случае - дни.
это вы имеете ввиду, саму дату представить как количество дней от какого-то числа?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 14:11 8
BigLow, типа того.
И пока помню - такие операторы привычнее видеть снаружи класса, т.е. чтобы они принимали два аргумента: левый и правый.

Добавлено через 1 минуту
BigLow, А можно и схалтурить: сформировать две строки вида YYYYMMDD и сравнить лексикографически. (хотя казалось бы при чем тут строки, можно и числами)
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:16  [ТС] 9
0x10, насчет строк - это хорошая идея спасибо
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.07.2013, 14:17 10
Цитата Сообщение от BigLow Посмотреть сообщение
C++
1
2
if (mDay<=right.mDay) return true;
else return false;
C++
1
return mDay <= right.mDay;
1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 14:18 11
year * 10000 + month * 100 + day и фиг с ними.
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:25  [ТС] 12
Цитата Сообщение от 0x10 Посмотреть сообщение
year * 10000 + month * 100 + day
а если из этого числа нужно будет узнать день, месяц или год, то каким способом это проделать?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 14:33 13
Зачем? Я не предлагаю его хранить, только вычислить для сравнения дат. (хотя в обратной операции нет ничего хитрого)
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:43  [ТС] 14
а я с начала подумал, что саму дату в таком виде хранить.
все, понял как сделать. вот что получилось:
C++
1
2
3
4
5
6
7
bool CDate::operator<(const CDate &right)
{
    size_t n1 = mYear*10000 + mMonth*100 + mDay;
    size_t n2 = right.mYear*10000 + right.mMonth*100 + right.mDay;
 
    return n1<n2;
}
всего 3 строчки кода
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 14:44 15
И на остальные операторы придется по одной строчке.
Тут есть еще пара нюансов: в частности, такие методы не будут работать с константными объектами. (чтобы наверняка - как уже говорил, лучше сделать внешними функциями).
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:49  [ТС] 16
Цитата Сообщение от 0x10 Посмотреть сообщение
такие методы не будут работать с константными объектами.
будут, если функцию сделать const
C++
1
2
3
4
5
6
7
bool CDate::operator<(const CDate &right) const
{
    size_t n1 = mYear*10000 + mMonth*100 + mDay;
    size_t n2 = right.mYear*10000 + right.mMonth*100 + right.mDay;
 
    return n1<n2;
}
да и привык уже таким способом перегружать, т.е. внутри класса
0
0x10
14.07.2013, 14:55
  #17

Не по теме:

В данном случае мб и все равно, но в будущем вероятно найдется кто-нибудь, кто стукнет по рукам)
Я, например, не вижу причин почему в выраженях a < b, a == b, a > b левый аргумент "главнее" и должен быть объектом, у которого вызывается метод. Мы сравниваем два равноправных объекта. Не правый с левым, а два между собой.
Но это я уже на твое усмотрение оставляю)

1
Jupiter
14.07.2013, 15:00
  #18

Не по теме:

Цитата Сообщение от BigLow Посмотреть сообщение
да и привык
привык - так отвыкай. 0x10 дело говорит.

0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 15:33  [ТС] 19
Цитата Сообщение от 0x10 Посмотреть сообщение
Мы сравниваем два равноправных объекта. Не правый с левым, а два между собой.
Цитата Сообщение от Jupiter Посмотреть сообщение
привык - так отвыкай. 0x10 дело говорит.
хорошо прислушаюсь к совету

Добавлено через 24 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
всю логику достаточно написать в единственном операторе - <. Остальные (>, <=, >=) пишутся уже через него.
не могли бы пояснить поточнее? в операторах (>, >=, <=) используется только (<)? никаких других операторов в нем нет?
просто я сейчас пытаюсь реализовать это для остальных, но не получается

для ">=" пишу return !(*this<right); а вот с другими проблема
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.07.2013, 15:39 20
Там все так просто, аж смешно)
Если есть operator<(a, b), то легко определить operator>(a, b). Когда А больше В? Тогда, когда В меньше А. А оператор меньше уже определен.
operator>(a, b) { return b < a; }
Ну и оставшийся <= по аналогии
0
14.07.2013, 15:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2013, 15:39
Помогаю со студенческими работами здесь

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){...

Перегруженная функция
Где неправильно #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt;...

Перегруженная функция
есть два задания. 1) - посчитать количество чисел в самой длинной возрастающей последовательности...

Перегруженная функция
Помогите преобразовать функцию в перегруженную... Бьюсь уже хрен знает сколько.... Условия: В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru