Практика языка C (МФТИ, 2023-2024). Семинар 1.1. Алгоритм Евклида.
HTML-код
- Опубликовано: 14 июн 2024
- Практические занятия по языку C на первом курсе МФТИ. Кафедра информатики.
На этом семинаре мы познакомимся с языком C, научимся писать простые функции и циклы и решим первые простые задачи.
Семинарист: Константин Владимиров.
Дата: 1 сентября 2023 года.
Съёмка: Марк Гончаров
Звук: Юлий Тарасов.
Предыдущий семинар: нет, это первый семинар
Следующий семинар: • Практика языка C (МФТИ...
Слайды к занятиям: cs.mipt.ru/wp/?page_id=7775
Примеры кода: github.com/tilir/c-graduate
Задачник: olymp1.vdi.mipt.ru/
Timeline
00:00 Hello, world!
12:27 Частное и остаток
28:50 Наибольший общий делитель
42:30 Время программировать
47:50 Типы данных
57:30 Отладка программ
01:12:40 Ревью кода студентов
Errata:
* около седьмой минуты я говорю "функция hello world", конечно имелась в виду программа, оговорка.
* На 16:29 разумеется pa = &b
Отличный препод!
1. Врубается в тему.
2. Норм относится к своим ученикам.
3. Умеет донести до своих учеников знания.
Спасибо!
🙏
Никто не верил, но курс по С появился, Спасибо!
Ахахахах, при чем, большиснтво ожидавших - зрители курса по C++)
@@napalm20005 такой курс уже есть
Трехкратное "УРА" в честь выхода курса по Сям🥳🥳🥳. Огромное спасибо автору
Искренняя благодарность Константину Игоревичу за великолепные лекции! Смотрю на одном дыхании.
Спасибо огромное за то, что выкладываете подобные семинары. Очень приятно и поучительно Вас слушать.
Константин Игоревич, большое спасибо за то что делитесь знаниями, с обычными зрителями из глубинки!
Спасибо за то, что снимаете!
Контента такого уровня на ютубе нет .
Спасибо .
От души!!! Я не верил, что такое может быть) но надеялся) спасибо!🎉😂
Так мало курсов по чистому С, огромное спасибо! С первых минут видео ясно, что курс будет стоящий!
Константин Игоревич, спасибо, было интересно и познавательно!
Ютуб в последнее время рекомендует хорошие вещи 😮
реально курс по C? это сон?
лучший подарок на др, спасибо
Безумно рад новым видео на канале! Спасибо!
спасибо вам большое, пожалуйста, не останавливайтесь
как же не хватало подобных лекций лет 20 назад....
Я ждал этого курса все лето, ураа!!)
Спасибо за курс!
часто в последнее время залезаю в исходники PostgreSQL и решил все-таки почитать про C и вот тут такой полезный плейлист! спасибо автору, очень выразительно, точно и компактно излагает материал.
родная сишечка, как же я ждала
Круто!
Еее! А вот и классика подъехала)
Класс, супер лектор
Спасибо большое за видеозаписи с курса!
14:51 слайд 8 сначала указатель назван p, а затем используется pa
Миллион тысяч лайков!
Было бы вообще отлично, если бы все команды используемые для работы в VIM были записаны на отдельном слайде или в комментариях!
С таким преподом я бы точно не прогуливал пары
Спасибо.
Смотреть уроки с "Базового курса по С++" не так кофортно, ибо присутствует чувство, что что-то прошло мимо тебя (но эти студенты в видео понимают о чём речь).
Так что да здравствует consistency!
Ой йой йой, как здорово! Курс по С это шикарно, спасибо вам большое! Интересно, а к лекционной части будет доступ на RUclips?
Увы лекции читаю не я. Не знаю пишутся ли они, вероятно нет. Я рекомендую заменять лекционную часть Керниганом и Ричи. По тем вопросам которых там нет я запланировал несколько похожих на лекции допсеминаров.
Видео супер! Планируется ли в будущем курс по библиотекам c++? например как правильно работать с QT?
Большое спасибо за то, что Вы делаете.
Подскажите, пожалуйста, какие разделы математики необходимо изучить , чтобы понимать и математические кейсы в курсе?
Сразу же к указателям и ассертам :) Я так понял курс для тех, кто уже знаком с программированием. Интересно было послушать.
Хочется еще придраться что вывод не на stderr)
Я пока не объяснял файловый вывод, это будет позже.
Можно больше сделать уроков по чистому си. ANSI 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 и других типов и о трюках с этими кодировками вроде быстрого приближённого логарифма и т.п.
Спасибо Константин за ваши видео, хотелось бы узнать все ли семинары по Практике языка С будут публиковатся на вашем канале ?
Надеюсь все если с продакшном справимся.
там в функции gcd должен не сам y возвращаться, а iabs(y)
при вводе 14 -2 выдаёт -2
50:00 слайд 29: диапазоны знаковых типов разве такие? Нижняя граница же -(2^n) - чётное число.
Добрый день! Спасибо за лекции. Кажется алгоритм на 39:42 некоторые случаи не учитывает. Если b
Переменную q в скобках for можно объявлять. Это локальная для блока for переменная, и после цикла она не действительна
недавно просматривал семинар, стало интересно про работу на бакалавра Марка. у него канал свой есть. было бы интересно послушать что это и где применяется икак работает.
Канала у Марка нет. Дипломная работа у него была по улучшению работы с индуктивностями, патч залит в LLVM, пользуется ну хм... весь мир примерно . Но я боюсь если вы не эксперт по компиляторам то читать его диплом вам будет тяжеловато.
Ассемблер пожалуйста❤
После 10 слайда возник вопрос: когда всё таки правильно использовать abort() а не тот же exit(). И можно ли давать функциям возможность закрывать программу, в даном случае я бы возвращал код ошибки в read_inputs и в main вызывал abort() на основание кода.
Насчёт проблем abort я буду говорить когда буду говорить о разработке библиотек. Пока что заставлять обвешиваться лапшой ифов не гуманно: это просто один бинарник, ему некому прокидывать возврат.
Выбор между abort, _Exit и exit надо бы проговорить, раньше в этом курсе не было. Я подумаю куда включить, спасибо за идею.
минута 51 - должно быть - начало отрицательного диапазона для int-а -(2^(x-1)) , на видео -(2^(x-1) - 1). Длина отрицательного диапазона числа равна длине положительного плюс ноль (то есть длиннее чем чисто положительного)
Да спасибо в комментах уже обсуждали. Пока что это сознательное упрощение. Мы дойдём до тонкостей и последствий кодировки целых и плавающих чисел довольно скоро.
Получается, что не только % ведет себя иначе, но и /
По Евклиду -8 / 6 = -2 с остатком 4
По си -8 / 6 = -1 c остатком -2
Вы совершенно правы ))
Константин, а какая мотивация пользоваться if & endif вместо комментария? И то и то насколько мне известно убирается препроцессором.
Сам вижу возможный аргумент, что добавление/удаление комментария рушат историю в гите и засоряют блейм, а других аргументов привести не могу
Спасибо за лекцию!
Комментарии созданы для комментирования. Для условного отключения коды созданы директивы условного отключения кода. Мы просто используем инструменты по назначению.
Интересно стало, а Вы нарочно в 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 это не делитель ))
Хорошо, спасибо!
Эх, Константин Игоревич. Если бы мне в своё время Вячеслав Юрьевич так же доходчиво объяснял бы специфику указателей в Си. Я, конечно, потом всё уяснил. Но так не хватало лекций подобного плана.
Вячеслав Юрьевич это, если не секрет, кто?
Если реализовывать алгоритм Евклида для очень больших чисел, то их сначала надо как-то научиться хранить? А в C это удобно делать?
Есть почти стандартные решения, такие как gmp.
Я правильно понимаю, что на 16:29 ошибка на доске с перенаправлением стрелки? *pa = b должно быть pa = &b, и тогда уже *pa = 3 запишет 3 в b
На доске для студентов было правильно, я при подготовке видео ошибся. Спасибо, добавлю в errata.
@@tilirещё на 14:33 в коментариях фигурирует *pa == 1 и *pa == 2, хотя определялся только указатель int *p = &a;
@@weerbox да должно быть pa
А cmake будет на этом практическом курсе?
Будет серия допсеминаров по консоли и сборке если студенты захотят. Если проведем тоже выложу ))
@@tilir Большущее спасибо, что так оперативно отвечайте на вопросы в ютубе. Я даже себе представить не могу как вы на все это находите время. Дай бог, чтобы ваши студенты захотели. Еще вопрос, в МФТИ нету заочки или онлайн курсов по С/С++?
На 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)) слеши в другую сторону.
А как несколько кусков кода не связанных друг с другом убрать из компиляции? #if 0 #endif в нескольких местах компилятору не понравилось.
Сделайте минимальное вопроизведение на годболте я бы глянул.
База
Здравствуйте! Домашние задания это внутренний ресурс только для студентов, или не-студентам тоже можно зарегистрироваться посмотреть?
Открыто пока что для всех. Ссылка в описании.
Очень интересно и позновательно. Спасибо! Единственный негативный осадок остался от 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
На слайде с суффиксами констант (на ~53:30) у "abc" указан тип const char[4] вместо char[4] (мы всё-таки в C, а не в C++ :))
Фактически это readonly то есть const. То что по стандарту он трактуется как char[4] это забавный бюрократический выверт, не более того.
Здравствуйте, а люди с улицы могут присоединиться к контестам? Просто 43:45 как бы намекает )
Пока что да. Если их закроют я что нибудь придумаю.
@@tilir Ого, ничего себе! Вы не против, если я посдаю что-нибудь?
С++ Россия: назад к базовой базе)))
Это не курс по C++. Мы там будем дальше уходить в ассемблер и всё такое.
@@tilir ну и хорошо. Всё равно много всякого на PIC12, PIC16 и других "убогих" камнях делается, а там кроме с90-99 ничерта нет.
Чему равен iabs() от INT_MIN ?
Да я упоминаю несимметриченость int. Но ещё раз -- пока рано обращать на это особое внимание. Мы пока что считаем что int это от -(2^n-1) до (2^n-1). Детали последуют в развитии курса.
не слышно что отвечает зал:(
не подскажите как перейти к контесту, до этого начинал решать, а теперь не могу снова зайти
Есть в описании видео: olymp1.vdi.mipt.ru/
Ждем ассемблер
Будет в этом курсе во втором семестре.
@@tilir как подарок на Новый год!) Спасибо большое)
увы, но доступ к задачнику отсутствует... по поиску аналогично - nothing found
У вас в адресной строке https скорее всего. Сделайте http.
@@tilir спасибо большое! Все верно, теперь можно и задачи порешать 😏
откуда появилось foo ?
Кто-нибудь дайте логин пасс, хочется делать дз(
Регистрация открытая.
uint64_t красивее чем unsigned long long int
Пожалуйста не используйте типы с фиксированной длиной без точного обоснования их применения. Есть ситуации когда они нужны, но выбором по умолчанию должны быть обычные типы. Язык задуман и построен вокруг них.
@@tilir В программирование под микроконтроллеры использование типов фиксированной длины довольно частая практика. Ну и кажется что для переносимости кода это тоже одно из правил.
А почему просто тупо при поиске НОД сразу не брать числа по модулю, а проверять только на 0? Меньше гимора.
Уточните пожалуйста в чём идея?
@@tilir идея в том, что при поиске наибольшего общего искать НОД не для введенных значений, а от их модулей. Ведь для его поиска знак не имеет значение. Останется только проверка на 0, что можно сделать типа if(x==0|y==0) return 1
Последний студент так и сделал по факту. Но там есть неприятный момент в связи с тем, что тип инт маргинально несимметричный. И тогда будет ошибка. Но ее можно избежать одной проверкой.