LINUX.ORG.RU
ФорумTalks

День программиста

 


0

1
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(int argc, char const **argv)
{   
    char st[16];
    time_t t;
    struct tm tm = {0};
    int y = 1970;
    if (argc > 1 && (y = atoi(argv[1])) < 1900)
    {   
        fprintf(stderr,"Year *MUST* be an integer >=1900: '%s'\n",argv[1]);
        return 1;
    }
    tm.tm_year = y - 1900;
    tm.tm_mday = 1; 
    t = timegm(&tm) + 255*24*3600;
    (void)gmtime_r(&t,&tm);
    strftime(st,sizeof(st)-1,"%Y-%m-%d",&tm);
    printf("%s\n",st);
    return 0;
}

Всех причастных — с праздником!

Подробности

Перемещено Shaman007 из linux-org-ru

Ответ на: комментарий от RedHate

Поясни.

Идея написать новость о дне программиста с кодом отличная, но то, что ты написал — это не код, а копрофилия.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Что эта программа вообще делает?
Выводит... Ктулху великий, но зачем это всё?

if (year%4)
{
    printf("september 12");
}else
{
    printf("september 13");
}


И всё, нахрен городить огород?

JacobTwoTwo
()
Ответ на: комментарий от JacobTwoTwo

Современный программист во всей красе...
«Если код работает в 95% случаев — это работающий код!»

RedHate
() автор топика
Ответ на: комментарий от RedHate

Предложенный мной код работает в куда большем количестве случаев. Твой вообще до 1970-го даты не обрабатывает. И неизвестно как он обработает даты сверх 4 миллиардов. Мой код лишён этих недостатков. Не говоря о том, что он значительно проще и эффективней.

во всей красе...

Так что поумерь свой сарказм.

JacobTwoTwo
()
Ответ на: комментарий от KennyMinigun

Четкого ТЗ же не было ;-)

Не, ТЗ как раз предельно чёткое (всегда бы такие ТЗ...): 256-й день года. :)

RedHate
() автор топика
Ответ на: комментарий от JacobTwoTwo

Предложенный мной код работает в куда большем количестве случаев. Твой вообще до 1970-го даты не обрабатывает.

Ой... «Вопросов больше не имею».

Мой код лишён этих недостатков.

За исключением двух:
а) не работает.
б) не соответствует ТЗ.

RedHate
() автор топика
Ответ на: комментарий от JacobTwoTwo

И всё, нахрен городить огород?

Ты не прав. Высокосный год считается гораздо более сложно.

Я не изучал детально код ТСа. Но может там есть рациональное зерно.

Serg_HIS
()
Ответ на: комментарий от JacobTwoTwo

Не работает? Хм. Ну... Ок.

И да. Реально твой код не работает. Ну может ближайшую сотню-две лет.

Не помню точно следующую поправочную дополнительную периодичность, вроде 400 лет, а потом ещё какая то дополнительная периодичность. Давно изучал, тонкостей не помню.

В институте по программированию это какраз детально «рассасывали».

И писали программу. Может прога ТСа и есть его лаба из института ;)

Serg_HIS
()
Ответ на: комментарий от Serg_HIS

Лаба, не лаба, но вычисления, связанные с определением интервала времени по заданным началу и окончанию или определения времени начала/окончания интервала по заданной длительности встречаются во вполне себе реальных задачах. И ошибки в таком коде могут приводить ко вполне себе реальному попадалову на вполне себе реальное бабло.

RedHate
() автор топика
Ответ на: комментарий от RedHate

Я работал с ребятами писавшими софт для банка. Там были траблы в основном именно связанные с вычислением времени. Не только высокосные года но и часовые пояса и ещё там какой-то учёт секундного сдвига в какие-то сутки...

Синхронизация по времени в банковских переводах - та ещё фигня.

Serg_HIS
()

Урааааа!!!

Поздравляю!!!

xwicked ★★☆
()
Ответ на: комментарий от brn

Leap second

Ну да по идее если смотреть за системным временем в компах - то часы в 12 часов ночи за(Leap)ают на секунду, а потом опять продолжают идти.

Serg_HIS
()
Ответ на: комментарий от Serg_HIS

А смысл тогда заводить тред, если не делать в нём срач :)

Ну да, этим ЛОР и живёт)

Gargamel
()

Наложу и я кучку:

#include <cassert>
#include <ctime>
#include <iostream>

constexpr int PROGRAMMERS_DAY = 256;
constexpr int DAYS_IN_YEAR = 365;

constexpr int leapDay(int year) {
    assert(year > 0);
    return (!(year % 4) && (year % 100)) || !(year % 400) ? 1 : 0;
}

int main() {
    const auto tm = std::time(nullptr);
    const auto localtm = std::localtime(&tm);
    assert(localtm);

    const auto dayOfYear = localtm->tm_yday + 1;
    if (dayOfYear == PROGRAMMERS_DAY) {
        std::cout << "Happy programmers day!\n";
    } else {
        auto daysLeft = PROGRAMMERS_DAY - dayOfYear;
        if (daysLeft < 0) {
            daysLeft += DAYS_IN_YEAR + leapDay(localtm->tm_year + 1900);
        }

        std::cout << "Days left to the Programmers Day: " << daysLeft << '\n';
    }

    return 0;
}

KennyMinigun ★★★★★
()
Ответ на: комментарий от JacobTwoTwo

Твой вообще до 1970-го даты не обрабатывает.

Тогда не было дня программиста

И неизвестно как он обработает даты сверх 4 миллиардов

Ни один софт столько не проживет

J ★★★★
()
Ответ на: комментарий от KennyMinigun

Пока вы пишете портянки и спорите чья длиннее 1Сники уже пьют.

Если ДеньГода(ТекущаяДата())=256 Тогда
     Сообщить("Всех с Днем Программиста!");
     ПитьПиво();
КонецЕсли;

J ★★★★
()
Ответ на: комментарий от JacobTwoTwo

Был 256-й день в году и то не ясно по какому календарю. А дня программиста не было.

J ★★★★
()
Ответ на: комментарий от J
Если ДеньГода(ТекущаяДата())=256 Тогда
     Сообщить("Всех с Днем Программиста!");
     ПитьПиво();
КонецЕсли;

Ну так а хто, по твоему, скажет сколько ждать надо? (уже завтра)

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Ну тут да, еще пять строчек прибавится)

J ★★★★
()
Ответ на: комментарий от KennyMinigun

фикс:

@@ -3,12 +3,12 @@
 #include <iostream>
 
 constexpr int PROGRAMMERS_DAY = 256;
-constexpr int DAYS_IN_YEAR = 365;
+//constexpr int DAYS_IN_YEAR = 365;
 
-constexpr int leapDay(int year) {
-    assert(year > 0);
-    return (!(year % 4) && (year % 100)) || !(year % 400) ? 1 : 0;
-}
+//constexpr int leapDay(int year) {
+//    assert(year > 0);
+//    return (!(year % 4) && (year % 100)) || !(year % 400) ? 1 : 0;
+//}
 
 int main() {
     const auto tm = std::time(nullptr);
@@ -17,14 +17,15 @@
 
     const auto dayOfYear = localtm->tm_yday + 1;
     if (dayOfYear == PROGRAMMERS_DAY) {
-        std::cout << "Happy programmers day!\n";
+        std::cout << "Happy programmers day!" << std::endl;
     } else {
         auto daysLeft = PROGRAMMERS_DAY - dayOfYear;
         if (daysLeft < 0) {
-            daysLeft += DAYS_IN_YEAR + leapDay(localtm->tm_year + 1900);
+            std::cout << "You are slowpoke! The Programmers Day has left " << -daysLeft << " day(s) ago" << std::endl;
+            return 0;
         }
 
-        std::cout << "Days left to the Programmers Day: " << daysLeft << '\n';
+        std::cout << "Days left to the Programmers Day: " << daysLeft << std::endl;
     }
 
     return 0;
;)

argv_0_
()

Попробовал я твою программу в обычном MinGW:

@SET NAME=0xFF
@D:\PROGS\TDM-GCC-64\bin\gcc.exe -o %NAME%.exe %NAME%.c

0xFF.c: In function 'main':
0xFF.c:18:9: warning: implicit declaration of function 'timegm' [-Wimplicit-function-declaration]
     t = timegm(&tm) + 255*24*3600;
         ^
0xFF.c:19:11: warning: implicit declaration of function 'gmtime_r' [-Wimplicit-function-declaration]
     (void)gmtime_r(&t,&tm);
           ^
C:\Users\USER\AppData\Local\Temp\ccGT1AiC.o:0xFF.c:(.text+0xb8): undefined reference to `timegm'
C:\Users\USER\AppData\Local\Temp\ccGT1AiC.o:0xFF.c:(.text+0xd3): undefined reference to `gmtime_r'
collect2.exe: error: ld returned 1 exit status
---
@SET NAME=0xFF
@D:\PROGS\CodeBlocks\MinGW\bin\gcc.exe -o %NAME%.exe %NAME%.c

C:\Users\USER\AppData\Local\Temp\cc6qExs7.o:0xFF.c:(.text+0x95): undefined reference to `timegm'
C:\Users\USER\AppData\Local\Temp\cc6qExs7.o:0xFF.c:(.text+0xb2): undefined reference to `gmtime_r'
collect2.exe: error: ld returned 1 exit status
---

не компилируется.

Пришлось делать в виртуалке apt-get update && apt-get install gcc ... и идти заваривать чай.

gcc 4.9.2
$ gcc 0xFF.c
$ ./a.out
1970-09-13
$ date
Wed Sep 13 09:26:14 EDT 2017

P.S. Кстати, я тоже начинал с RedHat 4.x. До этого попробовав пару дистрибутивов типа BlackCat.

pacify ★★★★★
()
Последнее исправление: pacify (всего исправлений: 1)
Ответ на: комментарий от argv_0_

<< std::endl;

JFYI: https://www.youtube.com/watch?v=GMqQOEZYVJQ

-constexpr int leapDay(int year) {
-    assert(year > 0);
-    return (!(year % 4) && (year % 100)) || !(year % 400) ? 1 : 0;
-}
+//constexpr int leapDay(int year) {
+//    assert(year > 0);
+//    return (!(year % 4) && (year % 100)) || !(year % 400) ? 1 : 0;
+//}

ТЗ же не было...

+            std::cout << "You are slowpoke! The Programmers Day has left " << -daysLeft << " day(s) ago" << std::endl;
+            std::cout << "You are slowpoke! The Programmers Day was " << -daysLeft << " day(s) ago\n";

;-)

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

Что-то все примолкли... Наверное праздновать ушли...

Serg_HIS
()
Ответ на: комментарий от JacobTwoTwo

Был!

Пускай даже так... (это конечно спорный вопрос) Да, тогда умели считать до 256.

Но ты согласен, что твой алгоритм будет ошибаться много раз в течении 4 миллиардов лет?

Serg_HIS
()
Ответ на: комментарий от cvs-255

70 лет российско индийским дипотношениям

Вы что-то путаете. 70 - назад не было такой страны как Россия.

anc ★★★★★
()
Ответ на: комментарий от JacobTwoTwo

Мало проверок. На кратных 400 сфейлится.

imul ★★★★★
()

юзверь jabocrack порадовал

Предложил всем бухнуть и канул в лету :)

Serg_HIS
()
Ответ на: комментарий от JacobTwoTwo

И неизвестно как он обработает даты сверх 4 миллиардов.

Ну во первых не 4-х, а 2-х (если точно, то (1<<31)-1). time_t — знаковое целое. Во вторых всё давно известно. Для тех, у кого time_t 32 бита Tue Jan 19 03:14:07 UTC 2038 настанет Конец Света, и неработоспособность кода ТС будет для них меньшей из проблем. Все остальные будут жить долго и счастливо.

KOHb-TPOJIJIbJIEP
()

Всё-таки есть вечные темы. Снова День Программиста, и снова обсуждают как считать високосные годы. :)

KOHb-TPOJIJIbJIEP
()
Ответ на: комментарий от KOHb-TPOJIJIbJIEP

Во вторых всё давно известно.

Всё не так просто.

Все поправки по времени, которые введены в библиотеки вычислений времени в разных языках программирования и операционных системах, введены из-за всяких космологических аспектов.

Не факт, что через миллиард лет или даже через несколько миллионов скорость вращения земли вокруг оси и вокруг солнца не изменятся на столько, что всё прийдётся пересчитывать и переписывать алгоритмы.

Дожило бы человечество...

Serg_HIS
()

Что-то привычных мне троллей ненапобигало сюда...

Может за ум взялись да пошли физику, математику, астрономию и программирование изучать...

Serg_HIS
()
Ответ на: комментарий от imul

Говорят есть. Может гонят? Или вы уже прикапыватесь к названию? Ну тогда РФ подойдет?
Я то «докопался» к тому что тогда ussr было.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.