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

Определение разницы между датами в днях - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Необработанное исключение Stack overflow http://www.cyberforum.ru/cpp-beginners/thread854760.html
Здравствуйте. Такое дело: считываю файл в буфер, а он ругаиццо. ... DWORD bufferSize = 16777216; BYTE buffer1; DWORD Rezt=ReadFile(partition, buffer1, bufferSize, &bytesReturned, NULL); ... BYTE sm = buffer1;
C++ Определить, сколько раз в последовательности меняется знак числа Помогите решить ТОЛЬКО с помощью циклов и условного оператора 1.Есть последовательность целых чисел, заканчивается нулем. Определить, сколько раз в последовательности меняется знак числа. Одна тема - одно задание. Разделено. Название темы должно отражать ее суть. http://www.cyberforum.ru/cpp-beginners/thread854757.html
C++ Выбор направления начинающего
Добрый день (вечер, ночь) всем! Прошу совета, т.к. встал перед выбором. Не знаю что выбрать для дальнейшего глубокого изучения - MFC или WinAPI? Направление моей деятельности - это работа с внешними электронными устройствами. В книге Вильямс. Базовый курс. было мало уделено WinAPI, в основном было MFC. Жду высказываний. И ещё вопрос - какую книгу посоветуете по изучению программирования для USB и...
C++ 5 совершенных чисел
Здравствуйте. У меня проблема с задачей. Вывести на экран первые пять совершенных чисел (функция возвращает 1, если число совершенное, 0 – в противном случаем). Проблема в том, что не знаю как мне вывести найденные совершенные числа на экран. Хотелось бы сделать это через массив. #include <iostream> #include <math.h> using namespace std; int sover(int n) {
C++ Описать структуру с именем TRAIN http://www.cyberforum.ru/cpp-beginners/thread854702.html
Описать структуру с именем TRAIN,содержащую следующие поля: 1)название пункта назначения 2)номер поезда 3)время отправления Написать программу,выполняющую следующие действия: 1)ввод данных в массив,состоящий из 12 элементов типа TRAIN 2)вывод на экран данных,записи должны быть упорядочены в алфавитном порядке по названию пунктов назначения Используйте "быструю сортировку".Оцените число...
C++ Ошибка в конструкторе копирования Здравствуйте. Есть один класс для работы с многочленами, который хранит элементы многочлена в списке. Так вот, в конструкторе копирования (строка 30) происходит непонятная ошибка. Что самое странное, метод для добавления новых элементов многочлена работает нормально, так как сам по себе спокойно выполняет свои действия. В какую сторону копать? #include <iostream> using namespace std; ... подробнее

Показать сообщение отдельно
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
03.05.2013, 12:26     Определение разницы между датами в днях
Это я давно когда-то делал.
Проверял в подобном он-лайн калькуляторе. Работает вроде правильно.
Конструктор Date принимает три параметра: год, месяц и день. Перегружены операторы -, +=, -=, =.
Т.е. ты можешь создать два объекта Date, причем первая дата должна быть меньше второй, иначе оно неправильный результат возвращает. Но то можно исправить. Ну и разница этих дат вернет количество дней.

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
class Date
{
    int y;
    int m;
    int d;
public:
    //конструктор
    Date(int y = 0, int m = 0, int d = 0)
    {
        cout << "Вызов конструктора\n";
        this->y = y;
        this->m = m;
        this->d = d;
    }
    //деструктор
    ~Date() {cout << "Вызов деструктора\n"; }
 
    int GetY() const { return y; }
    int GetM() const { return m; }
    int GetD() const { return d; }
    const char* GetDate(char *str, const char *ch=".") const;       //возвращает дату как строку
    //по умолчанию разделитель между месяцем днем и годом "."
    //можно задать свой
 
    void SetDate(int y, int m, int d) 
    {
        this->y = y;
        this->m = m;
        this->d = d;
    }
    void SetY(int y) { this->y = y; }
    void SetM(int m) { this->m = m; }
    void SetD(int d) { this->d = d; }
 
    void operator+=(int days);          //прибавляет к дате N дней
    void operator-=(int days);          //отнимает от даты N дней
    int operator-(const Date &date);    //возвращает разницу в днях между двумя датами
    void operator=(const Date &date);   //приравнивает одну дату другой 
};
 
const char* Date::GetDate(char *str, const char *ch) const
{
    char *buf = new char[10];
    if(d<10) strcat(strcat(strcpy(str, "0"), itoa(d,buf,10)), ch);
    else strcat(strcpy(str, itoa(d,buf,10)), ch);
    if(m<10) strcat(strcat(strcat(str, "0"), itoa(m,buf,10)), ch);
    else strcat(strcat(str, itoa(m,buf,10)), ch);
    strcat(str, itoa(y,buf,10));
    delete [] buf;
    return str;
}
void Date::operator+=(int days)
{
    //число дней по месяцам в году (невисокосном)
    int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if((!(y%4) && y%100) || (!(y%100) && !(y%400))) month_days[1] = 29;
    //вычисляем сколько до дней до конца месяца, точнее вычитаем этот остаток от days
    if(days <= month_days[m-1]-d)
        d+=days;
    else
        {           
            days -= month_days[m-1] - d+1;
            d=1;
            if(m<11)
                m++;
            else 
                {
                    m=1;
                    y++;
                    if((!(y%4) && y%100) || (!(y%100) && !(y%400))) month_days[1] = 29;
                    else  month_days[1] = 28;
                }
            while(days)
            {
                for(m; days>=month_days[m-1];)
                    if(days >= month_days[m-1])
                    {
                        days -= month_days[m-1];
                        m++;
                        if(m==13)
                        {
                            m=1;
                            y++;
                            if((!(y%4) && y%100) || (!(y%100) && !(y%400))) month_days[1] = 29;
                            else  month_days[1] = 28;
                        }                       
                    }else
                    {
                        d+=days;
                        days=0; 
                        break;
                    }   
                    if(days)
                    {
                        d+=days;
                        days=0; 
                    }
            }
        }   
    
}
int Date::operator-(const Date &date) {
    //число дней по месяцам в году (невисокосном)
    int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    //если обе даты равны - возвращаем "0"
    if(y == date.GetY() && m == date.GetM() && d == date.GetD()) return 0;
 
    if(y == date.GetY())
        if(m == date.GetM())
            return date.GetD() - d;
        else /*if(m != date.GateM())*/
        {
            int days = 0;
            //если текущий год високосный - устанавливаем в феврале 28 дней
            if((!(y%4) && y%100) || (!(y%100) && !(y%400))) month_days[1] = 29;
            //получаем остаток дней до конца месяца;
            days = month_days[m-1] - d; 
            //суммируем дни "целых" месяцов
            for(int i = m; i < date.GetM()-1; i++)
                days += month_days[i];
            //прибавляем оставшие дни и возвращаем значение в вызывающую ф-ю
            return days += date.GetD();
        }
    else /*if(y != date.GateY())*/
    {
        int days = 0;
        //сначала вычисляем число дней до конца текущего года
        //если начальный год високосный - устанавливаем в феврале 28 дней
        if((!(y%4) && y%100) || (!(y%100) && !(y%400))) month_days[1] = 29;
        //плюсуем остаток дней до конца месяца
        days = month_days[m-1] - d;
        //далее плюсуем число дней каждого месяца до конца года
        for(int i = m; i<12; i++)
            days += month_days[i];
        //потом плюсуем дни по годам (365 и 366 в високосном)
        for(int i = y+1; i < date.GetY(); i++)
            if((!(i%4) && i%100) || (!(i%100) && !(i%400))) days+=366;
            else days+=365; 
        //если последний год високосный - устанавливаем в феврале 28 дней
        //иначе - 30        
        if((!(date.GetY()%4) && date.GetY()%100) || (!(date.GetY()%100) && !(date.GetY()%400)))  month_days[1] = 29;
        else month_days[1] = 28;
        //плюсуем число дней "целых" месяцев
        for(int i = 0; i < date.GetM()-1; i++)
            days += month_days[i];
        //плюсуем оставшиеся дний
        return days += date.GetD();
    }
}
void Date::operator=(const Date &date)
{
    d = date.GetD();
    m = date.GetM();
    y = date.GetY();
}
 
Текущее время: 14:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru