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

Класс даты - C++

Восстановить пароль Регистрация
 
KostyaKulakov
Заблокирован
06.09.2012, 12:22     Класс даты #1
Определить ещё один класс Date, дата в котором хранилась бы в упакованном виде.
Интерфейс этого класса должен ПОЛНОСТЬЮ СОВПАДАТЬ с интерфейсом
класса из задания 1. При этом эти два класса не должны зависеть друг от друга.
Проверкой на правильность решения является то, что при подключении модуля с
этой реализацией класса Date в программу из задания 1 функцию main() не надо
переписывать и работать она будет точно так же.

что тут хотят от меня что я должен сделать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 12:22     Класс даты
Посмотрите здесь:

Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и почтового ад C++
Как преобразовать указатель на класс к указателю на асбтрактный класс? C++
Класс, для полей которого нужно использовать класс C++
C++ Класс Quadrangle (четырехугольник). Класс хранит Декартовы координаты четырех углов четырехугольника
C++ Область видимости. один класс не видит другой класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
06.09.2012, 12:24     Класс даты #2
а где задание 1? а то не внятно как-то

собсна как у тебя реализован класс Date изначально. как он выглядит
KostyaKulakov
Заблокирован
06.09.2012, 12:26  [ТС]     Класс даты #3
Date.cpp
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include "Date.h"
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
 
 
bool Date::isLeapYear()
{
    if (yyyy % 4 == 0 &&
        (yyyy % 100 != 0 || yyyy % 400 == 0) )
        return true;
    else
        return false;
}
 
bool Date::operator < (const Date& d2)
{
    return (yyyy <  d2.yyyy) ||
            (yyyy == d2.yyyy && mm <  d2.mm) ||
            (yyyy == d2.yyyy && mm == d2.mm && dd < d2.dd);
}
 
bool Date::operator >  (const Date& date2)
{
    return (yyyy >  date2.yyyy) ||
           (yyyy == date2.yyyy && mm >  date2.mm) ||
           (yyyy == date2.yyyy && mm == date2.mm && dd > date2.dd);
}
 
bool Date::operator == (const Date& date2)
{
    return (yyyy == date2.yyyy && mm == date2.mm && dd == date2.dd);
}
bool Date::operator != (const Date& date2)
{
    return (yyyy != date2.yyyy && mm != date2.mm && dd != date2.dd);
}
 
int Date::daysInMonth()
{
        if(this->mm == JAN) return 31;
        if(this->mm == FEB) return 28 + isLeapYear();
        if(this->mm == MAR) return 31;
        if(this->mm == APR) return 30;
        if(this->mm == MAY) return 31;
        if(this->mm == JUN) return 30;
        if(this->mm == JUL) return 31;
        if(this->mm == AUG) return 31;
        if(this->mm == SEP) return 30;
        if(this->mm == OCT) return 31;
        if(this->mm == NOV) return 30;
        if(this->mm == DEC) return 31; 
}
 
Date Date::getCurrentDate()
{
    Date currentDate;
 
    time_t timestamp; // Отметка времени - количество секунд после начала Unix-эпохи
    tm* ptm;          // Указатель на структуру, которая будет содержать поля
                        //  даты для числа, месяца, года и т.д.
 
    // Получаем кол-во секунд, прошедших с начала Unix-эпохи до тек. момента
    time(&timestamp); 
 
    // Заполняем структуру типа tm на основе переданной отметки времени
    ptm = gmtime(&timestamp);
 
    // Заполняем нашу переменную типа date на основе полей структуры типа tm
    currentDate.dd = ptm->tm_mday;
    currentDate.mm = (Month)(ptm->tm_mon + 1);
    currentDate.yyyy = ptm->tm_year + 1900;
 
    return currentDate;
}
 
 
Date& Date::operator ++ ()
{
    if(this->dd == daysInMonth() && this->mm != DEC)
    {
        int mm = this->mm;
        mm = (Month)mm++;   //почему не работает mm = (Month)this->mm++ или mm = this->(Month)mm++
        this->mm = (Month)mm;
        this->dd = 1;
    }
 
    else if(this->mm == DEC && this->dd == 31)
    {
        this->yyyy++;
        this->mm = JAN;
        this->dd = 1;
    }
    else
        this->dd++;
 
    return *this;
 
}
 
Date& Date::operator ++ (int)  //правильно ли использовать static в этом случае?
{
    static Date old(getDay(), (Month)getMonth(), getYear());
 
    Date::operator++ ();
 
    return old;
 
}
 
Date& Date::operator -- ()
{
    if(this->dd == 1 && this->mm != JAN)                                                                        
    {
        int mm = this->mm;
        mm = (Month)mm--;                               
        this->mm = (Month)mm;
        this->dd = daysInMonth();
    }
    else if(this->mm != JAN)
        this->dd--;
 
    if(this->dd == 1 && this->mm == JAN)
    {
        this->yyyy--;                           
        this->mm = DEC;
        this->dd = daysInMonth();
    }
        if(this->dd != 1 && this->mm == JAN)
        this->dd--;
    return *this;
 
}
 
Date&  Date::operator -- (int)
{
    static Date oldminus(getDay(), (Month)getMonth(), getYear());
 
    Date::operator-- ();
 
    return oldminus;
}
 
 
 
 
ostream& operator << (ostream& os,  Date& date)
{
    os << setfill('0');
    os << setw(2) << date.getDay() << '.'
       << setw(2) << date.getMonth() << '.'
       << setw(4) << date.getYear();
    os << setfill(' ');
    return os;
}
 
istream& operator >> (istream& is, Date& d)
{
    int day;
    int mm;
    int year;
    char c; // символ для считывания точек
 
    is  >> day >> c
        >> mm   >> c
        >> year;
 
        d.setDay(day);
        d.setMonth((Date::Month)mm);
        d.setYear(year);
 
        //объясните пожалуйста как можно избежать изначального ввода данных в переменую и перенос через set* ? 
        // почему нельзя сразу >> d.setDay()?
 
        return is;
}
Date.h
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#ifndef DATE_H_
#define DATE_H_
 
#include <fstream>
#include <ctime>
using namespace std;
 
class Date
{
public:
    enum Month {JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG,
            SEP, OCT, NOV, DEC, MONTHS = 12};
 
private:
    int dd;
    Month mm;
    int yyyy;
 
public:
 
    Date() : dd(1), mm(Date::JAN), yyyy(1970)
    {
    }
 
    Date(int d, Month m, int y) : dd(d), mm(m), yyyy(y)
    {
    }
 
    Date(const Date& d2)
    {
        dd = d2.dd;
        mm = d2.mm;
        yyyy = d2.yyyy;
    }
 
    ~Date()
    {   
    }
 
    int getYear()
    {
        return yyyy;
    }
 
    void setYear(int year)
    {
        yyyy = year;
    }
 
    int getMonth()
    {
        return mm;
    }
 
    void setMonth(Month month)
    {
        mm = month;
    }
 
    int getDay()
    {
        return dd;
    }
 
    void setDay(int day)
    {
        dd = day;
    }
 
    // функция для определения, является ли год даты високосным
    bool isLeapYear();
 
    // функция для определения, является ли день даты последним в месяце
    int Date::daysInMonth();
 
    // операция сравнения дат
    bool operator < (const Date& d2);
    bool operator > (const Date& d2);
    bool operator != (const Date& date2);
    bool operator == (const Date& date2);
    
    // операция преинкремента. Увеличивает дату на один день
    Date& operator ++ ();
 
    // операция постинкремента. Увеличивает дату на один день
    Date& operator ++ (int);
 
    // операция предекремента. Увеличивает дату на один день
    Date& operator -- ();
 
    // операция постдекремента. Увеличивает дату на один день
    Date& operator -- (int);
        
    // функция возвращает текущую дату
    static Date getCurrentDate();
 
};
 
// операция вывода даты в поток
ostream& operator << (ostream& os,  Date& date);
istream& operator >> (istream& is,  Date& d);
 
#endif
main.cpp
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include "Date.h"
using namespace std;
 
int main()
{
    Date d(30, Date::SEP, 2011); // к-р с параметрами
    Date ds(30, Date::SEP, 2011); // к-р с параметрами
    Date d2(20, Date::SEP, 2099); // к-р с параметрами
 
    cout << "Function > :" << endl;
    if (d > d2)
        cout << d2;
    else
        cout << d;
    cout << endl << endl;
 
    cout << "Function < :" << endl;
    if (d < d2)
        cout << d2;
    else
        cout << d;
    cout << endl << endl;
 
    cout << "Function == :" << endl;
    if(d == ds)
        cout << "TRUE";
    else
        cout << "FALSE";
    cout << endl << endl;
 
    cout << "Function != :" << endl;
    if(d != ds)
        cout << "TRUE";
    else
        cout << "False";
    cout << endl << endl;
 
    cout << "Function ++X :" << endl;
    ++d;
    cout << d;
    cout << endl << endl;
 
    cout << "Function ((X++)++)++ :" << endl;
    ((d++)++)++;
    cout << d;
    cout << endl << endl;
 
    cout << "Function ((X++)++)++ :" << endl; // повторение проверка "static"
    ((d++)++)++;
    cout << d;
    cout << endl << endl;
 
    cout << "Function --X :" << endl;
    --d;
    cout << d;
    cout << endl << endl;
 
    cout << "Function ((X--)--)-- :" << endl;
    ((d--)--)--;
    cout << d;
    cout << endl << endl;
 
    cout << "Function ((X--)--)-- :" << endl;
    ((d--)--)--;
    cout << d;
    cout << endl << endl;
 
    cout << "Enter date in format dd.mm.yyyy: ";
    cin >> d;
    cout << d;
    cout << endl << endl;
 
    system("PAUSE");
 
    return 0;
}
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
06.09.2012, 12:30     Класс даты #4
хм. как может выглядеть упаковынный вид. может тупо 02.07.89 ? )
нужно поменять сам вид даты. совпадающие интерфейсы, надеюсь, понятны?)
KostyaKulakov
Заблокирован
06.09.2012, 12:34  [ТС]     Класс даты #5
честно не очень. я сам писал этот класс точнее функции в него . но как именно это всё упаковать дату я хз. мб перевести всё это в двоичную систему счисления те 0001010001010 а потом её распаковать и делать действия?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 12:42     Класс даты #6
имеется ввиду, чтоб как-то иначе внутри класса эти данные хранились. все в одной строчке, или еще как-нибудь, time_t или что придумаешь. чтобы просто в getMonth() ты не возвращал уже готовенькое, а выковыривал откуда-то (из этой "упаковки"), преобразовывал в целое и красиво возвращал.
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
06.09.2012, 12:45     Класс даты #7
пошловато несколько. надо еще вариантов послушать, кто что думает об упакованной дате.
совпадающие интерфейсы - значит точно такие же функции, с точно такими же входными и выходными параметрами. т.е. если поменять #include <Date.h> на #include <DateCompressed.h>, то программа ОБЯЗАНА работать. а вот какие преобразования упакованной даты потребуются внутри каждой функции класса - вопрос третий


во. новичок тему говорит
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
06.09.2012, 17:35     Класс даты #8
C++
1
2
3
4
5
6
7
8
class Date {
    unsigned day: 5;
    unsigned month: 4;
    unsigned year: 15;
    //Сумма - 24 бита (компилятор все равно округлит до целого числа байт)
public:
    //Добавить методов по вкусу
};
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 17:39     Класс даты #9
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
class Date {
    unsigned day: 5;
    unsigned month: 4;
    unsigned year: 15;
    //Сумма - 24 бита (компилятор все равно округлит до целого числа байт)
public:
    //Добавить методов по вкусу
};
и что ты тут "упаковал"? и какие "методы по вкусу"? условие прочти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2012, 18:32     Класс даты
Еще ссылки по теме:

Подробно прокомментировать класс PolarCoordinates, представляющий собой класс координат точки на плоскости C++
Создать класс Date, который может выводить даты в формате DD YYYY и MM/DD/YY C++
На основе введенной даты рождения и текущей даты сообщить пользователю, сколько он прожил дней C++

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

Или воспользуйтесь поиском по форуму:
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
06.09.2012, 18:32     Класс даты #10
Хорошо, сейчас напишу.

Добавлено через 33 минуты
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
56
57
58
59
//CompressedDate.h:
#ifndef COMPRESSED_DATE_H
#define COMPRESSED_DATE_H
 
#   include <fstream>
 
    class CompressedDate {
        unsigned day: 5;
        unsigned month: 4;
        unsigned year: 23;
    public:
        enum Month { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
 
        CompressedDate() {
            day = 1;
            month = JAN;
            year = 1970;
        }
 
        CompressedDate(int d, Month m, int y) {
            day = d;
            month = m;
            year = y;
        }
 
        //Конструктор копирования подойдет и неявный
 
        //Деструктор тоже
 
        int getDay() const { return day; }
        int getMonth() const { return month; }
        int getYear() const { return year; }
 
        int setDay(int d) { return day = d; }
        int setMonth(Month m) { return month = m; }
        int setYear(int y) { return year = y; }
 
        bool isLeapYear() const;
        int daysInMonth() const;
 
        bool operator<(const CompressedDate&) const;
        bool operator>(const CompressedDate&) const;
        bool operator==(const CompressedDate&) const;
        bool operator!=(const CompressedDate& d) const {
            return !(*this == d);
        }
 
        CompressedDate& operator++();
        CompressedDate& operator--();
        CompressedDate operator++(int);
        CompressedDate operator--(int);
 
        static CompressedDate getCurrentDate();
    };
 
    std::ostream& operator<<(std::ostream&, const CompressedDate&);
    std::istream& operator>>(std::istream&, CompressedDate&);
 
#endif
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//CompressedDate.cpp:
#include <ctime>
#include <iomanip>
#include "CompressedDate.h"
 
using namespace std;
 
bool CompressedDate::isLeapYear() const {
    return !(year & 3);
}
 
bool CompressedDate::operator<(const CompressedDate& d) const {
    if (year != d.year)
        return year < d.year;
    if (month != d.month)
        return month < d.month;
    return day < d.day;
}
 
bool CompressedDate::operator>(const CompressedDate& d) const {
    if (year != d.year)
        return year > d.year;
    if (month != d.month)
        return month > d.month;
    return day > d.day;
}
 
bool CompressedDate::operator==(const CompressedDate& d) const {
    return day == d.day && month == d.month && year == d.year;
}
 
int CompressedDate::daysInMonth() const {
    switch (month) {
    case FEB:
        return 28 + isLeapYear();
 
    case APR: case JUN:
    case SEP: case NOV:
        return 30;
 
    default:
        return 31;
    }
}
 
CompressedDate CompressedDate::getCurrentDate() {
    CompressedDate result;
    time_t timestamp;
    time(&timestamp);
    tm* ptm = gmtime(&timestamp);
    result.day = ptm->tm_mday;
    result.month = ptm->tm_mon + 1;
    result.year = ptm->tm_year + 1900;
    return result;
}
 
CompressedDate& CompressedDate::operator++() {
    if (day == daysInMonth()) {
        if (month == DEC) {
            year++;
            month = JAN;
        } else
            month++;
        day = 1;
    } else
        day++;
    return *this;
}
 
CompressedDate& CompressedDate::operator--() {
    if (day == 1) {
        if (month == JAN) {
            year--;
            month = DEC;
        } else
            month--;
        day = daysInMonth();
    } else
        day--;
}
 
CompressedDate CompressedDate::operator++(int) {
    CompressedDate temp(*this);
    ++*this;
    return temp;
}
 
CompressedDate CompressedDate::operator--(int) {
    CompressedDate temp(*this);
    --*this;
    return temp;
}
 
ostream& operator<<(ostream& os, const CompressedDate& date) {
    return os << setfill('0')
        << setw(2) << date.getDay() << '.'
        << setw(2) << date.getMonth() << '.'
        << setw(4) << date.getYear()
        << setfill(' ');
}
 
istream& operator>>(istream& is, CompressedDate& d) {
    int temp;
    (is >> temp).get();
    d.setDay(temp);
    (is >> temp).get();
    d.setMonth((CompressedDate::Month)temp);
    is >> temp;
    d.setYear(temp);
    return is;
}
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//main.cpp:
#include <cstdlib>
#include <iostream>
#include "CompressedDate.h"
 
using namespace std;
 
int main() {
    CompressedDate d(30, CompressedDate::SEP, 2011); // к-р с параметрами
    CompressedDate ds(30, CompressedDate::SEP, 2011); // к-р с параметрами
    CompressedDate d2(20, CompressedDate::SEP, 2099); // к-р с параметрами
 
    cout << "Function > :" << endl;
    if (d > d2)
        cout << d;
    else
        cout << d2;
    cout << endl << endl;
 
    cout << "Function < :" << endl;
    if (d < d2)
        cout << d;
    else
        cout << d2;
    cout << endl << endl;
 
    cout << "Function == :" << endl;
    if(d == ds)
        cout << "TRUE";
    else
        cout << "FALSE";
    cout << endl << endl;
 
    cout << "Function != :" << endl;
    if(d != ds)
        cout << "TRUE";
    else
        cout << "False";
    cout << endl << endl;
 
    cout << "Function ++X :" << endl;
    ++d;
    cout << d;
    cout << endl << endl;
 
    //Извините, но это какая-то хрень. Последние два инкремента применяются
    //к временным объектам. Было бы логичнее тестировать ++(++(++d));
    cout << "Function ((X++)++)++ :" << endl;
    ((d++)++)++;
    cout << d;
    cout << endl << endl;
 
    cout << "Function ((X++)++)++ :" << endl;
    ((d++)++)++;
    cout << d;
    cout << endl << endl;
 
    cout << "Function --X :" << endl;
    --d;
    cout << d;
    cout << endl << endl;
 
    cout << "Function ((X--)--)-- :" << endl;
    ((d--)--)--;
    cout << d;
    cout << endl << endl;
 
    cout << "Function ((X--)--)-- :" << endl;
    ((d--)--)--;
    cout << d;
    cout << endl << endl;
 
    cout << "Enter date in format dd.mm.yyyy: ";
    cin >> d;
    cout << d;
    cout << endl << endl;
 
    system("PAUSE");
 
    return 0;
}
Добавлено через 7 минут
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
(компилятор все равно округлит до целого числа байт)
Прошу прощения, ошибся. Компилятор округляет размер до числа, кратного sizeof(int).
Yandex
Объявления
06.09.2012, 18:32     Класс даты
Ответ Создать тему
Опции темы

Текущее время: 04:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru