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

Создать класс Date – дата, содержащая поля: день, месяц, год. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 5.00
НастенькО
1 / 1 / 0
Регистрация: 01.03.2011
Сообщений: 44
07.04.2011, 22:30     Создать класс Date – дата, содержащая поля: день, месяц, год. #1
Создать класс Date – дата, содержащая поля: день, месяц, год. Определить операторы "+" и "-", как методы класса, а "++" и "--" в обеих формах (префиксная и постфиксная) как дружественные функции. Оператор "+" должен позволять осуществление операции только с переменными встроенного int. (x=y+5.)Должна быть предусмотрена корректная работа с високосными годами.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2011, 22:30     Создать класс Date – дата, содержащая поля: день, месяц, год.
Посмотрите здесь:

Дата, год, месяц, день C++
Дата в формате <день>.<месяц>.<год> C++
C++ Создать класс Date для работы с датами в формате "год. месяц. день"
C++ Создать класс Date для работы с датами в формате «год.месяц.день»
C++ Создать класс Date для работы с датами в формате "год.месяц.день" / C++ для начинающих
C++ Из класса "Дата" с полями день, месяц, год создать класс "Время" с дополнительными полями час, минута, секунда
Класс "Дата": день, месяц, год C++
C++ Создайте класс «Дата» со свойствами год, високосный год, месяц, день месяца и день недели

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
08.04.2011, 03:27     Создать класс Date – дата, содержащая поля: день, месяц, год. #2
у меня как-раз такая программа завалялась:
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
 
struct date
{
    int Year,Month,Day;
    date(){}
    date(int yy, int mm, int dd):Year(yy),Month(mm),Day(dd){}
    bool Less(const date &d1,const date &d2)
    {
        return Less(d1,d2,"");
    }
    //возвращает ture если d1 раньше d2.
    //p - это сткрока с параметрами, указывающими какие поля структур не следует использовать при сравнении
    bool Less(const date &d1,const date &d2,char *p)
    {
        size_t end=strlen(p);
        if (d1.Year < d2.Year && !find(p,p+end,'y'))return true;
        if (d1.Month < d2.Month &&!find(p,p+end,'m'))return true;
        if (d1.Day < d2.Day && !find(p,p+end,'d'))return true;
        return false;
    }
    //функция возвращает количество дней между датами
    int operator-(date d2)
    {
        date d1(*this);
        //если d2 раньше d1 поменять их местами, это сделано потому что
        //далее в функции весь код адекватен при условии что d1 раньше d2.
        if (Less(d2,d1))swap(d1,d2);
        //разница между датами в днях
        int diff=0;
        //между какими месяцами будем считать
        int from=d1.Month, to=d2.Month;
        //разница между годами в годах
        int diffyear=abs(d2.Year - d1.Year);
        //сколько дней между датами прошло, считая только по месяцам
        if (diffyear==0)
            for (int i=from; i < to; i++)
            {
                switch(i)
                {
                    case 1:diff+=31; break;
                    case 2:diff+=28; break;
                    case 3:diff+=31; break;
                    case 4:diff+=30; break;
                    case 5:diff+=31; break;
                    case 6:diff+=30; break;
                    case 7:diff+=31; break;
                    case 8:diff+=31; break;
                    case 9:diff+=30; break;
                    case 10:diff+=31; break;
                    case 11:diff+=30; break;
                    case 12:diff+=31; break;
                }
            }
        else
        {
            for (int i=from; i <= 12; i++)
            {
                switch(i)
                {
                    case 1:diff+=31; break;
                    case 2:diff+=28; break;
                    case 3:diff+=31; break;
                    case 4:diff+=30; break;
                    case 5:diff+=31; break;
                    case 6:diff+=30; break;
                    case 7:diff+=31; break;
                    case 8:diff+=31; break;
                    case 9:diff+=30; break;
                    case 10:diff+=31; break;
                    case 11:diff+=30; break;
                    case 12:diff+=31; break;
                }
            }
            for (int i=1; i < to; i++)
            {
                switch(i)
                {
                    case 1:diff+=31; break;
                    case 2:diff+=28; break;
                    case 3:diff+=31; break;
                    case 4:diff+=30; break;
                    case 5:diff+=31; break;
                    case 6:diff+=30; break;
                    case 7:diff+=31; break;
                    case 8:diff+=31; break;
                    case 9:diff+=30; break;
                    case 10:diff+=31; break;
                    case 11:diff+=30; break;
                    case 12:diff+=31; break;
                }
            }
        }
        //коррекция по дням
        diff-=d1.Day;
        diff+=d2.Day;
        //сколько лет прошло между датами
        diff+=((diffyear > 1)?(diffyear - 1):(0))*365;
        //сколько было весокосных лет в промежутке между датами
        diff+=diffyear/4;
        //считаем были ли весокосный год между датами если они оличатюся менее чем на 4 года.
        for (int i=d2.Year-diffyear;i<=d2.Year;i++)
        {
            //год является високосным, если он кратен 4 и при этом не кратен 100, либо кратен 400.
            if (((i%4==0) && !(i%100==0))||(i%400==0))
            {
            diff+=1; break;
            }
        }
        return diff;
    }
    date operator+(int days)
    {
 
        date d(*this);
        d.Year+=int(days/365);
        int diff=0;
        for (int i=Month;i < 13;i++)
        {
            switch(i)
            {
                case 1:diff+=31; break;
                case 2:diff+=28; break;
                case 3:diff+=31; break;
                case 4:diff+=30; break;
                case 5:diff+=31; break;
                case 6:diff+=30; break;
                case 7:diff+=31; break;
                case 8:diff+=31; break;
                case 9:diff+=30; break;
                case 10:diff+=31; break;
                case 11:diff+=30; break;
                case 12:diff+=31; break;
            }
        }
        int out_of_year=(days - int(days/365) * 365);
        for (int i=1; diff < out_of_year-31; i++)
        {
            switch(i)
            {
                case 1:diff+=31; break;
                case 2:diff+=28; break;
                case 3:diff+=31; break;
                case 4:diff+=30; break;
                case 5:diff+=31; break;
                case 6:diff+=30; break;
                case 7:diff+=31; break;
                case 8:diff+=31; break;
                case 9:diff+=30; break;
                case 10:diff+=31; break;
                case 11:diff+=30; break;
                case 12:diff+=31; break;
            }
        }
        d.Month+= out_of_year/diff;
        return d;
    }
};
ostream &operator<<(ostream &out,const date &d)
{
        out << d.Year << '-' << d.Month << '-' << d.Day;
        return out;
}
istream &operator>>(istream &in,date &d)
{
    char c;
    in >> d.Year;
    in >> c;
    if (c=='-')
    {
        in >> d.Month;
        in >> c;
        if (c=='-') in >> d.Day;
        else cout << "wrong date format, excepted '-' after month, variable is not complete\n";
    }
    else cout << "wrong date format, excepted '-' after years, variable is not complete\n";
    return in;
}
int main()
{
    date D1,D2;
    cout << "Enter some date yy-mm-dd: ";
    cin >> D1;
    cout << "Enter some other date yy-mm-dd: ";
    cin >> D2;
    cout << "first date " << D1 << ", second date " << D2 << '\n';
    cout << D1-D2 << " days betwin dates\n";
    cout << "enter number: ";
    int n;
    cin >> n;
    cout << "first date + " << n << " days: " << D1 + n << '\n';
    return 0;
}
не уверен в корректности сложения числа и даты.
НастенькО
1 / 1 / 0
Регистрация: 01.03.2011
Сообщений: 44
08.04.2011, 10:36  [ТС]     Создать класс Date – дата, содержащая поля: день, месяц, год. #3
Какие то ошибки выбивает
Yandex
Объявления
08.04.2011, 10:36     Создать класс Date – дата, содержащая поля: день, месяц, год.
Ответ Создать тему
Опции темы

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