Практика языка C (МФТИ, 2023-2024). Семинар 1.1. Алгоритм Евклида.
Вставка
- Опубліковано 2 чер 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 такой курс уже есть
Трехкратное "УРА" в честь выхода курса по Сям🥳🥳🥳. Огромное спасибо автору
как же не хватало подобных лекций лет 20 назад....
Искренняя благодарность Константину Игоревичу за великолепные лекции! Смотрю на одном дыхании.
Константин Игоревич, большое спасибо за то что делитесь знаниями, с обычными зрителями из глубинки!
Спасибо за то, что снимаете!
Безумно рад новым видео на канале! Спасибо!
Я ждал этого курса все лето, ураа!!)
спасибо вам большое, пожалуйста, не останавливайтесь
Круто!
От души!!! Я не верил, что такое может быть) но надеялся) спасибо!🎉😂
Еее! А вот и классика подъехала)
Константин Игоревич, спасибо, было интересно и познавательно!
Спасибо за курс!
родная сишечка, как же я ждала
реально курс по C? это сон?
лучший подарок на др, спасибо
Контента такого уровня на ютубе нет .
Спасибо .
Класс, супер лектор
Так мало курсов по чистому С, огромное спасибо! С первых минут видео ясно, что курс будет стоящий!
Ютуб в последнее время рекомендует хорошие вещи 😮
Спасибо большое за видеозаписи с курса!
14:51 слайд 8 сначала указатель назван p, а затем используется pa
Миллион тысяч лайков!
часто в последнее время залезаю в исходники PostgreSQL и решил все-таки почитать про C и вот тут такой полезный плейлист! спасибо автору, очень выразительно, точно и компактно излагает материал.
Было бы вообще отлично, если бы все команды используемые для работы в VIM были записаны на отдельном слайде или в комментариях!
Видео супер! Планируется ли в будущем курс по библиотекам c++? например как правильно работать с QT?
Спасибо.
Большое спасибо за то, что Вы делаете.
Подскажите, пожалуйста, какие разделы математики необходимо изучить , чтобы понимать и математические кейсы в курсе?
Смотреть уроки с "Базового курса по С++" не так кофортно, ибо присутствует чувство, что что-то прошло мимо тебя (но эти студенты в видео понимают о чём речь).
Так что да здравствует consistency!
Ой йой йой, как здорово! Курс по С это шикарно, спасибо вам большое! Интересно, а к лекционной части будет доступ на UA-cam?
Увы лекции читаю не я. Не знаю пишутся ли они, вероятно нет. Я рекомендую заменять лекционную часть Керниганом и Ричи. По тем вопросам которых там нет я запланировал несколько похожих на лекции допсеминаров.
С таким преподом я бы точно не прогуливал пары
Можно больше сделать уроков по чистому си. ANSI C, если я не потаю...
50:00 слайд 29: диапазоны знаковых типов разве такие? Нижняя граница же -(2^n) - чётное число.
там в функции gcd должен не сам y возвращаться, а iabs(y)
при вводе 14 -2 выдаёт -2
Сразу же к указателям и ассертам :) Я так понял курс для тех, кто уже знаком с программированием. Интересно было послушать.
Хочется еще придраться что вывод не на stderr)
Я пока не объяснял файловый вывод, это будет позже.
Спасибо Константин за ваши видео, хотелось бы узнать все ли семинары по Практике языка С будут публиковатся на вашем канале ?
Надеюсь все если с продакшном справимся.
51:30, опечатка на слайде 29 диапазон целых знаковых типов от -2^{x-1} до 2^{x-1} - 1, а не от -(2^{x-1} -1) - т.е. отрицательных значений на одно больше чем положительных. Позже (1:21:10) кстати упоминается что инт ассиметричен.
Вспомнился в какой-то книжке по ассемблеру пример кода (которым автор очень гордился), который вычислял abs за две x86 команды - изменить знак (neg) и условный переход на предыдущую команду если результат предыдущей команды отрицателен (вроде js, но могу и ошибаться за давностью лет). Разумеется на минимальных числах он зацикливался, потому что там neg всегда возвращал отрицательный результат.
Да всё так. Я убрал с этого слайда асимметричность целых для простоты. Но она действительно есть. У нас будет (не скоро) занятие где мы будем специально говорить о кодировках для int, float и других типов и о трюках с этими кодировками вроде быстрого приближённого логарифма и т.п.
Добрый день! Спасибо за лекции. Кажется алгоритм на 39:42 некоторые случаи не учитывает. Если b
Переменную q в скобках for можно объявлять. Это локальная для блока for переменная, и после цикла она не действительна
минута 51 - должно быть - начало отрицательного диапазона для int-а -(2^(x-1)) , на видео -(2^(x-1) - 1). Длина отрицательного диапазона числа равна длине положительного плюс ноль (то есть длиннее чем чисто положительного)
Да спасибо в комментах уже обсуждали. Пока что это сознательное упрощение. Мы дойдём до тонкостей и последствий кодировки целых и плавающих чисел довольно скоро.
После 10 слайда возник вопрос: когда всё таки правильно использовать abort() а не тот же exit(). И можно ли давать функциям возможность закрывать программу, в даном случае я бы возвращал код ошибки в read_inputs и в main вызывал abort() на основание кода.
Насчёт проблем abort я буду говорить когда буду говорить о разработке библиотек. Пока что заставлять обвешиваться лапшой ифов не гуманно: это просто один бинарник, ему некому прокидывать возврат.
Выбор между abort, _Exit и exit надо бы проговорить, раньше в этом курсе не было. Я подумаю куда включить, спасибо за идею.
Ассемблер пожалуйста❤
Константин, а какая мотивация пользоваться if & endif вместо комментария? И то и то насколько мне известно убирается препроцессором.
Сам вижу возможный аргумент, что добавление/удаление комментария рушат историю в гите и засоряют блейм, а других аргументов привести не могу
Спасибо за лекцию!
Комментарии созданы для комментирования. Для условного отключения коды созданы директивы условного отключения кода. Мы просто используем инструменты по назначению.
Константин Игоревич, скажите, пожалуйста, почему в функции "int gcd(int x, int y)" мы предполагаем, что второй аргумент не равен нулю? Ведь по определению: НОД(x,0) равен 0, если x
Это странное определение. Если x < 0 то НОД не нулевой, например НОД(-2, -4) = 2. Случай x = 0 я вычеркиваю для простоты. Для программиста 0 это не делитель ))
Хорошо, спасибо!
недавно просматривал семинар, стало интересно про работу на бакалавра Марка. у него канал свой есть. было бы интересно послушать что это и где применяется икак работает.
Канала у Марка нет. Дипломная работа у него была по улучшению работы с индуктивностями, патч залит в LLVM, пользуется ну хм... весь мир примерно . Но я боюсь если вы не эксперт по компиляторам то читать его диплом вам будет тяжеловато.
Получается, что не только % ведет себя иначе, но и /
По Евклиду -8 / 6 = -2 с остатком 4
По си -8 / 6 = -1 c остатком -2
Вы совершенно правы ))
Интересно стало, а Вы нарочно в gdb не пользуетесь словом start? Или вы хотели показать, что можно указывать имена функций при установке breakpoint?
Второе. Я хотел показать break. Объяснить потом что start = b main + r куда проще.
Если реализовывать алгоритм Евклида для очень больших чисел, то их сначала надо как-то научиться хранить? А в 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
На 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)) слеши в другую сторону.
Очень интересно и позновательно. Спасибо! Единственный негативный осадок остался от 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
А как несколько кусков кода не связанных друг с другом убрать из компиляции? #if 0 #endif в нескольких местах компилятору не понравилось.
Сделайте минимальное вопроизведение на годболте я бы глянул.
Эх, Константин Игоревич. Если бы мне в своё время Вячеслав Юрьевич так же доходчиво объяснял бы специфику указателей в Си. Я, конечно, потом всё уяснил. Но так не хватало лекций подобного плана.
Вячеслав Юрьевич это, если не секрет, кто?
На слайде с суффиксами констант (на ~53:30) у "abc" указан тип const char[4] вместо char[4] (мы всё-таки в C, а не в C++ :))
Фактически это readonly то есть const. То что по стандарту он трактуется как char[4] это забавный бюрократический выверт, не более того.
А cmake будет на этом практическом курсе?
Будет серия допсеминаров по консоли и сборке если студенты захотят. Если проведем тоже выложу ))
@@tilir Большущее спасибо, что так оперативно отвечайте на вопросы в ютубе. Я даже себе представить не могу как вы на все это находите время. Дай бог, чтобы ваши студенты захотели. Еще вопрос, в МФТИ нету заочки или онлайн курсов по С/С++?
Здравствуйте, а люди с улицы могут присоединиться к контестам? Просто 43:45 как бы намекает )
Пока что да. Если их закроют я что нибудь придумаю.
@@tilir Ого, ничего себе! Вы не против, если я посдаю что-нибудь?
не слышно что отвечает зал:(
Чему равен iabs() от INT_MIN ?
Да я упоминаю несимметриченость int. Но ещё раз -- пока рано обращать на это особое внимание. Мы пока что считаем что int это от -(2^n-1) до (2^n-1). Детали последуют в развитии курса.
С++ Россия: назад к базовой базе)))
Это не курс по C++. Мы там будем дальше уходить в ассемблер и всё такое.
@@tilir ну и хорошо. Всё равно много всякого на PIC12, PIC16 и других "убогих" камнях делается, а там кроме с90-99 ничерта нет.
База
увы, но доступ к задачнику отсутствует... по поиску аналогично - nothing found
У вас в адресной строке https скорее всего. Сделайте http.
@@tilir спасибо большое! Все верно, теперь можно и задачи порешать 😏
Ждем ассемблер
Будет в этом курсе во втором семестре.
@@tilir как подарок на Новый год!) Спасибо большое)
Кто-нибудь дайте логин пасс, хочется делать дз(
Регистрация открытая.
uint64_t красивее чем unsigned long long int
Пожалуйста не используйте типы с фиксированной длиной без точного обоснования их применения. Есть ситуации когда они нужны, но выбором по умолчанию должны быть обычные типы. Язык задуман и построен вокруг них.
@@tilir В программирование под микроконтроллеры использование типов фиксированной длины довольно частая практика. Ну и кажется что для переносимости кода это тоже одно из правил.
А почему просто тупо при поиске НОД сразу не брать числа по модулю, а проверять только на 0? Меньше гимора.
Уточните пожалуйста в чём идея?
@@tilir идея в том, что при поиске наибольшего общего искать НОД не для введенных значений, а от их модулей. Ведь для его поиска знак не имеет значение. Останется только проверка на 0, что можно сделать типа if(x==0|y==0) return 1
Последний студент так и сделал по факту. Но там есть неприятный момент в связи с тем, что тип инт маргинально несимметричный. И тогда будет ошибка. Но ее можно избежать одной проверкой.
откуда появилось foo ?