язык C в Linux: вопросы начального уровня

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 10 дек 2016, 00:45

Хорошая задача (хорошая целая группа задач): вводятся (с терминала, или параметрами командной строки) 2 даты, начальная и конечная, в формате: dd.mm.yyyy. Найти сколько дней прошло от одной даты до другой.

Начинающие школяры начинают тут же вручную изобретать календарь: массив {31, 28, 31, ...}, високосные годы и т.д. - так как они сами его представляют и в меру своей осведомлённости...

Но задача здесь не в изобретении календаря, а в том, чтобы сделать это всё используя исключительно стандартный POSIX API для даты/время!

Код: Выделить всё

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

time_t normalize( struct tm *date ) {
   time_t t = mktime( date );
   *date = *localtime( &t );
   return t;
} 

int main( int argc, char **argv ) {
   if( argc != 3 ) printf( "число параметров\n" ), exit( 1 ); 
   struct tm date[ 2 ] = { {}, {} }; 
   time_t t[ 2 ]; 
   for( int i = 0; i < 2; i++ ) {
      int num = 0;
      char *token = strtok( argv[ i + 1 ], "." );
      while( token != 0 ) {
         if( 0 == atoi( token ) ) printf( "формат даты\n" ), exit( 1 );
         switch( num++ ) {
            case 0: date[ i ].tm_mday = atoi( token ); break;   
            case 1: date[ i ].tm_mon = atoi( token ) - 1; break;
            case 2: date[ i ].tm_year = atoi( token ) - 1900; break;
            default: printf( "формат даты\n" ), exit( 1 );
         }
         token = strtok( NULL, "." );
      }
      if( num != 3 ) printf( "формат даты\n" ), exit( 1 );
      t[ i ] = normalize( date + i ); 
      printf( "%s дата:\t%s", i ? "конечная" : "начальная", asctime( &date[ i ] ) );
   }
   if( t[ 1 ] < t[ 0 ] ) printf( "последовательность дат\n" ), exit( 1 );
   unsigned day = 0;
   while( date[ 0 ].tm_year < date[ 1 ].tm_year ) {
      struct tm last = {       
         .tm_mday = 31, .tm_mon = 11, .tm_year = date[ 0 ].tm_year
      };
      normalize( &last );
      day += last.tm_yday - date[ 0 ].tm_yday + 1;
      date[ 0 ].tm_mday = 1; date[ 0 ].tm_mon = 0; date[ 0 ].tm_year = date[ 0 ].tm_year + 1;
      normalize( date );
   } // пока годы различаются
   day += date[ 1 ].tm_yday - date[ 0 ].tm_yday; 
   printf( "между ними дней: %d\n", day ); 
   return 0;
}
И как это выглядит:

Код: Выделить всё

$ ./difd 01.01.2015 01.01.2016
начальная дата: Thu Jan  1 00:00:00 2015
конечная дата:  Fri Jan  1 00:00:00 2016
между ними дней: 365
$ ./difd 01.01.2016 01.01.2017
начальная дата: Fri Jan  1 00:00:00 2016
конечная дата:  Sun Jan  1 00:00:00 2017
между ними дней: 366
$ ./difd 01.01.2000 01.01.2001
начальная дата: Sat Jan  1 00:00:00 2000
конечная дата:  Mon Jan  1 00:00:00 2001
между ними дней: 366
$ ./difd 01.01.1900 01.01.1901
начальная дата: Mon Jan  1 00:00:00 1900
конечная дата:  Tue Jan  1 00:00:00 1901
между ними дней: 365

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 10 дек 2016, 00:50

Olej писал(а): Начинающие школяры начинают тут же вручную изобретать календарь: массив {31, 28, 31, ...}, високосные годы и т.д. - так как они сами его представляют и в меру своей осведомлённости...
И это самая важная ошибка при изучении именно C: вместо того, чтобы тщательно изучить библиотечные API (POSIX API, будем откровенны, потому что C под Windows - это нонсенс), так вот вместо начинает по-быстрому писаться ручной код "на хлопский розум" как это должно бы выглядеть.

Это особенно проявляется в таких областях как:
- управление режимами терминала
- обработка командной строки (опций и параметров)
- дата и время
- строчная обработка, разбиения строк на токены (слова, фразы, ...)
- перемещения в файловой системе
- потоки, собственные данные потоков, TSD ...

Да и в остальных областях то же самое...

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 13 май 2018, 15:08

Книги в тему:
Изображение
Грег Перри, Дин Миллер
Программирование на C для начинающих
М. "Эксмо", февраль 2015
Скачать книгу можете здесь: https://t.me/itliba/327
Изображение
Майк МакГрат
Программирование на С для начинающих
январь 2016
Скачать книгу можете здесь: https://t.me/itliba/321

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 13 май 2018, 15:29

Olej писал(а):Книги в тему:
Почему я поместил сюда эти книги?
Потому, что ещё 4 года назад я писал в некоторых своих книгах:
По языку C существует множество книг, учебников, учебных курсов (ещё бы, при такой биографии!). Но, как ни странно, до сегодня лучшим руководством является книга «Язык программирования Си», написанная в 1978 году книга, которую написали Брайан Керниган и Деннис Ритчи (легендарная «K&R»), число изданий которой ведёт счёт уже на десятки. При всём богатстве выбора, все сегодняшние студенты начинают изучение языка C именно с K&R.

... отечественные же, русскоязычные учебники (а здесь встречаются только учебные книги по C, для студентов университетов, например ... кто же станет писать "не-учебник" по столь древнему языку?) — здесь авторы-педагоги, не являющиеся практиками программной разработки, сами также, главным образом, переписывают и пересказывают материал из англоязычных изданий ... ну, ещё придумают десяток собственных примеров кода; но раз в первоисточниках этого нет, то его и вообще нет в природе.
И это написано на основе изучения предмета на то время ... пусть будет, и не самого пристального.
И вот, через 3-4 года - всплеск оригинальных англоязычных книг, а затем и их переводных изданий, по классическому языку C! (показанные - это ещё далеко не всё).

Я могу это отнести только как корреляцию с существенным ростом программных разработок под Linux, в относительном исчислении к общему числу программных работ: 5-7 лет на обнаружение феномена + раскачку + написание книг + рутина по их изданию - вот вам и рубеж интереса: 2011-2012.

Whitecolor
Интересующийся
Сообщения: 2
Зарегистрирован: 24 июн 2018, 19:47
Откуда: Москва
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Whitecolor » 24 июн 2018, 20:11

А эти книги по C под Linux?

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 25 июн 2018, 21:29

Whitecolor писал(а):А эти книги по C под Linux?
Хороший ворос... ;-)
Язык C был придуман в своё время исключительно для одной цели: написание операционных систем UNIX (клонов) и утилит этой операционной системы. Поэтому нормально язык C + библиотеки C - это базовый инструмент именно Linux.

Но позже, ВУЗ-овские пЫдагоги (это не так важно нащи отечественные или зарубежные, всё равно) забыли об этом ... да, собственно, этого и не знали никогда, и стали писать абстрактно "вообще"... :-(

Резюме: собственно сам язык C (синтаксис) можете изучать по любому источнику. А вот потом изучение библиотек C, API, без которых работа с C бессмысленна - дОлжно изучать только и исключительно по POSIX стандартам, т.е. на сегодня реально - только по Linux источникам.

Whitecolor
Интересующийся
Сообщения: 2
Зарегистрирован: 24 июн 2018, 19:47
Откуда: Москва
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Whitecolor » 25 июн 2018, 23:11

Olej писал(а):
Whitecolor писал(а):А эти книги по C под Linux?
Хороший ворос... ;-)
Язык C был придуман в своё время исключительно для одной цели: написание операционных систем UNIX (клонов) и утилит этой операционной системы. Поэтому нормально язык C + библиотеки C - это базовый инструмент именно Linux.

Но позже, ВУЗ-овские пЫдагоги (это не так важно нащи отечественные или зарубежные, всё равно) забыли об этом ... да, собственно, этого и не знали никогда, и стали писать абстрактно "вообще"... :-(

Резюме: собственно сам язык C (синтаксис) можете изучать по любому источнику. А вот потом изучение библиотек C, API, без которых работа с C бессмысленна - дОлжно изучать только и исключительно по POSIX стандартам, т.е. на сегодня реально - только по Linux источникам.
Понятно, спасибо за разъяснение

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 18 июл 2018, 18:14

Новая книга:
Изображение
ISBN978-5-97060-614-8
Издательство ДМК Пресс
Автор Бен Клеменс
Переводчик Слинкин А.А.
Категория Программирование
Год 2018
Страниц 376
Язык C — не просто фундамент всех современных языков программирования, он и сам — современный язык, идеальный для написания эффективных приложений передового уровня. Последние 20 лет C не стоял на месте. Сам язык и окружающая его экосистема подвергаются пересмотру. Эта книга начинается там, где другие заканчиваются. В ней рассказано, как изменилась функциональность, поддерживаемая любым компилятором, благодаря двум новым стандартам C, вышедшим со времен оригинального ANSI.

Цель книги – рассмотреть то, чего нет в других учебниках по C: инструменты и окружение; библиотеки для работы со связанными списками и анализаторами XML; написание удобочитаемого кода с дружественным программным интерфейсом.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: язык C в Linux: вопросы начального уровня

Непрочитанное сообщение Olej » 18 июл 2018, 18:22

Olej писал(а):Новая книга:
Изображение
Хотя, вообще то говоря, это переиздание перевода 2015 года:
Язык С в XXI веке
Год издания: 2015
Автор: Бен Клеменс
Переводчик: А. А. Слинкин
Жанр или тематика: Программирование
Издательство: ДМК Пресс
ISBN: 978-5-97060-101-3 , 978-1-491-90389-6
Количество страниц: 376
Скачать свободно торент книги можно здесь.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя