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

Класс Date дополнить прогу - C++

Восстановить пароль Регистрация
 
SIDX
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 33
24.05.2011, 12:19     Класс Date дополнить прогу #1
Помогите пожалуйста дополнить программу что бы она правильно считала разность дат и распознавала високосный год.

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
#include <iostream>
class Date{
private:
        bool leapyear;
        int day;
        int month;
        int year;
        bool leap(int)const;
        int maxday()const;
public:
        Date(int d,int m,int y):leapyear(leap(y)),day(d),month(m),year(y){};
        Date& operator+=(int);
        Date& operator-=(int);
        std::string operator-(Date&)const;
        bool operator==(Date&)const;
        friend std::ostream& operator<<(std::ostream&, const Date&);
};
bool Date::leap(int y)const{ 
        return ((y % 4 == 0 && y% 100 != 0) || y % 400);
}
int Date::maxday()const{
        int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(leapyear)days[1]=29;
        return days[month-1];
}
Date& Date::operator+=(int d){
        if(day+d>maxday()){
                d-=maxday()-day;
                if(++month>12){
                        month=1;
                        year++;
                }
                while(d/maxday()){
                        if(++month>12){
                                month=1;
                                year++;
                        }
                        d-=maxday();
                }
                day=d;
        }
        else day+=d;
        return *this;
}
Date& Date::operator-=(int d){
        if(day-d<1){
                d-=day;
                if(--month==0){
                        month=12;
                        year--;
                }
                while(d/maxday()){
                        d-=maxday();
                        if(--month==0){
                                month=12;
                                year--;
                        }
                }
                day=maxday()-d;
        }
        else day-=d;
        return *this;
}
#include <sstream> //stringstream               
std::string Date::operator-(Date &dt)const{
        int d,m,y;
        if(year>=dt.year){
                y=year-dt.year;
                if(month>dt.month){
                        m=month-dt.month;
                        d=day+dt.maxday()-dt.day;
                        if(d>dt.maxday())d-=dt.maxday();
                        else --m;
                        --y;
                }
                else {
                        m=12-month+dt.month;
                        d=dt.day+maxday()-day;
                        if(d>maxday())d-=maxday();
                        else --m;
                }
        }
        else {
                y=dt.year-year;
                if(month>dt.month){
                        m=12-month+dt.month;
                        d=day+dt.maxday()-dt.day;
                        if(d>dt.maxday())d-=dt.maxday();
                        else --m;
                        --y;
                }
                else {
                        m=dt.month-month;
                        d=maxday()-day+dt.day;
                        if(d>maxday())d-=maxday();
                        else --m;
                }
        }
        std::string s;
        std::stringstream ss;
        ss<<d<<" days "<<m<<" month "<<y<<" years";
        getline(ss,s);
        return s;
}
bool Date::operator==(Date& dt)const{
        return day==dt.day && month==dt.month && year==dt.year;
}
std::ostream& operator<<(std::ostream &os, const Date &dt){
        std::string m[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
        os<<dt.day<<" "<<m[dt.month-1]<<" "<<dt.year;
        return os;
}       
        
int main(){
        int d,m,y,reduce,increase;
        std::cout<<"Enter first date (day month year): ";
        std::cin>>d>>m>>y;
        Date date(d,m,y);
        std::cout<<"Date = "<<date<<std::endl;
        std::cout<<"reduce  date by : ";//уменьшить дату на столько то дней
        std::cin>>reduce;
        date-=reduce;
        std::cout<<"Date = "<<date<<std::endl;
        std::cout<<"Increase date by : ";//увеличить дату 
        std::cin>>increase;
        date+=increase;
        std::cout<<"Date = "<<date<<std::endl;
        std::cout<<"Enter second date (day month year): ";
        std::cin>>d>>m>>y;
        Date date2(d,m,y);
        std::cout<<"Date2 = "<<date2<<std::endl;
        std::cout<<"Dates are "<<(date==date2 ? "equal":"not equal")<<std::endl;
        std::cout<<"Date1 - Date2 = "<<date-date2<<std::endl;
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 12:19     Класс Date дополнить прогу
Посмотрите здесь:

Дополнить и проанализировать класс C++
Дополнить готовую прогу,апгрейд сделать:) C++
C++ Дополнить класс динамическим массивом
C++ Создать класс Date
Создать класс Date C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.05.2011, 13:28     Класс Date дополнить прогу #2
Для вычисления разности, приводи дату к количеству дней и уже их вычитай. Потом можно обратно в условное количество месяцев/лет преобразовать.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
24.05.2011, 13:52     Класс Date дополнить прогу #3
Определить високосный ли год можно так:
C++
1
2
3
4
5
6
7
8
bool leapYear( int testYear ) const
{
   if ( testYear % 400 == 0 || 
      ( testYear % 100 != 0 && testYear % 4 == 0 ) )
      return true; // високосный год
   else
      return false; // не високосный год
}
SIDX
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 33
24.05.2011, 22:30  [ТС]     Класс Date дополнить прогу #4
Можно поподробнее о том, как реализовать вычисление кол-ва дней между датами? буду очень признателен
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
24.05.2011, 22:35     Класс Date дополнить прогу #5
Цитата Сообщение от SIDX Посмотреть сообщение
Можно поподробнее о том, как реализовать вычисление кол-ва дней между датами?
См. тут или тут.

Добавлено через 48 секунд
И кстате, поиск на форуме работает.
Yandex
Объявления
24.05.2011, 22:35     Класс Date дополнить прогу
Ответ Создать тему
Опции темы

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