Константину больше спасибо, это очень интересный алгоритм Евклида, когда сначала пеберм два числа, получаем 3е (например справа), делаем сдвиг и повторяем, когда визуализируешь этот алгос - очень интересно. Вообще такие лекции, от разработчика такого уровня на русском языке - это прям национальное достояние, без шуток.
часто в последнее время залезаю в исходники PostgreSQL и решил все-таки почитать про C и вот тут такой полезный плейлист! спасибо автору, очень выразительно, точно и компактно излагает материал.
51:30, опечатка на слайде 29 диапазон целых знаковых типов от -2^{x-1} до 2^{x-1} - 1, а не от -(2^{x-1} -1) - т.е. отрицательных значений на одно больше чем положительных. Позже (1:21:10) кстати упоминается что инт ассиметричен. Вспомнился в какой-то книжке по ассемблеру пример кода (которым автор очень гордился), который вычислял abs за две x86 команды - изменить знак (neg) и условный переход на предыдущую команду если результат предыдущей команды отрицателен (вроде js, но могу и ошибаться за давностью лет). Разумеется на минимальных числах он зацикливался, потому что там neg всегда возвращал отрицательный результат.
Да всё так. Я убрал с этого слайда асимметричность целых для простоты. Но она действительно есть. У нас будет (не скоро) занятие где мы будем специально говорить о кодировках для int, float и других типов и о трюках с этими кодировками вроде быстрого приближённого логарифма и т.п.
Увы лекции читаю не я. Не знаю пишутся ли они, вероятно нет. Я рекомендую заменять лекционную часть Керниганом и Ричи. По тем вопросам которых там нет я запланировал несколько похожих на лекции допсеминаров.
Сразу же к указателям и ассертам :) Я так понял курс для тех, кто уже знаком с программированием. Интересно было послушать. Хочется еще придраться что вывод не на stderr)
Смотреть уроки с "Базового курса по С++" не так кофортно, ибо присутствует чувство, что что-то прошло мимо тебя (но эти студенты в видео понимают о чём речь). Так что да здравствует consistency!
Большое спасибо за то, что Вы делаете. Подскажите, пожалуйста, какие разделы математики необходимо изучить , чтобы понимать и математические кейсы в курсе?
Очень интересно и позновательно. Спасибо! Единственный негативный осадок остался от gdb. 1:02:45 не удается запустить отладчик : warning: opening /proc/PID/mem file for lwp 40.40 failed: No such file or directory (2) Cannot insert breakpoint 1. Cannot access memory at address 0x80011fa Патчи по типу echo -ne '\x90\x90' | sudo dd of=/usr/bin/gdb seek=$((0x335bad)) bs=1 count=2 conv=notrunc - так же ситуацию не решают =(
Да это известная проблема. Обычно если не хочется грязных хаков помогает просто пересборка GDB github.com/microsoft/WSL/issues/8516#issuecomment-1526257546 Или ещё проще установка из PPA: github.com/microsoft/WSL/issues/8516#issuecomment-1762849202
минута 51 - должно быть - начало отрицательного диапазона для int-а -(2^(x-1)) , на видео -(2^(x-1) - 1). Длина отрицательного диапазона числа равна длине положительного плюс ноль (то есть длиннее чем чисто положительного)
Да спасибо в комментах уже обсуждали. Пока что это сознательное упрощение. Мы дойдём до тонкостей и последствий кодировки целых и плавающих чисел довольно скоро.
недавно просматривал семинар, стало интересно про работу на бакалавра Марка. у него канал свой есть. было бы интересно послушать что это и где применяется икак работает.
Канала у Марка нет. Дипломная работа у него была по улучшению работы с индуктивностями, патч залит в LLVM, пользуется ну хм... весь мир примерно . Но я боюсь если вы не эксперт по компиляторам то читать его диплом вам будет тяжеловато.
После 10 слайда возник вопрос: когда всё таки правильно использовать abort() а не тот же exit(). И можно ли давать функциям возможность закрывать программу, в даном случае я бы возвращал код ошибки в read_inputs и в main вызывал abort() на основание кода.
Насчёт проблем abort я буду говорить когда буду говорить о разработке библиотек. Пока что заставлять обвешиваться лапшой ифов не гуманно: это просто один бинарник, ему некому прокидывать возврат. Выбор между abort, _Exit и exit надо бы проговорить, раньше в этом курсе не было. Я подумаю куда включить, спасибо за идею.
@@tilir Требовать невозможно, т.к. курс бесплатный. Просто лезть в интернет и искать инструкцию, когда засел проходить урок по видео только лишь сбивает с толку. П.С. Спасибо вам за уроки.
Эх, Константин Игоревич. Если бы мне в своё время Вячеслав Юрьевич так же доходчиво объяснял бы специфику указателей в Си. Я, конечно, потом всё уяснил. Но так не хватало лекций подобного плана.
Константин Игоревич, скажите, пожалуйста, почему в функции "int gcd(int x, int y)" мы предполагаем, что второй аргумент не равен нулю? Ведь по определению: НОД(x,0) равен 0, если x
Это странное определение. Если x < 0 то НОД не нулевой, например НОД(-2, -4) = 2. Случай x = 0 я вычеркиваю для простоты. Для программиста 0 это не делитель ))
@@tilir Большущее спасибо, что так оперативно отвечайте на вопросы в ютубе. Я даже себе представить не могу как вы на все это находите время. Дай бог, чтобы ваши студенты захотели. Еще вопрос, в МФТИ нету заочки или онлайн курсов по С/С++?
Для простоты, это всё-таки первое занятие. Педагогическая стратегия такая: на первом занятии учим детей использовать abort, потом до конца магистратуры отучаем. Те, кого удаётся отучить, становятся программистами ))
Я это не контролирую. Но если что всё выложено тут: github.com/tilir/c-graduate/tree/master/coursework/contests Просто без удобного интерфейса. И я на последнем семинаре как раз кинул клич: кто может помочь поднять более стабильные контесты, welcome.
Константин, а какая мотивация пользоваться if & endif вместо комментария? И то и то насколько мне известно убирается препроцессором. Сам вижу возможный аргумент, что добавление/удаление комментария рушат историю в гите и засоряют блейм, а других аргументов привести не могу Спасибо за лекцию!
Комментарии созданы для комментирования. Для условного отключения коды созданы директивы условного отключения кода. Мы просто используем инструменты по назначению.
Да я упоминаю несимметриченость int. Но ещё раз -- пока рано обращать на это особое внимание. Мы пока что считаем что int это от -(2^n-1) до (2^n-1). Детали последуют в развитии курса.
@@tilir идея в том, что при поиске наибольшего общего искать НОД не для введенных значений, а от их модулей. Ведь для его поиска знак не имеет значение. Останется только проверка на 0, что можно сделать типа if(x==0|y==0) return 1
Последний студент так и сделал по факту. Но там есть неприятный момент в связи с тем, что тип инт маргинально несимметричный. И тогда будет ошибка. Но ее можно избежать одной проверкой.
Пожалуйста не используйте типы с фиксированной длиной без точного обоснования их применения. Есть ситуации когда они нужны, но выбором по умолчанию должны быть обычные типы. Язык задуман и построен вокруг них.
@@tilir В программирование под микроконтроллеры использование типов фиксированной длины довольно частая практика. Ну и кажется что для переносимости кода это тоже одно из правил.
Вообще то мой канал есть на рутубе. Увы меня там не смотрят. Тот же самый бакалаврский курс который здесь набирает 100к там набирает типа 200 просмотров всего.
Никто не верил, но курс по С появился, Спасибо!
Ахахахах, при чем, большиснтво ожидавших - зрители курса по C++)
@@napalm20005 такой курс уже есть
Искренняя благодарность Константину Игоревичу за великолепные лекции! Смотрю на одном дыхании.
Отличный препод!
1. Врубается в тему.
2. Норм относится к своим ученикам.
3. Умеет донести до своих учеников знания.
Спасибо!
🙏
Трехкратное "УРА" в честь выхода курса по Сям🥳🥳🥳. Огромное спасибо автору
Константин Игоревич, большое спасибо за то что делитесь знаниями, с обычными зрителями из глубинки!
Константину больше спасибо, это очень интересный алгоритм Евклида, когда сначала пеберм два числа, получаем 3е (например справа), делаем сдвиг и повторяем, когда визуализируешь этот алгос - очень интересно.
Вообще такие лекции, от разработчика такого уровня на русском языке - это прям национальное достояние, без шуток.
Спасибо огромное за то, что выкладываете подобные семинары. Очень приятно и поучительно Вас слушать.
Контента такого уровня на ютубе нет .
Спасибо .
Так мало курсов по чистому С, огромное спасибо! С первых минут видео ясно, что курс будет стоящий!
Очень круто) даже порешал контест на 97 балов:)
Константин Игоревич, спасибо, было интересно и познавательно!
От души!!! Я не верил, что такое может быть) но надеялся) спасибо!🎉😂
Спасибо за то, что снимаете!
Я ждал этого курса все лето, ураа!!)
Действительно, очень познавательно и подача супер.
Спасибо
он приветствуется, а я уже многое понял
Безумно рад новым видео на канале! Спасибо!
реально курс по C? это сон?
лучший подарок на др, спасибо
Спасибо большое за видеозаписи с курса!
14:51 слайд 8 сначала указатель назван p, а затем используется pa
спасибо вам большое, пожалуйста, не останавливайтесь
Еее! А вот и классика подъехала)
родная сишечка, как же я ждала
Круто!
Миллион тысяч лайков!
Спасибо за курс!
Класс, супер лектор
часто в последнее время залезаю в исходники PostgreSQL и решил все-таки почитать про C и вот тут такой полезный плейлист! спасибо автору, очень выразительно, точно и компактно излагает материал.
51:30, опечатка на слайде 29 диапазон целых знаковых типов от -2^{x-1} до 2^{x-1} - 1, а не от -(2^{x-1} -1) - т.е. отрицательных значений на одно больше чем положительных. Позже (1:21:10) кстати упоминается что инт ассиметричен.
Вспомнился в какой-то книжке по ассемблеру пример кода (которым автор очень гордился), который вычислял abs за две x86 команды - изменить знак (neg) и условный переход на предыдущую команду если результат предыдущей команды отрицателен (вроде js, но могу и ошибаться за давностью лет). Разумеется на минимальных числах он зацикливался, потому что там neg всегда возвращал отрицательный результат.
Да всё так. Я убрал с этого слайда асимметричность целых для простоты. Но она действительно есть. У нас будет (не скоро) занятие где мы будем специально говорить о кодировках для int, float и других типов и о трюках с этими кодировками вроде быстрого приближённого логарифма и т.п.
50:00 слайд 29: диапазоны знаковых типов разве такие? Нижняя граница же -(2^n) - чётное число.
Ютуб в последнее время рекомендует хорошие вещи 😮
как же не хватало подобных лекций лет 20 назад....
И мне ))
Ой йой йой, как здорово! Курс по С это шикарно, спасибо вам большое! Интересно, а к лекционной части будет доступ на UA-cam?
Увы лекции читаю не я. Не знаю пишутся ли они, вероятно нет. Я рекомендую заменять лекционную часть Керниганом и Ричи. По тем вопросам которых там нет я запланировал несколько похожих на лекции допсеминаров.
Сразу же к указателям и ассертам :) Я так понял курс для тех, кто уже знаком с программированием. Интересно было послушать.
Хочется еще придраться что вывод не на stderr)
Я пока не объяснял файловый вывод, это будет позже.
Спасибо.
Добрый день! Спасибо за лекции. Кажется алгоритм на 39:42 некоторые случаи не учитывает. Если b
С таким преподом я бы точно не прогуливал пары
Смотреть уроки с "Базового курса по С++" не так кофортно, ибо присутствует чувство, что что-то прошло мимо тебя (но эти студенты в видео понимают о чём речь).
Так что да здравствует consistency!
полез углюбится в С++ но пришлось учить заново С
Большое спасибо за то, что Вы делаете.
Подскажите, пожалуйста, какие разделы математики необходимо изучить , чтобы понимать и математические кейсы в курсе?
Я правильно понимаю, что на 16:29 ошибка на доске с перенаправлением стрелки? *pa = b должно быть pa = &b, и тогда уже *pa = 3 запишет 3 в b
На доске для студентов было правильно, я при подготовке видео ошибся. Спасибо, добавлю в errata.
@@tilirещё на 14:33 в коментариях фигурирует *pa == 1 и *pa == 2, хотя определялся только указатель int *p = &a;
@@weerbox да должно быть pa
Можно больше сделать уроков по чистому си. ANSI C, если я не потаю...
Спасибо Константин за ваши видео, хотелось бы узнать все ли семинары по Практике языка С будут публиковатся на вашем канале ?
Надеюсь все если с продакшном справимся.
На слайде с суффиксами констант (на ~53:30) у "abc" указан тип const char[4] вместо char[4] (мы всё-таки в C, а не в C++ :))
Фактически это readonly то есть const. То что по стандарту он трактуется как char[4] это забавный бюрократический выверт, не более того.
Константин Игоревич, Вы будете где-либо дублировать семинары в случае блокировки\тотального замедления youtyb'а?
У себя в тг всё написал: t.me/cpp_lects_rus/185
Очень интересно и позновательно. Спасибо! Единственный негативный осадок остался от gdb.
1:02:45 не удается запустить отладчик :
warning: opening /proc/PID/mem file for lwp 40.40 failed: No such file or directory (2)
Cannot insert breakpoint 1.
Cannot access memory at address 0x80011fa
Патчи по типу echo -ne '\x90\x90' | sudo dd of=/usr/bin/gdb seek=$((0x335bad)) bs=1 count=2 conv=notrunc - так же ситуацию не решают =(
Да это известная проблема.
Обычно если не хочется грязных хаков помогает просто пересборка GDB
github.com/microsoft/WSL/issues/8516#issuecomment-1526257546
Или ещё проще установка из PPA:
github.com/microsoft/WSL/issues/8516#issuecomment-1762849202
Переменную q в скобках for можно объявлять. Это локальная для блока for переменная, и после цикла она не действительна
минута 51 - должно быть - начало отрицательного диапазона для int-а -(2^(x-1)) , на видео -(2^(x-1) - 1). Длина отрицательного диапазона числа равна длине положительного плюс ноль (то есть длиннее чем чисто положительного)
Да спасибо в комментах уже обсуждали. Пока что это сознательное упрощение. Мы дойдём до тонкостей и последствий кодировки целых и плавающих чисел довольно скоро.
недавно просматривал семинар, стало интересно про работу на бакалавра Марка. у него канал свой есть. было бы интересно послушать что это и где применяется икак работает.
Канала у Марка нет. Дипломная работа у него была по улучшению работы с индуктивностями, патч залит в LLVM, пользуется ну хм... весь мир примерно . Но я боюсь если вы не эксперт по компиляторам то читать его диплом вам будет тяжеловато.
Здравствуйте, а люди с улицы могут присоединиться к контестам? Просто 43:45 как бы намекает )
Пока что да. Если их закроют я что нибудь придумаю.
@@tilir Ого, ничего себе! Вы не против, если я посдаю что-нибудь?
там в функции gcd должен не сам y возвращаться, а iabs(y)
при вводе 14 -2 выдаёт -2
А не подскажете , изучаю лекции Дербышевой Т.Н. из МФТИ, подойдут ли они к этому практикуму ?
Видео супер! Планируется ли в будущем курс по библиотекам c++? например как правильно работать с QT?
После 10 слайда возник вопрос: когда всё таки правильно использовать abort() а не тот же exit(). И можно ли давать функциям возможность закрывать программу, в даном случае я бы возвращал код ошибки в read_inputs и в main вызывал abort() на основание кода.
Насчёт проблем abort я буду говорить когда буду говорить о разработке библиотек. Пока что заставлять обвешиваться лапшой ифов не гуманно: это просто один бинарник, ему некому прокидывать возврат.
Выбор между abort, _Exit и exit надо бы проговорить, раньше в этом курсе не было. Я подумаю куда включить, спасибо за идею.
Ассемблер пожалуйста❤
Ждем ассемблер
Будет в этом курсе во втором семестре.
@@tilir как подарок на Новый год!) Спасибо большое)
С++ Россия: назад к базовой базе)))
Это не курс по C++. Мы там будем дальше уходить в ассемблер и всё такое.
@@tilir ну и хорошо. Всё равно много всякого на PIC12, PIC16 и других "убогих" камнях делается, а там кроме с90-99 ничерта нет.
Было бы вообще отлично, если бы все команды используемые для работы в VIM были записаны на отдельном слайде или в комментариях!
Или в инструкции к виму? ))
@@tilir Требовать невозможно, т.к. курс бесплатный. Просто лезть в интернет и искать инструкцию, когда засел проходить урок по видео только лишь сбивает с толку.
П.С. Спасибо вам за уроки.
Получается, что не только % ведет себя иначе, но и /
По Евклиду -8 / 6 = -2 с остатком 4
По си -8 / 6 = -1 c остатком -2
Вы совершенно правы ))
Эх, Константин Игоревич. Если бы мне в своё время Вячеслав Юрьевич так же доходчиво объяснял бы специфику указателей в Си. Я, конечно, потом всё уяснил. Но так не хватало лекций подобного плана.
Вячеслав Юрьевич это, если не секрет, кто?
Да не суть важно. Мне бы оказаться на ваших лекциях 20 лет назад...
Интересно стало, а Вы нарочно в gdb не пользуетесь словом start? Или вы хотели показать, что можно указывать имена функций при установке breakpoint?
Второе. Я хотел показать break. Объяснить потом что start = b main + r куда проще.
Константин Игоревич, скажите, пожалуйста, почему в функции "int gcd(int x, int y)" мы предполагаем, что второй аргумент не равен нулю? Ведь по определению: НОД(x,0) равен 0, если x
Это странное определение. Если x < 0 то НОД не нулевой, например НОД(-2, -4) = 2. Случай x = 0 я вычеркиваю для простоты. Для программиста 0 это не делитель ))
Хорошо, спасибо!
А cmake будет на этом практическом курсе?
Будет серия допсеминаров по консоли и сборке если студенты захотят. Если проведем тоже выложу ))
@@tilir Большущее спасибо, что так оперативно отвечайте на вопросы в ютубе. Я даже себе представить не могу как вы на все это находите время. Дай бог, чтобы ваши студенты захотели. Еще вопрос, в МФТИ нету заочки или онлайн курсов по С/С++?
Такой вопрос, почему вы вызываете abort() при ошибки в функции ввода вместо кода возврата? Чтобы не возвращаться в main и сразу выйти из программы?
Для простоты, это всё-таки первое занятие. Педагогическая стратегия такая: на первом занятии учим детей использовать abort, потом до конца магистратуры отучаем. Те, кого удаётся отучить, становятся программистами ))
Здравствуйте! Домашние задания это внутренний ресурс только для студентов, или не-студентам тоже можно зарегистрироваться посмотреть?
Открыто пока что для всех. Ссылка в описании.
Подскажите, где можно найти задачи? В контесте на eJudge пишут: server is not available. Есть ли возможность как то порешать контесты?)
Я это не контролирую. Но если что всё выложено тут: github.com/tilir/c-graduate/tree/master/coursework/contests
Просто без удобного интерфейса.
И я на последнем семинаре как раз кинул клич: кто может помочь поднять более стабильные контесты, welcome.
Константин, а какая мотивация пользоваться if & endif вместо комментария? И то и то насколько мне известно убирается препроцессором.
Сам вижу возможный аргумент, что добавление/удаление комментария рушат историю в гите и засоряют блейм, а других аргументов привести не могу
Спасибо за лекцию!
Комментарии созданы для комментирования. Для условного отключения коды созданы директивы условного отключения кода. Мы просто используем инструменты по назначению.
А как несколько кусков кода не связанных друг с другом убрать из компиляции? #if 0 #endif в нескольких местах компилятору не понравилось.
Сделайте минимальное вопроизведение на годболте я бы глянул.
А контесты доступны для всех, или только для студентов? Не могу разобраться как их найти.
Пока что всем доступны. Ссылка в описании. Обратите внимание: http.
Если реализовывать алгоритм Евклида для очень больших чисел, то их сначала надо как-то научиться хранить? А в C это удобно делать?
Есть почти стандартные решения, такие как gmp.
не слышно что отвечает зал:(
На 14 слайде, утверджений a = max(n | (n/x)∧(n/y)) верно ли оно? Мы же ищем наибольший общий целый делитель что делит x и y ( max(n | (x/n)∧(y/n)) ?
Запись n \ x читается как "n делит x" и на 14-м слайде max(n | (n\x)∧(n\y)) слеши в другую сторону.
увы, но доступ к задачнику отсутствует... по поиску аналогично - nothing found
У вас в адресной строке https скорее всего. Сделайте http.
@@tilir спасибо большое! Все верно, теперь можно и задачи порешать 😏
не подскажите как перейти к контесту, до этого начинал решать, а теперь не могу снова зайти
Есть в описании видео: olymp1.vdi.mipt.ru/
я понял в чем была проблема, переходя по ссылке у меня все равно открывался https, а не http, будьте внимательнее, если у кого то так же
Чему равен iabs() от INT_MIN ?
Да я упоминаю несимметриченость int. Но ещё раз -- пока рано обращать на это особое внимание. Мы пока что считаем что int это от -(2^n-1) до (2^n-1). Детали последуют в развитии курса.
Какой уровень, для кого семинар?
Написано же: "Практические занятия по языку C на первом курсе МФТИ. Кафедра информатики."
База
Кто-нибудь дайте логин пасс, хочется делать дз(
Регистрация открытая.
А почему просто тупо при поиске НОД сразу не брать числа по модулю, а проверять только на 0? Меньше гимора.
Уточните пожалуйста в чём идея?
@@tilir идея в том, что при поиске наибольшего общего искать НОД не для введенных значений, а от их модулей. Ведь для его поиска знак не имеет значение. Останется только проверка на 0, что можно сделать типа if(x==0|y==0) return 1
Последний студент так и сделал по факту. Но там есть неприятный момент в связи с тем, что тип инт маргинально несимметричный. И тогда будет ошибка. Но ее можно избежать одной проверкой.
uint64_t красивее чем unsigned long long int
Пожалуйста не используйте типы с фиксированной длиной без точного обоснования их применения. Есть ситуации когда они нужны, но выбором по умолчанию должны быть обычные типы. Язык задуман и построен вокруг них.
@@tilir В программирование под микроконтроллеры использование типов фиксированной длины довольно частая практика. Ну и кажется что для переносимости кода это тоже одно из правил.
откуда появилось foo ?
Прошу, произведите переезд на rutube. Да сдохнет ютуб!!!!!
Вообще то мой канал есть на рутубе. Увы меня там не смотрят. Тот же самый бакалаврский курс который здесь набирает 100к там набирает типа 200 просмотров всего.