1 Востаннє редагувалося koala (02.04.2018 23:01:31)

Тема: Перевантаження операцій

Виникла проблема, програма не дає ввести іншу дату і не порівнює, оскільки після вводу першої дати результати зникають, пробувала затримки екрану не допомагає(

Побудувати клас КАЛЕНДАР. Визначити необхідні конструктори,
методи, деструктор, Перевантажити операцію = для встановлення дати
операції +=, -= для додавання та віднімання днів, місяців, років до заданої
дати, операції ==, !=, >, >=,<, <= для порівняння дат. Перевантажити потокові
операції,  введення-виведення. Для перевантаження операцій використати
операторні методи класу та дружні функції.

#include "stdafx.h"
#include < iostream > #include < assert.h >
    using namespace std;
class calendar {
  private:
    int year;
    int month;
    int day;
  public:
    calendar(int = 0, int = 0, int = 0);
    ~calendar();
    calendar operator += (calendar & );
    calendar operator -= (calendar & );
    calendar operator = (calendar & );
    calendar operator != (calendar & );
    calendar operator > (calendar & );
    calendar operator < (calendar & );
    calendar operator >= (calendar & );
    calendar operator <= (calendar & );
    calendar operator == (calendar & );
    friend istream & operator >> (istream & , calendar & );
    friend ostream & operator << (ostream & , calendar & );
};
calendar::calendar(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
}
calendar calendar::operator = (calendar & y) {
    return (year = y.year,
        month = y.month,
        day = y.day);
}
calendar calendar::operator += (calendar & y) {
    year = y.year + year;
    month = y.month + month;
    if (month > 12) {
        year++;
        month = month - 12;
    }
    day =
        y.day +
        day;
    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 9 ||
        month == 11) {
        if (day > 31) {
            month++;
            day = day - 31;
        }
    }
    if (
        month == 4 || month == 6 || month == 8 || month == 10 || month == 12) {
        if (day > 30) {
            month++;
            day = day - 30;
        }
    }
    if (
        month == 2) {
        if (day > 28) {
            month++;
            day = day - 28;
        }
    }
    return calendar(year, month, day);
}
calendar calendar::operator -= (calendar & y) {
    year = y.year - year;
    month = y.month - month;
    if (month < 1) {
        year--;
        month = month + 12;
    }
    day =
        y.day -
        day;
    if (month == 1 || month == 5 || month == 7 || month == 9 || month == 11) {
        if (day < 1) {
            month--;
            day = day + 30;
        }
    }
    if (
        month == 2 || month == 4 || month == 6 || month == 8 || month == 10 ||
        month == 12) {
        if (day < 1) {
            month--;
            day = day + 31;
        }
    }
    if (
        month == 3) {
        if (day < 1) {
            month--;
            day = day + 28;
        }
    }
    return calendar(year, month, day);
}
calendar calendar::operator != (calendar & y) {
    if (year != y.year) {
        cout << "rizni daty " << endl;
    } else {
        if (month != y.month) {
            cout << "rizni daty " << endl;
        } else {
            if (day != y.day) {
                cout << "rizni daty " << endl;
            } else {
                cout << "Error. Odnakovi daty" << endl;
            }
        }
    }
    return calendar(year, month, day);
}
calendar calendar::operator == (calendar & y) {
    if (year != y.year) {
        cout << "Error. Rizni daty " << endl;
    } else {
        if (month != y.month) {
            cout << "Error. Rizni daty " << endl;
        } else {
            if (day != y.day) {
                cout << "Error. Rizni daty " << endl;
            } else {
                cout << "Odnakovi daty" << endl;
            }
        }
    }
    return calendar(year, month, day);
}
calendar calendar::operator < (calendar & y) {
    if (year > y.year) {
        cout << "Error. First date is 'bigger' " << endl;
    }
    if (
        year < y.year) {
        cout << "First date is lower" << endl;
    }
    if (
        year == y.year) {
        if (month > y.month) {
            cout << "Error. First date is 'bigger' " << endl;
        }
        if (
            month < y.month) {
            cout << "First date is lower" << endl;
        }
        if (
            month == y.month) {
            if (day > y.day) {
                cout << "Error. First date is 'bigger' " << endl;
            }
            if (
                day < y.day) {
                cout << "First date is lower" << endl;
            }
            if (
                day == y.day) {
                cout << "Error. Odnakovi daty" << endl;
            }
        }
    }
    return calendar(year, month, day);
}
calendar calendar::operator > (calendar & y) {
    if (year > y.year) {
        cout << "First date is 'bigger' " << endl;
    }
    if (
        year < y.year) {
        cout << "Error.First date is lower" << endl;
    }
    if (
        year == y.year) {
        if (month > y.month) {
            cout << "First date is 'bigger' " << endl;
        }
        if (
            month < y.month) {
            cout << "Error. First date is lower" << endl;
        }
        if (
            month == y.month) {
            if (day > y.day) {
                cout << "First date is 'bigger' " << endl;
            }
            if (
                day < y.day) {
                cout << "Error. First date is lower" << endl;
            }
            if (
                day == y.day) {
                cout << "Error. Odnakovi daty" << endl;
            }
        }
    }
    return calendar(year, month, day);
}
calendar calendar::operator <= (calendar & y) {
    if (year > y.year) {
        cout << "Error. First date is 'bigger' " << endl;
    }
    if (
        year < y.year) {
        cout << "First date is lower" << endl;
    }
    if (
        year == y.year) {
        if (month > y.month) {
            cout << "Error. First date is 'bigger' " << endl;
        }
        if (
            month < y.month) {
            cout << "First date is lower" << endl;
        }
        if (
            month == y.month) {
            if (day > y.day) {
                cout << "Error. First date is 'bigger' " << endl;
            }
            if (
                day < y.day) {
                cout << "First date is lower" << endl;
            }
            if (
                day == y.day) {
                cout << "Odnakovi daty" << endl;
            }
        }
    }
    return calendar(year, month, day);
}
calendar calendar::operator >= (calendar & y) {
    if (year > y.year) {
        cout << "First date is 'bigger' " << endl;
    }
    if (
        year < y.year) {
        cout << "Error.First date is lower" << endl;
    }
    if (
        year == y.year) {
        if (month > y.month) {
            cout << "First date is 'bigger' " << endl;
        }
        if (
            month < y.month) {
            cout << "Error. First date is lower" << endl;
        }
        if (
            month == y.month) {
            if (day > y.day) {
                cout << "First date is 'bigger' " << endl;
            }
            if (
                day < y.day) {
                cout << "Error. First date is lower" << endl;
            }
            if (
                day == y.day) {
                cout << "Odnakovi daty" << endl;
            }
        }
    }
    return calendar(year, month, day);
}
istream & operator >> (istream & is, calendar & x) {
    char c;
    cout << "vveditj datu:" << endl;
    cin >> x.year;
    cin >> c;
    assert(c == '.');
    cin >> x.month;
    cin >> c;
    assert(c == '.');
    cin >> x.day;
    return is;
}
ostream & operator << (ostream & os, calendar & x) {
    cout << "date:" << endl;
    os << x.year << '.' << x.month << '.' << x.day << endl;
    return os;
}
calendar::~calendar() {}
int main(int argc, char * * argv) {
    calendar a(1999, 12, 9);
    calendar b(2000, 6, 20);
    cin >> b;
    cout << b << endl;
    a += b;
    cout << "addition " << a << endl;
    a > b;
    return 0;
}

2

Re: Перевантаження операцій

Тут у вікні редактора, вгорі, є така кнопочка code.
Відкрийте «редагувати» своє повідомлення, виділіть весь код і натисніть ту кнопочку.
Потім відновіть відступи, бо читати тяжко.
Тоді будемо думати.

Подякували: Анна126, koala2

3 Востаннє редагувалося Анна126 (02.04.2018 22:41:15)

Re: Перевантаження операцій

Немає доступу, щоб кинути код(

4

Re: Перевантаження операцій

Відредагував за вас. Online beautifier міг десь і помилитися, але код принаймні можна тепер дивитися.

5

Re: Перевантаження операцій

Код робить вигляд, що працює: https://ideone.com/uuByG5
Заявленої проблеми не бачу. Мабуть, помилка була тут:

Анна126 написав:

пробувала затримки екрану не допомагає(

Наприклад, ви якось не так пробували. Оскільки коду, як ви це робили, нема, то і допомогти вам важко.
І дам ще пару порад:
- всі оператори мають робити тільки те, як звуться. Якщо у вас вираз x+y буде виводити щось, вам це дуже не сподобається. Якщо це operator > - то він має порівнювати операнди і повертати результат порівняння (bool).
- оператори вводу-виводу мусять працювати виключно із тим потоком, який їм передали. Тобто жодних cin та cout всередині такого оператору не має бути.