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

Преобразование секунд в года - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Реализовать подстановку кода с помощью препроцессора http://www.cyberforum.ru/cpp-beginners/thread1801830.html
Есть множество классов: class SomeClassName1 { ... } class SomeClassName2 { ... } ...
C++ Typedef для функций Здравствуйте! В книге Страуструпа в качестве примера приводится typedef для указателей на функции например: typedef void(*SIG_TYP) (int) , typedef int (*CFT)(const void*, const void*) Не совсем понятно на что влияют выделеные аргументы. Если они нужны, то почему я потом могу сделать следующее объявление: SIG_TYP a(void x, char y); И компилятор это скомпилит без ошибок. http://www.cyberforum.ru/cpp-beginners/thread1801818.html
Что не так с этими указателями? C++
Всем привет, прошу помощи разобраться в коде. Недавно начал изучать C++ по книге Лафоре. В главе с указателями есть пример со связными списками. Вот его структура: struct node { int data; node* next; }; class linklist{ private: node* first; public:
C++ Прервать цикл из цикла, вложенного в него
Приветствуют. Собственно, вопрос в названии темы. for(int i = 1; i <= 10; i++) for(int j = 1; j <= 5; j++) { if(/* здесь условие выхода из обоих циклов */) { /* как выйти сразу из 2-х циклов? */ /* break даст выход только из цикла j */ } }
C++ Тест. Подскажите где ошибка http://www.cyberforum.ru/cpp-beginners/thread1801758.html
1 ответ не правильный. Подскажите где ошибка.
C++ Typedef thiscall метода с переменным числом аргументов Добрый день. Хочу что то типа такого typedef void *(__thiscall *tThisCall)(void *, ...); tThisCall method; //... method(object, arg1, arg2); подробнее

Показать сообщение отдельно
Operok
126 / 124 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
03.09.2016, 14:12     Преобразование секунд в года
date_time.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
#include <cstdint>
 
struct date_time
{
    uint16_t
        year{},
        mon{},
        day{},
        hour{},
        min{},
        sec{},
        msec{};
 
    inline date_time(
        uint16_t y = 2000,
        uint16_t M = 1,
        uint16_t d = 1,
        uint16_t h = 0,
        uint16_t m = 0,
        uint16_t s = 0,
        uint16_t x = 0
    ) :
        year(y), mon(M), day(d), hour(h), min(m), sec(s), msec(x)
    {
    }
    date_time(uint64_t);    //msec
 
    uint64_t to_msec() const;
};

date_time.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
#include "date_time.h"
 
enum : uint64_t
{
    MsecInSec = 1000,
    SecInMin = 60,
    MinInHour = 60,
    HourInDay = 24,
    MsecInMin = SecInMin * MsecInSec,
    MsecInHour = MsecInMin * MinInHour,
    MinInDay = MinInHour * HourInDay,
    SecInDay = MinInDay * SecInMin,
    MsecInDay = SecInDay * MsecInSec,
 
    DaysInYear = 365,
    DaysIn4Years = DaysInYear * 4 + 1,
    DaysIn100Years = DaysIn4Years * 25 - 1,
    DaysIn400Years = DaysIn100Years * 4 + 1,
 
    MsecInYear = DaysInYear * MsecInDay,
    MsecIn4Years = DaysIn4Years * MsecInDay,
    MsecIn100Years = DaysIn100Years * MsecInDay,
    MsecIn400Years = DaysIn400Years * MsecInDay
};
 
constexpr uint16_t months[2][12] = {
    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, //not leap
    { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }  //leap
};
 
date_time::date_time(uint64_t total_msec)
{
    auto days = total_msec / MsecInDay;
    total_msec %= MsecInDay;
    hour = total_msec / MsecInHour;
    total_msec %= MsecInHour;
    min = total_msec / MsecInMin;
    total_msec %= MsecInMin;
    sec = total_msec / MsecInSec;
    msec = total_msec % MsecInSec; 
 
    auto total_400y = days / DaysIn400Years;
    year += 400 * total_400y;
    days %= DaysIn400Years;
    auto total_100y = days / DaysIn100Years;
 
    if (4 == total_100y) {      //этот день последний в 400-летке
        year += 399; 
        days = 30;
        mon = 11;
    }
    else {
        year += 100 * total_100y;
        if (0 != (days %= DaysIn100Years)) {
            auto total_4y = days / DaysIn4Years;
            year += 4 * total_4y;
            days %= DaysIn4Years;
            auto total_y = days / DaysInYear;
            if (4 == total_y) {     //этот день помледний в 4-летке
                year += 3;
                days = 30;
                mon = 11;
            }
            else {
                year += total_y;
                auto is_leap = (3 == total_y) && (24 != total_4y || (24 == total_4y && 3 == total_100y));
                days %= DaysInYear;
 
                if (0 != days)
                    while (days >= months[is_leap][mon])
                        days -= months[is_leap][mon++];
            }
        }
    }
    ++year;
    ++mon;
    day = days + 1;
}
 
inline bool year_is_leap(uint16_t year)
{
    return (0 == year % 400) || ((0 != year % 100) && (0 == year % 4));
}
 
uint64_t date_time::to_msec() const
{
    uint64_t days{};
    auto remain_y = year - 1;
    auto is_leap = year_is_leap(year);
    days += DaysIn400Years * (remain_y / 400);
 
    if (0 != (remain_y %= 400)) {
        days += DaysIn100Years * (remain_y / 100);
        if (0 != (remain_y %= 100)) {
            days += DaysIn4Years * (remain_y / 4);
            days += DaysInYear * (remain_y % 4);
        }
    }
 
    for (size_t j{ 1 }; j < mon; ++j)
        days += months[is_leap][j - 1];
 
    days += day - 1;
 
    return days * MsecInDay + hour * MsecInHour + min * MsecInMin + sec * MsecInSec + msec;
}

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
#include <iostream>
 
#include "date_time.h"
 
using namespace std;
 
int main()
{
    date_time dt(1700, 12, 31, 23, 59 ,59, 999);
    auto msec = dt.to_msec();
 
    cout << "Milliseconds: " << msec << endl;
 
    date_time new_dt(msec);
 
    char buf[24];
 
    sprintf_s(
        buf,
        "%04d.%02d.%02d %02d:%02d:%02d.%03d",
        new_dt.year,
        new_dt.mon,
        new_dt.day,
        new_dt.hour,
        new_dt.min,
        new_dt.sec,
        new_dt.msec);
 
    cout << "DateTime: " << buf << endl;
 
    system("pause");
}
 
Текущее время: 13:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru