Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

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

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

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

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<=: значение возвращается не при всех путях выполнения

Может есть более простой способ
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 13:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегруженная функция сравнения двух дат (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BigLow
55 / 55 / 2
Регистрация: 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;
}
да и привык уже таким способом перегружать, т.е. внутри класса
0x10
14.07.2013, 14:55
  #17

Не по теме:

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

Jupiter
14.07.2013, 15:00
  #18

Не по теме:

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

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

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

для ">=" пишу return !(*this<right); а вот с другими проблема
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
14.07.2013, 15:39 #20
Там все так просто, аж смешно)
Если есть operator<(a, b), то легко определить operator>(a, b). Когда А больше В? Тогда, когда В меньше А. А оператор меньше уже определен.
operator>(a, b) { return b < a; }
Ну и оставшийся <= по аналогии
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 15:40  [ТС] #21
Цитата Сообщение от BigLow Посмотреть сообщение
хорошо прислушаюсь к совету

Добавлено через 24 минуты


не могли бы пояснить поточнее? в операторах (>, >=, <=) используется только (<)? никаких других операторов в нем нет?
просто я сейчас пытаюсь реализовать это для остальных, но не получается

для ">=" пишу return !(*this<right); а вот с другими проблема

Не по теме:

кнопка "спасибо" куда-то пропала

Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.07.2013, 15:41 #22
+ std::rel_ops
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 15:50  [ТС] #23
0x10, Jupiter, благодарю за помощь. хорошо помогли
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 16:34  [ТС] #24
задача решена. вот что получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool operator<(const CDate &a, const CDate &b)
{
    int n1 = a.mYear*1000 + a.mMonth*100 + a.mDay;
    int n2 = b.mYear*1000 + b.mMonth*100 + b.mDay;
    return n1<n2;
}
 
bool operator<=(const CDate &a, const CDate &b)     { return !(b<a); }
 
bool operator==(const CDate &a, const CDate &b) 
    { return a.mDay==b.mDay && a.mMonth==b.mMonth && a.mYear==b.mYear; }
 
bool operator!=(const CDate &a, const CDate &b)     { return !(a==b); }
bool operator>=(const CDate &a, const CDate &b)     { return !(a<b); }
bool operator>(const CDate &a, const CDate &b)      { return b<a; }
сделать эти функции друзьями класса и можно использовать
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.07.2013, 21:23 #25
Цитата Сообщение от BigLow Посмотреть сообщение
int n1 = a.mYear*1000 + a.mMonth*100 + a.mDay;
т.е. 12 месяц предыдущего года может быть больше, чем 1 месяц следующего?
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
15.07.2013, 11:19  [ТС] #26
Цитата Сообщение от Tulosba Посмотреть сообщение
т.е. 12 месяц предыдущего года может быть больше, чем 1 месяц следующего?
да, действительно ошибка.
вот так должно быть правильно
C++
1
year * 10000 + month * 100 + day;
Добавлено через 1 минуту
мне так и советовали в 11 посте, это я решил каждое число уменьшить в 10 раз. а оказалось неправильно)
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.07.2013, 11:25 #27
BigLow, достаточно месяц умножать на 31, а год на 12*31.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 11:25
Привет! Вот еще темы с ответами:

Перегруженная функция - C++
У меня тут задача я её правильно написал но почему то визуалка говорит что перегруженная функция. #include &lt;iostream&gt; #include &lt;cmath&gt; ...

Перегруженная функция - C++
Написать перегруженную функцию, которая возвращает значение в зависимости от набора формальных параметров: x+x/2 Z={ ...

Перегруженная функция - C++
есть два задания. 1) - посчитать количество чисел в самой длинной возрастающей последовательности например, массив a={7, 2, 4, 48, 54,...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.07.2013, 11:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru