Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
cinemaster4d
22 / 10 / 2
Регистрация: 25.06.2018
Сообщений: 146
1

Переписать из непонятного языка на язык си

05.11.2018, 10:33. Просмотров 206. Ответов 3
Метки нет (Все метки)

я нашел вот эту статью. помогите переписать ее на си

Добавлено через 3 минуты

Конвертация времени
Алгоритмы и программные решения
Итак, столкнулся с довольно тривиальной задачей — посчитать промежуток времени в секундах, минутах, часах, и днях между двумя датами и временем. Задача, в общем-то, не новая и легко решается на ПК.
Суть этого поста — адаптировать подобные преобразования для МК.
Сразу оговорюсь, что мы не будем учитывать зональность времени, а будем вычислять по гринвичу.

Конвертация из YYYY:MMD:HH:MM:SS в uint32_t

Итак существует несколько проблем:
— високосный год
— високосное столетие
— високосное четырехсотлетие
— разные длины месяцев.
— февраль находится в неудобном для вычисления положения: где-то между началом и концом года.

Итак, попробуем сделать так, чтобы облегчить вычисления.
Первое что нужно сделать — поместить февраль в хвост вычислений. Сделаем как-бы альтернативный год, в котором «новый год» будет 1 марта. Таким образом если мы будем сразу правильно вычислять начало заданного года, т.е. 1 марта, то с февралем у нас проблем не возникнет, так как он не будет влиять на смещение порядкового номера дат в этом году, просто 28 февраля будет 364-м порядковым числом (потому что считаем от нуля), а 29 февраля — 365-м. Приняли.
Второе: Так как у нас год стал стабильным на всем его протяжении, кроме самого конца, нам потребуется всего одна таблица дней смещений.
вот она:
C
1
const uint16_t day_offset[12] = {0, 31, 61, 92, 122, 153, 184, 214, 245, 275, 306, 337};
где элементы массива указывают на смещение в кол-ве дней на каждый месяц, начиная с марта. Впрочем, можно вычислять и иным способом, по формуле:
day_offset = (153 * month + 2) / 5;
где month — номер месяца, причем март = 0; апрель = 1 и т. д.
В общем-то и все. Напишем функцию:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const uint16_t day_offset[12] = {0, 31, 61,92, 122, 153, 184, 214, 245, 275,306, 337};
typedef struct
{
        uint8_t sec;
        uint8_t min;
        uint8_t hour;
        uint8_t date;
        uint8_t month;
        uint8_t day;
        int16_t year;
} sDateTime;
 
uint32_t EncodeDateTime(sDateTime *dt)
{
        uint8_t a = dt->month < 3; // а = 1, если месяц январь или февраль
        int16_t y = dt->year - a - 2000;  // y = отнимаем от года 1, если а = 1, а так же 2000;
        uint8_t m = dt->month + 12 * a - 3; // аналогия выражения (12 + month - 3) % 12; делаем март нулевым месяцем года.
        return (dt->date - 1 + day_offset[m] + y * 365 + y / 4 - y / 100 + y / 400) * 86400 +
               (int)dt->hour * 3600 + (int)dt->min * 60 + dt->sec;
}
Началом отсчета будет 1 марта 2000 года 00:00:00. Для совместимости с Unix time можно прибавить константу 951868800
Эта дата удобна не только с позиции «круглого» года, но и тем, что мы находимся в самом начале 400-летнего цикла григорианского календаря. А еще — сравнительно небольшие текущие числа, которые еще лет 50 не будут создавать проблем в числе с размерностью int, и тем более в uint32_t.

Итак, с помощью этой функции мы делаем порядковое число секунды, начиная с момента 1 марта 2000 00:00:00
Теперь узнать промежуток в секундах между двумя датами не составит труда.

Ну а если требуется отобразить интервал в днях, часах, минутах и секундах, то напишем следующую функцию:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct
{
        uint32_t Day;
        uint8_t Hour;
        uint8_t Min;
        uint8_t Sec;
} sDayTime;
 
void DecodeDayTime(uint32_t idt, sDayTime *dt)
{
        ldiv_t a = ldiv(idt, 86400);
        dt->Day = a.quot;
        a = ldiv(a.rem, 3600);
        dt->Hour = a.quot;
        a = ldiv(a.rem, 60);
        dt->Min = a.quot;
        dt->Sec = a.rem;
}
Конвертация из uint32_t в YYYY:MMD:HH:MM:SS
Что ж, возможно нам понадобится узнать, какое число и время будет спустя 100500 секунд относительно заданного.
Для этого нам нужна обратная функция перевода числа в удобоваримую дату/время.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void DecodeDateTime(uint32_t idt, sDateTime *dt)
{
    sDayTime day;
    ldiv_t century, year_of_century;
    uint32_t day_of_century, a, m;
    DecodeDayTime(idt, &day);
    dt->sec = day.Sec;
    dt->min = day.Min;
    dt->hour = day.Hour;
    century = ldiv(day.Day * 4 + 3, 146097); // Вычисляем кол-во 100-летий
    day_of_century = century.rem / 4; // Остаток дней в столетии
    year_of_century = ldiv(day_of_century * 4 + 3, 1461); // Вычисляем кол-во лет в столетии
    day_of_year = year_of_century.rem / 4; // Остаток дней в году
    m = (5 * day_of_year + 2) / 153; // номер месяца, где март = 0, апрель = 1 и т.д.
    dt->date = day_of_year + 1 - day_offset[m]; // находим день в месяце
    a = m < 10;
    dt->month = m + 3 - 12 * a; // вычисляем месяц в году
    dt->year = 100 * century.quot + year_of_century.quot + 2000 + a; // вычисляем год
    dt->day = (day.Day + 3) % 7; // вычисляем день недели
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2018, 10:33
Ответы с готовыми решениями:

Язык си и windows batch file. Может язык си заменить батник? Интересует запуск из языка си утилиты cmd
Чтобы не конвертировать bat файл в exe. Возможно сделать саму программу в си, которая запускает...

Переписать символы с входящего рядка в выходящий, меняя операторы языка паскаль на операторы языка С++ := на =, = на ==, # на !=
Переписать символы с входящего рядка в выходящий, меняя операторы языка паскаль на операторы языка...

Перевод программы с языка C++ на язык C#
Есть код на языке C++. Помогите, пожалуйста, перевести, т.е. написать то же самое на языке C# ....

Перевод с языка с++ на язык vba
#include &lt;iostream&gt; #define eps 1e-3 #define tay 1.618 void Gold(double a, double b) { ...

Перевод из языка С++ на язык делфи
Ребята помогите пожалуйста перевести программу на С++ в делфи, буду очень благодарна, просто очень...

3
prik
271 / 178 / 57
Регистрация: 01.03.2011
Сообщений: 479
06.11.2018, 09:36 2
Цитата Сообщение от cinemaster4d Посмотреть сообщение
я нашел вот эту статью. помогите переписать ее на си
Вы так шутите??? Это и есть Си
1
_SayHello
656 / 380 / 120
Регистрация: 30.07.2015
Сообщений: 1,331
06.11.2018, 10:30 3
cinemaster4d,
uint8_t -> unsigned char
uint16_t -> unsigned short
uint32_t -> unsigned int
0
Peoples
1374 / 858 / 755
Регистрация: 06.02.2016
Сообщений: 2,273
Записей в блоге: 18
Завершенные тесты: 5
06.11.2018, 18:47 4
Заголовок вроде нужен stdint.h
C
1
2
3
4
5
6
7
8
9
#include  <stdio.h>
#include <stdint.h>
 
int main(void)
{
    uint32_t x=102;
    printf("%u",x);
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2018, 18:47

Перевод программы с языка C++ на язык C
#include &lt;iostream&gt; #include &lt;set&gt; #include &lt;cmath&gt; struct BNode { int key; BNode*...

Перевод с одного языка в язык 1С
Добрый день Не подскажите как перевести код с языка Паскаль в 1С ? Вот пример: uses crt; var ...

Перевод программы с языка C++ на язык C#
#include &lt;iostream&gt; using namespace std; int reverse_number(int number) { int n = 0; ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru