Нейросеть для кода C: лабораторная по строкам и ошибки новичков
Нейросеть для кода C полезна студенту, если просить не только программу, но и разбор по частям, ошибки новичков и проверку на своём примере. Три приёма.
Андрей
Преподаватель, научный редактор LibraChat
8 мин чтения
Сколько пробелов в строке «Hello 123»? Один. А сколько насчитает программа первокурсника, если он прочитал строку через `scanf("%s", str)`? Ноль, потому что `%s` останавливается на первом пробеле. Эту ошибку я вижу на каждом потоке. Нейросеть для кода C может её предупредить, если правильно попросить. Я преподаю программирование первому курсу, и за последний год у меня сложился набор из трёх приёмов. С ними чат даёт студенту работающую программу вместе с пониманием, почему она работает. Ниже приёмы, настоящий пример из LibraChat и таблица «до и после».
Одна только программа ничему не учит
Студент приносит лабораторную. Код компилируется, ответ правильный. Я спрашиваю: «Зачем здесь 101, а не 100?» Тишина. Код взят готовым, и студент видит его в первый раз вместе со мной.
Сначала я злился и пробовал запрещать чат на занятиях. Потом понял, что запрет ничего не даст: чат у студентов в кармане. Работает другое. Если нейросеть уже есть, пусть она объясняет, а не только пишет. Разница в одном абзаце запроса.
Для программ на C это особенно важно. Язык маленький, но коварный. Массив не знает своего размера, строка заканчивается невидимым символом, а ошибка с памятью не всегда роняет программу сразу. Студент, который не понимает этих вещей, будет ошибаться в каждой следующей лабораторной.
Приём первый: «объясни по частям, как студенту первого курса»
Эта фраза меняет ответ сильнее, чем кажется. Без неё чат пишет для того, кто уже знает язык. С ней объясняет, зачем нужна каждая строка, и делает это словами, которые первокурсник понимает.
Вот запрос, который я дал на занятии как образец:
Напиши программу на C для лабораторной: пользователь вводит строку длиной до 100 символов, программа считает в ней цифры, пробелы и латинские гласные буквы, только стандартная библиотека. Объясни код по частям для студента первого курса и перечисли ошибки, которые новички делают в таких задачах чаще всего.
Слова «только стандартная библиотека» тоже не случайны. На лабораторной нельзя подключать сторонние библиотеки, и студент должен видеть, что задача решается средствами самого языка.
Нейросеть для кода C в деле: строка на сто символов
Программа в ответе вышла на 44 строки: функция для проверки гласной и основной цикл. Объяснение шло по частям, и в нём было ровно то, что я сам рассказываю на лекции.
Про размер массива: `MAX_LEN` равен 101, а не 100, потому что последний байт строки всегда занят символом конца `'\0'`. Это ответ на мой вопрос «зачем 101», и теперь студент может его дать сам.
Про чтение строки: `fgets` читает не больше 100 символов вместе с пробелами и сама ставит `'\0'`. Если ввод короче, в конец попадает перевод строки. Его считать не нужно, он не цифра, не пробел и не гласная.
Про гласные: функция приводит заглавную букву к строчной через разность кодов и сравнивает с пятью буквами `a e i o u`. И отдельная оговорка, которую я ценю: русские «а», «е», «о» функция не считает, у них другие коды. Внешне буквы похожи, и студенты на этом спотыкаются.
Мне понравилось, что проверки написаны через диапазоны кодов, без `isdigit` и `tolower`. В ответе прямо объяснено почему: эти функции требуют приведения к `unsigned char`, иначе байт больше 127 даёт отрицательное число. Для первого курса это тонкость, но полезная.
Приём второй: проверь себя по списку ошибок
Вторая часть запроса — «перечисли ошибки, которые новички делают чаще всего». Этот список я использую как готовый материал для занятия. В ответе было 11 пунктов. Вот те, которые я встречаю у своих студентов постоянно:
`scanf("%s", str)` вместо `fgets`: пробелы всегда получаются нулём;
массив на 100 байт «на 100 символов», без места под `'\0'`;
счётчики не обнулены, и в них лежит мусор;
считаются только строчные гласные, а заглавные пропускаются;
`c == "a"` вместо `c == 'a'`: двойные кавычки — это строка, одинарные — один символ;
`isspace` вместо проверки `' '`, и в пробелы попадают табуляция и перевод строки.
Последний пункт я раньше не выделял отдельно. Теперь выделяю: студенты любят «умные» функции, не читая, что они считают.
Я делаю из этого списка короткую самопроверку. Перед сдачей студент проходит по пунктам и отмечает, какую ошибку у себя проверил. На это уходит 5 минут, а вопросов на защите становится заметно меньше.
Приём третий: свой пример на входе
Третий приём я добавил после того, как несколько раз принимал код, который работал только на одном примере. Просите у нейросети пример ввода и правильного ответа, а потом проверяйте программу на нём сами.
В нашем ответе такой пример был в конце: строка `Hello 123` даёт 3 цифры, 1 пробел и 2 гласные, `e` и `o`. Я проверил руками, буква за буквой, сходится.
Дальше студент придумывает свой пример, с подвохом. Я обычно предлагаю три:
Строка из одних пробелов.
Строка с заглавными гласными: `AEIOU`.
Строка с русскими буквами вперемешку с латинскими.
Если программа считает третью строку правильно, то есть не находит русских гласных, студент понял разницу между буквами и кодами. Это стоит больше, чем вся лабораторная.
До и после: какой запрос даёт студенту больше
Я сравниваю два запроса на одну и ту же задачу:
Что в запросе · Что получает студент
«Напиши программу, которая считает в строке цифры, пробелы, гласные» — код, который можно сдать, но нельзя защитить
+ «объясни по частям, как студенту первого курса» — понимание каждой строки: зачем 101, что делает `fgets`
+ «перечисли ошибки новичков» — список для самопроверки перед сдачей
+ пример ввода и ответа — способ убедиться, что программа работает не только на одном примере
Разница между первой и последней строкой — один абзац текста. А разница на защите огромная. Студент с полным запросом отвечает на мои вопросы, студент с коротким молчит.
Где нейросеть для кода C не заменит преподавателя
Нейросеть объясняет хорошо, но не знает требований вашей кафедры. Если преподаватель требует определённый стиль, комментарии к каждой функции или запрет на глобальные переменные, это надо писать в запросе. Чат не угадает.
Второе. Код из чата — материал для разбора, а не готовая сдача. Я прямо говорю студентам: если вы не можете объяснить строку, вы не сдали лабораторную, кто бы её ни написал. Нейросеть помогает понять быстрее, но понимать всё равно придётся самому.
Третье. Компилятор проверяет надёжнее, чем глаза. Код из ответа надо скомпилировать и запустить на своих примерах. Если что-то не так, сообщение компилятора можно вставить в тот же чат и спросить, что оно значит.
Шаблон: нейросеть для кода C на любую лабораторную
После пары семестров я собрал запрос в шаблон. Студенты копируют его и меняют только условие в квадратных скобках:
Напиши программу на C для лабораторной: [условие задачи]. Только стандартная библиотека. Объясни код по частям для студента первого курса, перечисли ошибки, которые новички делают в таких задачах чаще всего, и дай два примера ввода с правильным ответом.
Раньше я давал студентам длинную памятку на две страницы о том, как спрашивать. Её никто не читал. Шаблон из трёх предложений читают все, потому что его не надо читать, его надо скопировать.
В шаблон можно добавить требования кафедры одной строкой: «без глобальных переменных», «каждая функция с комментарием», «ввод проверять на ошибки». Каждое требование, записанное заранее, избавляет от одной правки после. Я однажды попробовал дать шаблон без строки про примеры ввода, и в 3 работах из 10 программа ломалась на пустой строке. Со строкой про примеры студенты стали проверять пустой ввод сами.
Если лабораторная не по программированию, а по физике или химии, есть отдельная статья: нейросеть для лабораторной.
Маленькое задание
Три приёма, объяснение по частям, список ошибок новичков и свой пример на входе, превращают чат из генератора кода в репетитора.
Задание на сегодня. Попробуй взять свою ближайшую лабораторную на C и открой чат LibraChat. Скопируй этот промпт из статьи, замени условие на своё и не убирай последнюю фразу про ошибки новичков. Потом придумай одну строку с подвохом и проверь программу на ней. Если всё сошлось и ты можешь объяснить каждую строку соседу, лабораторная твоя. Для такой работы подписка не обязательна; тарифы, если понадобятся, здесь.
нейросеть для кода cязык cлабораторнаяпервый курсfgetsучёба